2008-12-11 61 views
8

我最近被問及一個假設的基於網絡的預訂系統的面試問題,以及我將如何設計數據庫模式以儘量減少重複並最大限度地提高靈活性。數據庫模式 - 預訂/可用性系統

用例是一個管理員將一個屬性的可用性輸入到系統中。可能會有多個時間段設置。例如,2009年4月1日至2009年4月14日以及2009年7月3日至2009年7月21日。

然後,用戶只能在具有相同或更短期限的期間內進行預訂。

如何將這些信息存儲在數據庫中?

你會使用一些簡單的(真正簡化的);

AVAILABILITY(property_id, start_date, end_date); 
BOOKING(property_id, start_date, end_date); 

那麼您可以輕鬆構建一個網頁,顯示可用性的日曆,其中包含已預訂的時間段。從這個數據庫模式構建報告會很容易嗎?它看起來很簡單嗎?

回答

12

這可能是更容易的可用性和預訂單臺工作,1天粒度:

property_date (property_id, date, status); 

列的狀態將有(至少)以下2個值:

  • 推介
  • 預訂

輸入一段可用性例如4月1日至14日將需要(應用程序)插入14行到property_date,每個狀態爲'可用'。 (對用戶來說,它應該看起來像一個動作)。

預訂4月3日至11日期間的房產需要檢查每天是否存在「可用」行,並將狀態更改爲「預訂」。

這種模式似乎有點「詳細」,但它具有一定的優勢:

  1. 檢查可用性對於任何日期很容易
  2. 添加預訂自動更新的可用性,沒有一個單獨的可用性表保持同步。
  3. 在網頁中顯示可用性將非常簡單
  4. 很容易添加新狀態以記錄不同類型的不可用性 - 例如,關閉進行維修。

注意:如果「可用」是屬性的最常見狀態,倒置邏輯可能會更好,因此存在「不可用」狀態,並且缺少日期的行表示它是可用。

+0

我打算建議這個。 – 2008-12-16 18:13:21