草庐IT

用于酒店预订/房间可用性的 MongoDB 模式

coder 2023-10-29 原文

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

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

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

酒店
_id
姓名
描述
star_rating
地址
纬度
经度

然后我想到了像这样的可用性集合:

可用性
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。

我正在寻找最有效的方式来存储上面列出的查询类型的数据?

availability集合应该是自己的集合,还是Hotel的子文档?

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

最佳答案

让我们逆向工作,从查询开始。您想要的是一系列日期范围内的可用房间列表。将房间存储为“未预订”以备将来使用是不可行的,因此您需要收集预订信息。查询看起来像:

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

这可能会给我们一个房间 ID 列表。

集合:预订 字段: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});

集合:酒店 字段:name, description, star_rating, address, lat, lon

如果您确实需要直接访问可用性信息,则必须决定允许预订的日期限制(比如 future 6 个月)。每天,必须运行一个脚本来将新一天的(空白)可用性信息添加到数据库中。您可以将预订集合修改为:

集合:booking 字段:room_id、date、is_available、hotel_id(以及保存预订流程详情的字段)

您的查询现在应该有一个额外的约束:

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

您将获得房间 ID 和酒店 ID(一些冗余以跳过额外查询),您可以从中获取酒店的显示详细信息

关于用于酒店预订/房间可用性的 MongoDB 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10970777/

有关用于酒店预订/房间可用性的 MongoDB 模式的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  5. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  6. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  7. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  8. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  9. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

  10. ruby - "undefined method"用于 rails 模型 - 2

    我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom

随机推荐