6

我已经多次看到此类问题,并试图确定以非重叠方式存储范围的最佳方式。例如,在安排某种资源时,一次只能由一个人使用。我所看到的大多是这样的:

PERSON          ROOM        START_TIME      END_TIME
Col. Mustard    Library     08:00           10:00
Prof. Plum      Library     10:00           12:00
  1. 防止新条目与现有时间表重叠的最佳方法是什么,例如如果 Scarlet 小姐想从 11:00 到 11:30 预订图书馆?内联约束不起作用,我认为这不能在触发器中轻松完成。处理最初在表中查找现有冲突的所有插入的过程?

  2. 其次,处理并发问题的最佳方法是什么?假设 Scarlet 小姐在 13:00 到 15:00 之间想要图书馆,而 White 夫人在 14:00 到 16:00 之间想要图书馆。(1)中的过程会发现这两个时间表都可以接受,但很明显,它们不是。我唯一能想到的是手动锁定表或某种互斥锁。

  3. 上表的主键是什么(房间,开始时间)?

4

1 回答 1

5

对于具有固定时间范围的情况的快速工作方式,您可以将所有范围存储在单独的表中,然后简单地将其链接到“储备”表。它可以解决固定范围的问题,例如,您可以仅以 30 分钟的间隔保留库,工作时间从早上 8 点到晚上 8 点,只需要 24 条记录。

--Person table---------------
ID   PERSON         ROOM
1    Col. Mustart   Library
2    Proof. Plum    Library

--Timeshift table------------
ID   START_TIME   END_TIME
1    08:00        08:30
2    08:30        09:00
....
24   19:30        20:00

--Occupy table----
DATE            TIMESHIFT    PERSON
TRUNC(SYSDATE)   TS_ID        P_ID
08/12/2012         4           1
08/12/2012         5           1
08/12/2012         9           2 
08/12/2012         10          2 

现在您将其设为 PK 或 UK,并且您的数据库驱动检查已准备就绪。它会很快,而且数据开销很小。然而,每秒使用相同的例程不会那么有效。

更通用和复杂的方法是让一些程序(或触发器)检查,您的范围是否被占用,您必须检查所有当前记录。

于 2012-08-11T02:18:50.217 回答