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

时间:2010-10-12 12:41:40

标签: algorithm database-design scheduling relational-database timetable

我知道几乎所有与RDBS中的时间表建模相关的内容都被告知,但我找不到任何关于在DB中存储时间表的可用技术的精心编写的文档。

我的情况:

  • 我有一张表,其中包含可用的地方,以及包含实际课程的表格。
  • 每个地方都有自己独特的时间表
  • 每个班级都可以在任何地方安排,任何时候,除了少数例外:
    • 一个班级可以占用一个时段(例如:如果A级安排在P1的12:00在1小时的持续时间,A类的下一次出现只能放在12:00之前或13:00之后,任何有空闲时段的地方;禁止在两个地方一次安排A级课程。)
    • 在一个地方,它可以是一个带时隙的课程
  • 模型应支持计划类的版本控制/历史记录

现在,我如何在SQL DB中表示此数据模型?

我没有准备好使用准确的架构,相反,如果有人能够编写可用的建模技术及其比较,我会很高兴,我可以用它来解决这个任务

例如:对于树结构/分层数据,有很好的文档“修改前序树遍历算法”,是否有一些类似的算法/技术来处理时隙?

2 个答案:

答案 0 :(得分:1)

时间表是一个矩阵。在左手边,我们有LOCATIONS。在顶部,我们有TIMESLOTS。 LOCATION和TIMESLOT的任何给定排列的交集是具有CLASS或null的单元格。

为了对此进行建模,我们需要LOCATIONS的表(实体),这是非常固定的数据。我们需要一张不断增长的TIMESLOTS(日期/时间)表。我们需要一个表CLASSES,它也很固定。最后我们需要一个交集表CLASS_TIMESLOT_LOCATIONS。这就是魔术发生的地方。该表有三个外键,一个到CLASSES,一个到LOCATIONS,一个到TIMESLOTS。它的主键是(LOCATION_ID,TIMESLOT_ID),但它也需要一个唯一的约束(CLASS_ID,TIMESLOT_ID)。


您正在询问建模问题,但您需要考虑一些实现详细信息。他们不会选择逻辑模型,但会影响您使用物理表的方式。首先考虑的是是否产生所有潜在的TIMESLOTS,如果是,则存储的窗口有多大。第二个是是否为交集表CLASS_TIMESLOT_LOCATIONS存储空条目。

这里没有直截了当的答案:一些数据库产品会发现比其他产品更容易“填补空白”。此外,在运行中生成缺席记录可能会造成太大的性能损失,在这种情况下,磁盘空间是一个很好的权衡。


至于存储历史,这可能是为了存储对时间表的更改。为此使用单独的表,由触发器填充(您可以使用存储过程,但触发器是行业标准)。不要试图在主表中存储历史记录。它打破了规范化的模型,引发了各种各样的悲痛。

答案 1 :(得分:0)

从我在您的问题中看到的情况看,您希望在数据库端处理几个约束。

•我有一个表,其中包含可用的位置,以及包含实际类的表。

可以在表格设计上详细说明,但这只需要一个表格模式来保存您需要的信息

•每个地方都有自己独特的时间表

如何在插入上创建触发器以确保插入到计划中的类不与任何其他计划冲突?

•每个班级都可以在任何地方,任何时间安排,除了少数例外: •一个班级可以占用一个时段(例如:如果A级安排在P1的12:00在1小时的持续时间,A级的下一次出现只能在12:00之前或13:00之后,在任何地方,女巫有自由时间段;禁止在两个地方一次安排A班)

我也会在触发器中处理这个约束

•在一个地方,它可以是一个带时隙的课程

在触发器中处理此约束

•模型应支持计划类的版本控制/历史记录

有一个单独的表,它反映了您对计划的实际表。当新记录插入主表时,您可以触发更新/插入/删除的更新和时间到具有历史记录的表中

希望这有助于你提出一些想法。

-Vijay