2012-06-10 33 views
2

我目前正在建立一個類似模型的酒店預訂網站的應用程序。MongoDB架構酒店預訂/房間供應

當前正在考慮處理可用性搜索的方法。

我的模型看起來有點像下面的:

酒店
_id

描述
STAR_RATING
地址
LAT
LON

我當時以爲有一個可用性TY集合是這樣的:

可用性
HOTEL_ID(如果可用性是它自己的集合)
日期
room_type
room_max_occupancy
價格

日期將儲存一天的房間可用
room_type將是類似「Twin」「Double」的東西
room_max_occupancy woul d是2,3等...

一個示例查詢將是:
從6月1日至8日,爲2人的房間。

對於「搜索結果」,我需要返回hotel.name,hotel.description,hotel.star_rating。

我正在尋找最有效的方式來存儲上面列出的查詢類型的這種數據?

可用性集合應該是它自己的集合還是酒店的子文檔?

如果它是自己的收藏,我應該將緯度添加到可用性(以及hotel_id)以使搜索更有效嗎?

+0

空間效率最高(磁盤/ R AM),插入還是找到免費的房間?並且不應該有Room集合(可能包含可用/不可用時間範圍的列表)? – xeraa

+0

你是否在意多個人同時搜索,看到可用性,然後可能無法預定是否有其他人毆打他們? –

+0

請注意一些事情(我熟悉討論的領域):您可能需要比room_id更細的聚合來列出可用性。即:代理商優惠通常會將room_id旁邊的其他事物考慮在內以將可用性與例如:含早餐,特別多天(2 = 3天)優惠等相關聯。因此,雖然roomId可能足以作爲一種手段開始的彙總可用性,它不會讓您對潛在合作伙伴(如booking.com)的所有內容進行建模。 –

回答

6

讓我們從查詢開始向後工作。你想要的是一系列日期可用房間的列表。將房間存儲爲未預訂的日期並不可行,因此您需要收集預訂信息。查詢將如下所示:

db.booking.find({date: {$gte: from_date, $lt: to_date}}); 

這可能會得到一個房間ID列表。

收藏:booking 領域:room_id, date

下一個查詢是一個可以讓我們適合的約束房間ID的列表。例如:

db.rooms.find({room_type: "Double", room_max_occupancy: 2}); 

除了預訂房間的日期之外,我們可以獲得可用性狀態。如果每間酒店的平均客房數量很高,那麼它不值得用於潛在複製酒店信息的空間,相反,我們應該爲每個房間設置酒店ID。然後,您必須聚集賓館的唯一列表,以避免重複查詢

收藏:rooms領域:room_type, room_max_occupancy, price, hotel_id

最後的查詢是獲取酒店信息:

db.hotels.find({id: <ID>}, {'name': 1, 'description': 1, 'star_rating': 1}); 

收藏:hotels領域:name, description, star_rating, address, lat, lon

如果您確實需要直接訪問可用性信息,則必須決定日期限制,以便您允許國王(說未來6個月)。每天都必須運行一個腳本,向數據庫添加新的空白可用性信息。您可以修改預訂集合爲:

收藏:booking領域:room_id, date, is_available, hotel_id(連同字段保留預訂過程的細節)

您的查詢現在應該有一個額外的約束:

db.booking.find({is_available: true, date: {$gte: from_date, $lt: to_date}}); 

您可以訪問房間ID和酒店ID(有些冗餘可跳過額外的查詢),從中您可以獲得酒店的顯示詳細信息。

+0

appologies-我認爲你可能有點誤解了模型?它與booking.com和hotwire.com(這種事情)的線路 - 所以需要搜索列出的可用性...所以「這是不可行的,因爲'未預訂未來日期'的房間'」幾乎是什麼我認爲我們需要做的? – Alex

+0

我發現在未來可預訂房間的距離有限。因此,以額外的空間爲代價,您可以將「is_available」字段添加到預訂集合中。我修改了我的答案,以反映這 –

+0

聽起來像這將需要三個查詢只是爲了看看哪些酒店有可用的房間的時間段 - 這似乎非常低效... –