2014-09-25 128 views
1

我正在研究預訂系統模式,並且在定義資源可用性時遇到了一些問題。我搜索了這裏類似的問題,並在谷歌,但仍然沒有清晰的認識預約系統設計

我的應用程序是用於預訂出租車。每個出租車司機都在今天工作或休息一天。到目前爲止,我想出了以下結構

table: Drivers 
id INT PRIMARY KEY 
name INT 

table: Users 
id INT PRIMARY KEY 
name TEXT 

table: Reservations 
id INT PRIMARY KEY 
start: DATETIME 
end: DATETIME 
userID: INT (FOREIGN KEY(Users.id)) 
driverID: INT (FOREIGN KEY(Drivers.id)) 

我想治療可用的每個驅動程序,如果沒有預約條目,然後想出不同類型的保留的:

不可用=>司機正在休息一天假期=>司機在開始/結束時間之間由用戶預訂取消=>取消預訂

但是,保持不可用/預訂狀態聽起來有點複雜,比我想。

那麼,有什麼建議,如何提高數據庫架構?

+0

這是非常標準的做法。駕駛員要麼不在(具有在預定表中指定的原因 - 假期,預訂等),或者他可用(不在表格中)。你可以擴展「保持不可用/預訂狀態聽起來比我想要更復雜一點」 - 什麼是實際問題。這是一個_good_想法擴展您的預約表包含所有不同類型的,因爲你可以添加到他們後,即生病了,沒車可用等和你說,你可以包括取消的標誌,以確定取消 – 2017-05-03 01:07:38

回答

1

更簡單的方法是避免驅動程序的可用性(因爲他是關閉/出租車正在修理)是其中可以開啓或從UI關閉驅動程序表中添加布爾屬性。

和預留應該有一個屬性作爲抵消,使得查詢可用的驅動程序時取消預約可以忽略不計。

所以可用的驅動程序會

select * 
from drivers d 
where d.Available = true 
and not exists (
    select top(1) r.id 
    from rerservations r 
    where r.driverid = d.id 
    and r.cancelled = false 
    and r.start < GetDate() 
    and r.end > GetDate() 
) 
+1

謝謝你你的答案。但是,如果一位司機下週休假,該怎麼辦?有了這個設計,我不得不在下個星期一把他的狀態設置爲「不可用」。並且不要忘記在他的背上放回'可用'。我正在尋找更靈活的解決方案,以便我可以在未來設置資源可用性 – Anton 2014-09-26 00:19:24

+0

如果添加已取消的預留,它應該可以工作。這不是很好的,雖然,但如果你命名不同了一點(如分配,而不是保留其中分配是預約和用戶ID的超不適用於分配) – 2014-09-26 00:32:08

+0

什麼非可用性跟蹤表?當司機休假或休息時,從時間戳和時間戳輸入。當他的計程車保留時,請進入。也可以使用原因/狀態標誌來說明爲什麼他不可用。當某人取消預訂時,您可以從不可用表中刪除該記錄。 PostgreSQL中有非常有用的時間戳功能。 – Jayadevan 2014-09-26 04:35:22