我已经见过几次此类问题,并且正在尝试确定以非重叠方式存储范围的最佳方式。例如,当调度某种一次只有一个人可以使用的资源时。我所看到的大多是这样的:
PERSON ROOM START_TIME END_TIME
Col. Mustard Library 08:00 10:00
Prof. Plum Library 10:00 12:00
防止新条目与现有时间表重叠的最佳方法是什么,例如,如果斯嘉丽小姐想在 11:00 到 11:30 之间预订图书馆?内联约束不起作用,我认为这不能在触发器中轻松完成。处理所有最初在表中查找现有冲突的插入的过程?
其次,处理并发问题的最佳方法是什么?假设斯嘉丽小姐想要在 13:00 到 15:00 之间去图书馆,而怀特夫人想要在 14:00 到 16:00 之间去图书馆。 (1) 中的程序会发现这两个时间表都是可接受的,但显然综合起来看,它们是不可接受的。我唯一能想到的是手动锁定表或某种互斥锁。
上表(房间、开始时间)的主键是什么?
对于有固定时间范围的情况,可以使用快速工作方式,您可以将所有范围存储在单独的表中,然后只需将其链接到“储备”表即可。它可以在固定范围内发挥作用,例如您可以仅以 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,并且数据库驱动的检查已准备就绪。它会很快,并且数据开销很小。然而,每一秒都使用相同的例程并不那么有效。
更通用和复杂的方法是让某个过程(或触发器)检查您的范围是否被占用,并且您将必须检查所有当前记录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)