Database 如何在数据库中存储大量酒店可用性数据

Database 如何在数据库中存储大量酒店可用性数据,database,database-design,schema,database-schema,Database,Database Design,Schema,Database Schema,我目前在一个数据库中有大约10000家酒店(并且还在增长)。目前没有存储可用性数据。我希望存储可用性数据+价格,以便人们可以搜索一组酒店(如纽约)是否在给定日期+持续时间内可用 我必须存储的内容: 10000家酒店(并在增长) 每个酒店6个房间类型 最多365个出发日(但可能会少一些,比如300天左右) 每个房间类型大约有30个持续时间(从1晚到31晚) 1至5种(但大部分为1-3种)董事会类型(例如,包括早餐,全包) 以上每种组合都有一个价格 当我为每个组合生成1行时,“行”的数量将为10

我目前在一个数据库中有大约10000家酒店(并且还在增长)。目前没有存储可用性数据。我希望存储可用性数据+价格,以便人们可以搜索一组酒店(如纽约)是否在给定日期+持续时间内可用

我必须存储的内容:

  • 10000家酒店(并在增长)
  • 每个酒店6个房间类型
  • 最多365个出发日(但可能会少一些,比如300天左右)
  • 每个房间类型大约有30个持续时间(从1晚到31晚)
  • 1至5种(但大部分为1-3种)董事会类型(例如,包括早餐,全包)
  • 以上每种组合都有一个价格
当我为每个组合生成1行时,“行”的数量将为10.000*6*300*30*3=1.620.000.000行。首先

写作: 每天将刷新大约25%的数据

阅读: 每天将有20000名访问者搜索数据。假设每天有50000个请求,峰值在晚上(20000个在晚上8点到11点之间)。主要搜索1个房间类型。有些人会在1家酒店中搜索2种房间类型。最后一个很好

其他要求:

  • 每个房间类型都包含附加信息。这将是房间允许的最大人数,以及链接到其他房间信息的“房间标识符”。比如设施,照片,描述
  • 用户应该能够使用分面搜索在数据集中进行筛选
我的具体问题是如何设置数据库的体系结构

  • 我的第一个想法是在哪里插入每个组合。创造了大量的记录,当一家酒店增加时,增长相当快。前往10万家酒店将创造10倍以上的记录。结构式:
酒店代码房间类型代码出发日期持续时间董事会代码价格 H1234 R1234 20150701 1 A 35 H1234 R1234 20150701 1 B 45 H1234 R1234 20150701 2 A 65 H1234 R1234 20150701 2 B 80 H1234 R1234等 H1234 R1234 20150702 1 A 35 H1234 R1235 20150701 1 A 35 H1234 R1235等 H1235 R6554 20150701 1 A 35 H1235 R6554等
  • 第二个想法是将多个记录“折叠”成一个。在价格相同的情况下是可能的。例如,具有相同房间类型/持续时间/住宿数据的出发日期。存储离开日期,如“20150701 | 20150702 |等”。但后来认为应该搜索“类似于“%20150718%”。我认为这不会很快。例如:
酒店代码房间类型代码出发日期持续时间董事会代码价格 H1234 R1234 20150701 | 20150702 1 A 35 H1234 R1234 20150701 1 B 45 H1234 R1234 20150701 2 A 65 H1234 R1234 20150701 2 B 80 H1234 R1234等 H1234 R1235 20150701 1 A 35 H1234 R1235等 H1235 R6554 20150701 1 A 35 H1235 R6554等 “基本”示例是expedia.com、booking.com和orbitz.com的“hotel”变体。正如您所见,它们返回结果的速度相当快,对于“可能的非缓存结果”也是如此

具体的问题是“我应该以何种方式在数据库中构建这些数据”

当然,我知道我选择的数据库类型(mysql、solr、Cassandra、redis)会影响结果

更新

根据Livio Costea给出的答案,这将是想法3。与想法2的区别是a)总住宿没有酒店价格,但每晚可以增加多个持续时间

Hotelcode Roomtypecode Departureday Duration Boardcode Price H1234 R1234 20150701|20150702 1|2 A 35 H1234 R1234 20150701 1|2 B 45 H1234 R1234 20150702 1|2 B 55 H1234 R1234 etc etc etc etc H1234 R1235 20150701 1 A 35 H1234 R1235 etc etc etc etc H1235 R6554 20150701 1 A 35 H1235 R6554 etc etc etc etc 酒店代码房间类型代码出发日期持续时间董事会代码价格 H1234 R1234 20150701 | 20150702 1 | 2 A 35 H1234 R1234 20150701 1 | 2 B 45 H1234 R1234 20150702 1 | 2 B 55 H1234 R1234等 H1234 R1235 20150701 1 A 35 H1234 R1235等 H1235 R6554 20150701 1 A 35 H1235 R6554等 如果不在单个列中添加“持续时间”,而只存储不同的“离开日”,则可以使用更小的数据库“。如果出发日显示1-1月、2-1月和3-1月是可能的。可以解释为,可以在1月1日住3晚。我可以想象,向数据库查询特定房间类型和董事会代码的3晚时间会比上述“想法3”慢。接下来,当搜索1月1日至3日的夜晚时,如果2月1日的价格不同,我会绞尽脑汁想得到正确的数据集。在这种情况下,将有2行。一个用于1月1日和3月1日,价格为X,另一个用于2月1日,价格为Y。然后应在飞行中合并这些。可能只是存储了更多的行 Hotelcode Roomtypecode Departureday Duration Boardcode Price H1234 R1234 20150701|20150702 1 A 35 H1234 R1234 20150701 1 B 45 H1234 R1234 20150701 2 A 65 H1234 R1234 20150701 2 B 80 H1234 R1234 etc etc etc etc H1234 R1235 20150701 1 A 35 H1234 R1235 etc etc etc etc H1235 R6554 20150701 1 A 35 H1235 R6554 etc etc etc etc Hotelcode Roomtypecode Departureday Duration Boardcode Price H1234 R1234 20150701|20150702 1|2 A 35 H1234 R1234 20150701 1|2 B 45 H1234 R1234 20150702 1|2 B 55 H1234 R1234 etc etc etc etc H1234 R1235 20150701 1 A 35 H1234 R1235 etc etc etc etc H1235 R6554 20150701 1 A 35 H1235 R6554 etc etc etc etc