Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 设计一个高性能的酒店客房预订系统_Database Design_Architecture_Nosql_Scalability_Database Performance - Fatal编程技术网

Database design 设计一个高性能的酒店客房预订系统

Database design 设计一个高性能的酒店客房预订系统,database-design,architecture,nosql,scalability,database-performance,Database Design,Architecture,Nosql,Scalability,Database Performance,我正面临着一个设计一个酒店网站预订系统的情况,该系统可以处理成千上万的酒店房间及其可用性。比如Expedia网站 这种可用性需要存储在本地,我需要查询这些酒店房间的可用性 到目前为止,我的结构如下: 房间类型的一种划分,可以是其特征的组合,例如,如果房间有视图,或者房间中的人数最多,例如:有视图/3人将是单独的类型,其他类型将是:有视图/4人,无视图2人,有视图/4人,等等\ 每个房间将被分配到一个房间类型,以便在前端进行演示。例如:我不会显示单独的房间记录(例如:201房间),但我会显示我有

我正面临着一个设计一个酒店网站预订系统的情况,该系统可以处理成千上万的酒店房间及其可用性。比如Expedia网站

这种可用性需要存储在本地,我需要查询这些酒店房间的可用性

到目前为止,我的结构如下:

  • 房间类型的一种划分,可以是其特征的组合,例如,如果房间有视图,或者房间中的人数最多,例如:有视图/3人将是单独的类型,其他类型将是:有视图/4人,无视图2人,有视图/4人,等等\
  • 每个房间将被分配到一个房间类型,以便在前端进行演示。例如:我不会显示单独的房间记录(例如:201房间),但我会显示我有该类型的可用房间
  • 所以我会有一个房间“桌子”和一个房间类型“桌子”,每个房间都有一个类型
  • 然后是从今天到未来6个月的房间(行)和日期(列)矩阵
矩阵如下所示:

其中1表示该房间在该日期可用,0表示已预订。因此,为了检测某个房间类型是否在某个日期范围内可用,我必须:

  • 该类型的每个房间
  • 扫描所需日期之间的所有列
  • 如果某个房间在该行中未找到0,则表示该房间可用,因此表示该房间类型可显示为该日期范围内的可用房间
  • 在上表中,假设日期范围为2017年10月10日至2017年10月14日(美国格式),唯一可用的房间是C酒店的101号房间

    然后,我可以为客户预订该房间,这样客户在入住期间就不需要换房间了

    我的问题是:

    • 有没有任何存储器可以在内存中保存这样一个大矩阵?(MySQL、Redis、PostgreSQL、Cassandra、MongoDB等)
    • 如果RDBMS是我应该使用的,是什么类型的?我应该使用传统的RDBMS吗?或者这种“矩阵式结构”更适合另一种新的NoSQL数据库
    • 这些访问量巨大的网站是如何构建数据的“矩阵式结构”吗?(例如:Expedia、Booking.com、Trivago等)或者是否有更好的方法可以更快地查询日期范围
    我担心现在没有选择正确的结构,并且在将来网站需求量大、房间容量更大时会遇到性能问题


    谢谢。

    首先,谢谢你的提问。这是我所知道的复杂问题之一,考虑到除了基本的酒店可用性之外还有各种各样的用例。一些示例:您如何进行地理搜索,如何支持同一房间在同一天进行多次入住,如何使数据与世界视图(最新价格和可用性)保持高度一致,如何根据价格对酒店进行排名,如何添加更多属性,如定制优惠(无烟、24小时值机、包括厨房等)、如何处理不同的取消政策等

    我相信你明白了

    我遇到的最好的设计使用列或无模式存储(如cassandra、mongo)以及RDBMS

    NoSQL商店提供了灵活性,可以不断添加更多属性,还可以跨多个维度(如城市、附近搜索等)进行搜索

    RDBMS可以存储很少变化的数据,如不同的房间类型、酒店描述等

    例如,对于上面的简单用例,我会将所有不同的房间类型、酒店到房间的映射存储在RDBMS中。但酒店价格和可用性将存储在NoSQL商店中。我会将房间价格和可用性存储在NoSQL商店中,并使用诸如入住/退房日期、人数、房间数量等搜索属性作为此表的键。我将定期运行cron作业,以填充所有可用房间的所有不同搜索排列(通过在另一个预订表上交叉查找),并更新NoSQL存储。这样读取路径更快(这非常类似于许多社交媒体网站设计其架构时采用的扇出式写入方法。优化读取路径并在写入路径上传播更新,充分意识到读取数据可能有点过时)。在我们的案例中,在cron作业运行之间的时间段内,价格和可用性可能会过时,但这可以通过在预订时间之前再次检查一致的商店(例如预订表)来轻松抵消。如果存在差异,您可以重新启动工作流


    注:以上是一个非常主观的观点,基于价格和可用性很少变化的假设。您可以使用kafka等流媒体系统的组合来加快更新速度

    为什么您会假设酒店可用性很少变化?在预订系统中,这不是最频繁的吗改变什么?除非实际上没有人在使用系统和预订。对于为什么选择在数据库中存储不符合ACID的预订信息,您也非常困惑。