处理非重叠范围的建议方法(例如,调度)

时间:2012-08-11 00:42:37

标签: database oracle concurrency constraints

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

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. 上面表格((房间,start_time)的主键是什么?

1 个答案:

答案 0 :(得分:4)

对于具有固定时间范围的情况的快速工作方式,您可以将所有范围存储在单独的表中,然后将其链接到“reserve”表。它可以为固定范围提供技巧,例如,您可以仅以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,你的数据库驱动检查就准备好了。它会很快,几乎没有数据开销。但是,每秒使用相同的例程并不是那么有效。

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