2012-08-11 223 views
5

我幾次看到過這類問題,並試圖以非重疊的方式決定存儲範圍的最佳方式。例如,調度某種資源時,一次只能有一個人使用。主要是我所看到的是這樣的:處理非重疊範圍的建議方法(例如調度)

PERSON   ROOM  START_TIME  END_TIME 
Col. Mustard Library  08:00   10:00 
Prof. Plum  Library  10:00   12:00 
  1. 什麼是防止重疊的現有計劃,好比說如果血色小姐想從11:00儲備庫,以新條目的最佳方式11:30?內聯約束不起作用,我不認爲這很容易在觸發器中完成。處理最初查找表中現有衝突的所有插入的過程?

  2. 其次,處理併發問題的最佳方法是什麼?再說,Scarlet小姐從13:00到15:00想要圖書館,White夫人想要從14:00到16:00。從(1)開始的程序會發現這兩個時間表都可以接受,但是明確地考慮在一起,它們不是。我能想到的唯一的事情就是手動鎖定表或某種互斥鎖。

  3. 以上表格(房間,start_time)的主鍵是什麼?對於情況下,如果你有固定的時間段

+0

可能重複[什麼是優化模式捕獲考勤數據的最佳方式](http://stackoverflow.com/questions/3193227/what-is-the-best-way-to-optimize-schema-for -capturing-attendance-data) – APC 2012-08-11 20:43:49

回答

4

快速的工作方式,你可以存儲在單獨的表中的所有範圍,然後簡單地將其鏈接到「儲量」表格。它可以爲固定的範圍做訣竅,例如,您可以僅以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或英國和你的數據庫驅動檢查已經準備就緒。它會很快,很少有數據開銷。然而,每秒鐘使用相同的例程將不會有效。

更普遍和複雜的方法是讓一些程序(或觸發器)檢查,是你的範圍佔用與否,你將不得不檢查所有當前記錄。

+0

+1,創建一個小的離散時間間隔表,並允許人們預訂很多。 – Ben 2012-08-11 09:31:14