【问题标题】:MongoDB Schema for Hotel booking / room availability用于酒店预订/房间可用性的 MongoDB 架构
【发布时间】:2012-06-13 19:22:51
【问题描述】:

我目前正在构建一个与酒店预订网站具有相似模型的应用程序。

目前正在考虑处理可用性搜索的方法。

我的模型看起来有点像下面:

酒店
_id
名称
说明
星级评分
地址
纬度

然后我想到了一个类似这样的可用性集合:

可用性
hotel_id(如果可用性是它自己的集合)
日期
房间类型
room_max_occupancy
价格

日期将存储房间可用的一天
room_type 会是“Twin”“Double”之类的东西
room_max_occupancy 将是 2、3 等...

一个示例查询是:
6 月 1 日至 8 日入住的房间,可供 2 人入住。

对于“搜索结果”,我需要返回 hotel.name、hotel.description、hotel.star_rating。

我正在寻找为上述查询类型存储此数据的最有效方法?

可用性集合应该是它自己的集合,还是 Hotel 的子文档?

如果它是自己的集合,我是否应该将纬度添加到可用性中(以及 hotel_id)以提高搜索效率?

【问题讨论】:

  • 在空间(磁盘/RAM)、插入或查找空闲房间方面效率最高?不应该有一个 Room 集合(其中可能包含可用/不可用时间跨度的列表)吗?
  • 您是否关心多人同时搜索、查看空房情况,然后如果其他人抢了他们可能无法预订?
  • 请注意几件事(我熟悉所讨论的域):您可能想要一个比 room_id 更细粒度的聚合来列出可用性。即:agent-offers 通常会考虑 room_id 之外的其他内容以将可用性链接到,例如:包含早餐、特殊多日(2 = 3 天)优惠等。因此,尽管 roomId 可能足以作为一种方式开始聚合可用性,它不允许您对潜在合作伙伴(例如 booking.com)扔给您的所有东西进行建模。

标签: mongodb schema nosql


【解决方案1】:

让我们从查询开始向后工作。您想要的是一系列日期的可用房间列表。将房间存储为未来日期的“未预订”是不可行的,因此您将收集预订信息。查询如下所示:

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(一些冗余以跳过额外的查询),您可以从中获取酒店的显示详细信息

【讨论】:

  • appologies- 我认为您可能对模型有误解?它类似于 booking.com 和 hotwire.com(那种东西) - 所以需要搜索列出的可用性......所以“将房间存储为'未预订'以供未来日期是不可行的”几乎是什么我想我们需要做什么?
  • 我知道您可以在多远的将来预订房间。因此,以额外空间为代价,您可以将is_available 字段添加到预订集合中。我已经修改了我的答案以反映这一点
  • 听起来这需要三个查询才能查看在该时间段内哪些酒店有可用房间 - 这似乎非常低效......
  • 它是空间和时间的权衡。您可以复制酒店信息,会占用大量空间,编辑会很困难。使用正确的索引,mongo 可以快速返回结果。多个查询不应该是一个问题
  • @Alex 我想建议将来添加“可用日期”不是一个好的解决方案。使用逆逻辑。进行查询以获取与请求的日期匹配的所有预订,然后从该地区/城市的所有酒店列表中减少这些预订,然后您将获得当时可用的酒店/客房列表。这样,客人可以毫无问题地搜索他们想要的未来。如果没有返回一组日期的属性,则所有属性都可用。在预订时立即运行快速可用性检查,以确保自首次搜索后尚未预订。
猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2016-03-29
  • 2012-03-27
  • 2021-07-01
相关资源
最近更新 更多