4

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

我的情况:

  • 我有一张桌子,里面有可用的地方,还有一张有实际班级的桌子。
  • 每个地方都有自己独特的时间表
  • 每节课都可以安排在任何地方,任何时间,除了少数例外:
    • 一个班可以占用一个时间段(例如:如果A班安排在12:00的地点P1持续1小时,那么下一次A班只能安排在12:00之前或13:00之后,在任何地方,有空闲时间段;禁止两地同时安排A班)
    • 在一个地方它可以是一个有时间段的班级
  • 模型应支持预定课程的版本控制/历史记录

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

我不是在寻找现成的确切模式,而是如果有人可以编写可用的建模技术及其比较,我会很高兴,我可以用它来解决这个任务

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

4

2 回答 2

1

时间表是一个矩阵。在左侧,我们有位置。在顶部,我们有 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存储空条目。

这里没有直接的答案:一些数据库产品会发现比其他产品更容易“填补空白”。此外,动态生成缺少的记录可能会对性能造成太大影响,在这种情况下,磁盘空间是一个很好的权衡。


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

于 2010-10-12T12:57:21.083 回答
0

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

• 我有一张桌子,里面有空位,还有一张有实际班级的桌子。

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

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

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

• 每节课都可以安排在任何地点和任何时间,除了少数例外: • 一节课可以占用一个时间段(例如:如果 A 课安排在 P1 的 12:00 时长 1 小时,则下一节课A只能安排在12:00之前或13:00之后,在任何地方,女巫都有空闲时间段;禁止在两个地方同时安排A班)

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

• 在一个地方,它可以是一个有时间段的班级

在触发器中处理此约束

• 模型应支持预定课程的版本控制/历史记录

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

希望这可以帮助您提出一些想法。

-维杰

于 2010-10-12T13:00:28.400 回答