3

我有你期望的標準表,如'房間','預訂'等。一切都在關係數據庫中。酒店預訂系統:如何存儲每晚預訂的單獨價格?

「預約」表存儲諸如room_id,入住日期和結帳日期等項目。

現在,簡單地說,當進行預約時,系統檢查房間價格表並獲取每晚保留的費用(取決於日期,入住等) - 費用可能不同每晚取決於當前的價格。
很顯然,預訂時,每晚的價格是固定的。因此,即使房價在事後更新,該預訂仍然保持約定價格,因爲它是在價格變化之前完成的。

我的問題是:如何在預訂時爲每晚存儲這些單獨的商定價格?

我正在考慮使用另一個表格'PriceForNight'來存儲每晚預訂的預訂ID,價格和日期。

我看到的唯一可能的問題是可伸縮性。如果平均預訂時間爲5晚,這意味着'PriceForNight'表格將比'Reservation'錶快5倍左右。

將'PriceForNight'數據更好地存儲在NoSQL數據庫或類似的東西?

正在考慮的另一個選項是將每晚的價格作爲以逗號分隔的字符串存儲在「預訂」表格行中的單個列中,例如:「150.00,175.00,175.00,200.00,150.00」 5晚預訂。

我可能會過度思考這個問題,因爲一個真正的問題可能只存在,如果它增長了1000倍,但我喜歡做正確的事情,所以我想我會接觸到社區。

任何輸入,非常感謝。

+0

由於無論如何您都要在該表中輸入每個晚上的記錄,爲什麼不將這些數據存儲在保留表中?您可以添加兩列,即機架速率和實際速率。 – 2012-01-28 15:29:50

+0

@MarkKram'Reservation'表中的每個預訂只有一個條目,無論有多少晚上。 – Alex 2012-01-28 23:11:47

+0

Aaah,好我現在明白了 – 2012-01-29 01:54:06

回答

3

純粹的關係型方法應該是有一個ReservationNight表,它存儲了有關預訂每晚的詳細信息,包括價格。是的,這張桌子會快速增長,但無論您如何儲存價格,數據都會迅速增長。

+0

謝謝您的意見。因此,我的'PriceForNight'表與您的建議相同?'reservation_id','價格'和'日期'? – Alex 2012-01-27 20:08:02

+0

是的,雖然我認爲它可能不僅僅是存儲的價格。重點在於,您需要每晚預訂時需要存儲的信息,因此請列出ReservationNight表。如果它只有一個有趣的列(價格),那就這樣吧,這不應該放在表格的名字中。 – 2012-01-27 20:15:36

+0

我完全理解。感謝您的時間。 – Alex 2012-01-27 20:25:44

1

通常,逗號分隔的列表不屬於SQL數據庫。我會說你最好的選擇是一個交界點。

StackOverflower Bill Karwin這裏回答得好:Is storing a comma separated list in a database column really that bad?

除了因爲存儲在一個單一的列值的 重複組的違反First Normal Form,逗號分隔 列表有很多其他更實際的問題:

  • 不能保證每個值是正確的數據類型:沒辦法,防止1,2,3,香蕉,5
  • 無法使用外鍵約束將值鏈接到查找表;沒有辦法強制參照完整性。
  • 不能強制唯一性:沒有辦法阻止1,2,3,3,3,5
  • 沒有獲取整個列表不能從列表中刪除一個值。
  • 很難搜索列表中給定值的所有實體;您必須使用低效的表掃描。
  • 很難統計列表中的元素,或執行其他聚合查詢。
  • 很難將這些值加入到它們引用的查找表中。
  • 很難按排序順序獲取列表。

爲了解決這些問題,你必須寫噸的應用程序代碼, 重塑功能的RDBMS 已經提供了更有效的

逗號分隔的列表是錯誤的,因此我在本書中創建了第一個 章節:SQL Antipatterns: Avoiding the Pitfalls of Database Programming

有些時候你需要使用非規範化,但是正如@OMG 小馬提到的,這些都是異常情況。任何非關係型 「優化」都會以犧牲數據的其他用途 爲代價獲得一種查詢類型,因此請確保您知道您的哪些查詢需要特別處理,以致它們應該得到非規範化。

+0

我以前沒有見過這個答案,謝謝。逗號分隔的想法絕對沒有。 – Alex 2012-01-27 20:24:25

0

您可以使用日期範圍而不是固定日期。

所以,如果我預約:

Night 27 01 2012: 20 $ 
Night 28 01 2012: 20 $ 
Night 29 01 2012: 30 $ 

在DB:

reservationId from  to  price 
5457848  20120127 20120128 20 
5457848  20120129 20120129 30 

如果它是很常見的,每天有一個羞怯的價格,這將不會減少行的數量。但這很罕見,那麼它最多會減少到1排。

+0

我們之前也考慮過這一點,但認爲每次需要顯示價格時都會產生大量的處理開銷,因而無法解構數據。另外,如果我們希望生成財務報告或進行分析,單獨的夜晚大多可能是最容易的。 – Alex 2012-01-27 20:23:00

+0

然後,你應該確實與新表。它是最好的做法,它會創造更多的行。也許你可以在主要的預訂中加入一個標誌,如果你選擇了所有夜晚的費用是相同的,並且你在這一行中花費了費用。如果不是,則參考其他表格。 – Jeff 2012-01-27 21:12:29

+0

也是一個很好的建議。我們會考慮這一點。感謝您的時間。 – Alex 2012-01-27 22:52:32

0

一張儲存每晚費用的表格,每晚一行似乎是合理的。

每個房間一年可以租用不超過365晚。 (在現實世界中,這是差不多是真的,汽車旅館的業務實際上比它看起來更復雜。)

如果你有200個房間,你每年大概看200 * 365行,或73,000行。 (我得到的算術是否正確?)以這樣的速度,如果技術沒有完全改進,那麼您不必考慮至少100年來擔心SQL dbms的性能。

您可能還會發現this answer有用。它遵循同樣的思路。

+0

感謝您的回覆。單獨的表格方法對我們來說是最容易實現的,所以聽到這種說法讓人放心。 – Alex 2012-01-27 20:13:48

+0

@Alex:[This SO answer](http://stackoverflow.com/a/8009992/562459)遵循同樣的思路。 – 2012-01-28 14:57:56