关系型数据库中的时间表建模

3

我知道关于在RDBS中建立时间表模型的内容已经被讲述得非常详细了,但我找不到任何有关存储时间表的可用技术的文档。

我的情况如下:

  • 我有一个保存可用位置的表格和一个保存实际课程的表格。
  • 每个位置都有自己独特的日程安排
  • 每个课程都可以在任何地方和任何时间进行安排,但有一些例外:
    • 一个课程只能占用一个时间段(例如:如果将A课程安排在P1地点的12:00时开始,持续1小时,那么下一次A课程只能在12:00之前或13:00之后,在任何有空闲时间段的地方安排;不允许在同一时间在两个地方安排A课程)
    • 在一个地方只能有一个带时间段的课程
  • 模型应支持已安排课程的版本控制/历史记录

现在,我该如何在SQL数据库中表示这个数据模型?

我不是在寻找现成的精确模式,而是希望有人能够编写可用的建模技术及其比较,以便我可以用来解决这个问题

例如:对于树形结构/分层数据,有一个被广泛记录的“修改前序树遍历算法”,是否有类似的算法/技术来处理时间段?

2个回答

1

时间表是一个矩阵。左侧是地点,上方是时间段。任何给定的地点和时间段的排列交叉点都是一个带有课程或空值的单元格。

为了建模,我们需要一个地点(实体)表,这是相当固定的数据。我们需要一个时间段(日期/时间)表,它是不断增长的。我们需要一个课程表,这也是相当固定的。最后,我们需要一个交叉表CLASS_TIMESLOT_LOCATIONS。这就是魔法发生的地方。这个表有三个外键,一个指向课程表,一个指向地点表,一个指向时间段表。它的主键是(LOCATION_ID,TIMESLOT_ID),但它还需要在(CLASS_ID,TIMESLOT_ID)上有一个唯一约束。


你正在提出一个建模问题,但是有一些实现细节需要考虑。它们不会改变逻辑模型,但会影响你如何处理物理表。第一个考虑因素是是否生成所有可能的TIMESLOTS,如果是,那么存储窗口有多大。第二个考虑因素是是否为交叉表CLASS_TIMESLOT_LOCATIONS存储空条目。
这里没有简单的答案:一些数据库产品会发现“填补空白”更容易,而其他产品则不然。此外,动态生成缺失记录可能会对性能造成太大的影响,在这种情况下,磁盘空间是一个很好的权衡。
关于存储历史记录,这很可能是为了存储日程更改。使用单独的表来实现,通过触发器进行填充(你可以使用存储过程,但触发器是行业标准)。不要被诱惑将历史记录存储在主表中。这会破坏规范化模型并引起各种问题。

我添加了实现细节,因为我无法用英语正确地解释我的意思;) 因此,我添加了这个更好的“线索”来说明我的意思。 - canni
@DariuzGorecki - 对不起,我并没有指责你。我只是在说我为什么加入了一些我的额外信息。 - APC

0
从您的问题中我所看到的,似乎您希望在数据库端处理几个约束条件。
• 我有一个表,用于保存可用场地,以及一个实际课程表的表。
可以详细阐述表格设计,但这只需要一个表模式来保存您需要的信息。
• 每个场地都有其独特的时间表。
如何创建一个插入触发器,以确保要插入时间表的课程不会与任何其他时间表冲突?
• 每个课程都可以安排在任何地方和任何时间,但有少量例外:
- 一个课程只能占用一个时间槽(例如:如果将课程A安排在12:00在P1场地进行1小时,下一次课程A只能在12:00之前或13:00之后,在任何有空闲时间槽的地方安排;禁止在两个地方同时安排课程A)
我也会在触发器中处理这个约束。
• 在一个地方只能有一个带有时间槽的课程。
在触发器中处理此约束。
• 模型应支持已安排课程的版本控制/历史记录。

建立一个独立的表格来镜像你实际拥有的日程表。当新记录被插入到主表时,你可以触发更新和插入/删除的时间,并将它们存储到历史表中。

希望这些想法对你有所帮助。

-Vijay


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接