【发布时间】:2015-10-07 13:23:14
【问题描述】:
我目前在数据库中有大约 10.000 家酒店(并且还在不断增加)。目前没有存储可用性数据。我想存储可用性数据 + 价格,以便人们可以搜索一组酒店(例如在纽约)在给定日期 + 持续时间是否可用。
我必须存储的内容:
- 10.000 家酒店(并且还在不断增加)
- 每家酒店 6 种房型
- 最多 365 个出发日(但可能更少,比如 300 个)
- 每种房型有大约 30 个持续时间(从 1 晚到 31 晚)
- 1 到 5 种(但主要是 1-3 种)板型(例如,包括早餐,全包)
- 以上每种组合都有价格
当我为每个组合生成 1 个“行”时,“行”的数量将为 10.000 * 6 * 300 * 30 * 3 = 1.620.000.000 行。作为开始。
写作: 每天将刷新大约 25% 的数据。
阅读: 每天有 20.000 名访问者搜索数据。假设每天有 50.000 个请求,晚上有一个高峰(晚上 8 点到 11 点之间有 20.000 个)。主要搜索 1 种房型。有些人会在 1 家酒店中搜索 2 种房型。最后一个很不错。
其他要求:
- 每种房型都包含附加信息。这将是房间中允许的最大人数以及链接到其他房间信息的“房间标识符”。比如设施、照片、描述。
- 用户应该能够使用分面搜索在数据集中进行过滤
我的具体问题是如何设置数据库的架构。
- 我的第一个想法是在哪里插入每个组合。导致大量记录,添加酒店后增长非常快。去 10 万家酒店将产生 10 倍以上的记录。结构如下:
- 第二个想法是将多个记录“折叠”为一个。价格相同的情况下可以。例如,具有相同房型/持续时间/入住数据的出发日期。存储出发日期,如“20150701|20150702|etc”。但后来认为应该进行“就像'%20150718%'的搜索。我认为这不会很快。喜欢:
“基本”示例是 expedia.com、booking.com 和 orbitz.com 的“酒店”变体。如您所见,它们返回结果的速度非常快,对于“可能未缓存的结果”也是如此。
具体问题是“我应该以什么方式在数据库中构建这些数据”。
我当然明白我选择的数据库类型(mysql、solr、Cassandra、redis)会影响结果。目前我首先想找出需要存储的预期行数/文档数。
更新
根据 Livio Costea 给出的答案,这将是想法 3。与想法 2 的不同之处在于 a) 没有酒店的总住宿价格,但每晚的价格使其能够 b) 将多个持续时间添加到一行。
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 等等等等等等等等 H1234 R1235 20150701 1 A 35 H1234 R1235 等等等等等等等等 H1235 R6554 20150701 1 A 35 H1235 R6554 等等等等等等如果不在单个列中添加“持续时间”而仅存储不同的“出发日”,则可以使用更小的数据库。如果出发日表示 1 月 1 日,2 月 2 日和 3 月是可能的。可以解释为可以入住 1 月 + 3 晚。我可以想象,向数据库询问特定房间类型和板代码的 3 晚会比上述“想法 3”慢。紧挨着我在搜索 1 月 1 日至 3 晚(2 月 2 日的价格不同)时获取正确数据集的想法苦苦挣扎。在这种情况下,将有 2 行。一个用于 1 月和 3 月的价格为 X,一个用于 2 月的价格为 Y。然后应即时组合。可能只是存储更多行更有效。
我会将价格存储在与所有其他信息(酒店名称、星级等)不同的数据库中,房间类型键将是匹配项。
【问题讨论】:
-
除了存储每个组合的价格之外,您能否将其分解为具有每个组件的价格和/或系数的结构?使用您的计算,一家酒店将生成 162,000 行。谁来编辑所有这些行?更有可能的是,酒店有定价和折扣公式。采访一些酒店工作人员,了解他们是如何处理的。
-
@reaanb “每个组件的系数”是什么意思?不会手动编辑 162k 行。酒店将节省每种房型和出发日的价格。不同之处在于他们不需要对其进行(快速)分面搜索。这就是为什么我想在“预处理”中展平数据,然后对其进行搜索会更快。当我的想法完全错误时,请告诉我。只需学习一个:-)
-
系数是指乘数,例如全包膳食可能会在基本房价基础上增加 10%,而不是固定金额。我建议您不要对这些数据进行非规范化 - 基于加入方面(酒店、房间类型、日期、持续时间、董事会)的查询可以在加入之前预先过滤这些方面,并使用索引来加速过滤和加入。相反,非规范化表的索引需要索引所有多次出现的相同值,并且过滤发生在连接后,效率会降低。
标签: database database-design schema database-schema