我应该如何为酒店价格创建最有效的数据库?[关闭]

How should I create the most efficient database for a hotel prices? [closed]

提问人:Baran Arda 提问时间:7/31/2023 更新时间:7/31/2023 访问量:61

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

4个月前关闭。

假设我们想做最高效的酒店网站。在这个网站上,房间可能会根据“多少人”、日期和星期几有不同的价格。存储和处理它们的最有效方法是什么?

第一种方法 - >每个特定日期的价格;

日期 room_id 价格 price_for_2_people
01-01-2023 1 20.00 40.00
02-01-2023 1 20.00 40.00

或 -> 日期范围的价格;

date_start date_end room_id 价格 price_for_2_people price_for_weekend
01-01-2023 01-03-2023 1 20.00 40.00 30.00
01-03-2023 01-07-2023 1 30.00 50.00 40.00

请注意,管理员用户有时可能只输入一天的价格,有时设置的价格范围很宽。

此外,在第二个选项中,计算一天的价格在 SQL 端似乎更有效。因为如果您要搜索特定日期,而不是搜索超过 1000 行,而是搜索 20 到 30 行要快得多。但是,如果客户想进行 7 天的预订,则需要通过在编码端逐个搜索日期来收集价格。因为开始日和结束日可以排在不同的行(前 3 天的价格可能是 30 欧元,然后是 40 欧元)。

此表中可能会出现更多变量,但这些将是主要变量。我应该如何配置数据库,以便没有错误并且算法运行最有效?此外,我想避免日期冲突和空白日期。

我希望找到创建酒店预订数据库的最佳方式。

php sql mysql 性能 sqlperformance

评论

0赞 Raptor 7/31/2023
让我问一下,对于第二种方法,如果客户在周末和工作日逗留会很困难吗?第一种方法更简单,只是根据客户数量将价格相加。
0赞 Rick James 7/31/2023
在每种情况下,表通常有多少行?您不需要考虑插入新数据并避免重叠范围和间隙的麻烦吗?
0赞 suchislife 7/31/2023
这已经无关紧要了。这与答案无关。这是关于“焦点”。当您的解决方案需要超过 3 行代码和实际思考时,它就会失去焦点。这样更容易调节=)。欢迎使用 Stack Overflow。
0赞 Baran Arda 8/1/2023
@RickJames如果您将其设置为日期范围 -> 20 到 30 行,则其他选项包含超过 500+
0赞 Rick James 8/1/2023
勾勒出查询的 SQL。我们可以讨论它的效率以及它需要什么指标。

答:

-1赞 suchislife 7/31/2023 #1

这样的事情怎么样?

  • 房间表:包含每个房间的信息。
room_id room_type 能力
1 1
2 2
3 套房 4
  • 价格周期表:保存具有特定价格的日期范围。
period_id date_start date_end
1 2023-01-01 2023-01-31
2 2023-02-01 2023-02-28
3 2023-03-01 2023-03-31
  • 价格表:根据房间类型、时间段和入住率存储定价详细信息。
price_id room_id period_id 价格 price_for_2_people price_for_weekend
1 1 1 20.00 40.00 30.00
2 1 2 30.00 50.00 40.00
3 2 1 40.00 60.00 50.00

要记住的要点:

  • 避免日期重叠:创建或更新餐桌时,请确保同一聊天室没有重叠的时间段。您应该在应用程序逻辑中包含检查以防止这种情况。price_periods

  • 处理日期间隔:如果每天都有房间可用,请确保时间间隔之间没有间隔。对于给定房间,一个周期的结束日期应比下一个周期的开始日期早一天。

  • 针对速度进行优化:如果您经常根据日期检索价格,请考虑将表中的 和 列编制索引。这将大大加快您的查询速度。date_startdate_endprice_periods

  • 选择正确的数据库类型:此设计适用于 SQL 数据库。但是,如果您的使用模式与 SQL 不一致,则 NoSQL 数据库可能是更好的选择,因为它在数据结构方面提供了更大的灵活性。

下面是一些示例 SQL 查询来说明:SELECT

  1. 检索特定房间的详细信息:
SELECT * 
FROM rooms 
WHERE room_id = 1;
  1. 检索特定房间的价格:
SELECT r.room_id, r.room_type, p.price, p.price_for_2_people, p.price_for_weekend 
FROM rooms r 
JOIN prices p ON r.room_id = p.room_id 
WHERE r.room_id = 1;
  1. 检索特定日期的房间价格:
SELECT r.room_id, r.room_type, p.price, p.price_for_2_people, p.price_for_weekend 
FROM rooms r 
JOIN prices p ON r.room_id = p.room_id 
JOIN price_periods pp ON p.period_id = pp.period_id 
WHERE r.room_id = 1 AND '2023-01-15' BETWEEN pp.date_start AND pp.date_end;
  1. 检索特定日期所有房间的价格:
SELECT r.room_id, r.room_type, p.price, p.price_for_2_people, p.price_for_weekend 
FROM rooms r 
JOIN prices p ON r.room_id = p.room_id 
JOIN price_periods pp ON p.period_id = pp.period_id 
WHERE '2023-01-15' BETWEEN pp.date_start AND pp.date_end;
  1. 检索某个日期范围内的房间价格(此查询将分别返回该日期范围内每个时间段的价格):
SELECT r.room_id, r.room_type, p.price, p.price_for_2_people, p.price_for_weekend, pp.date_start, pp.date_end 
FROM rooms r 
JOIN prices p ON r.room_id = p.room_id 
JOIN price_periods pp ON p.period_id = pp.period_id 
WHERE r.room_id = 1 AND pp.date_start >= '2023-01-01' AND pp.date_end <= '2023-01-31';

评论

1赞 Baran Arda 8/1/2023
对不起,如果它失焦了,但我真的很喜欢你的回答。这将对我有很大帮助。感谢您的努力和冗长的解释。