提问人:Baran Arda 提问时间:7/31/2023 更新时间:7/31/2023 访问量:61
我应该如何为酒店价格创建最有效的数据库?[关闭]
How should I create the most efficient database for a hotel prices? [closed]
问:
假设我们想做最高效的酒店网站。在这个网站上,房间可能会根据“多少人”、日期和星期几有不同的价格。存储和处理它们的最有效方法是什么?
第一种方法 - >每个特定日期的价格;
日期 | 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 欧元)。
此表中可能会出现更多变量,但这些将是主要变量。我应该如何配置数据库,以便没有错误并且算法运行最有效?此外,我想避免日期冲突和空白日期。
我希望找到创建酒店预订数据库的最佳方式。
答:
这样的事情怎么样?
- 房间表:包含每个房间的信息。
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_start
date_end
price_periods
选择正确的数据库类型:此设计适用于 SQL 数据库。但是,如果您的使用模式与 SQL 不一致,则 NoSQL 数据库可能是更好的选择,因为它在数据结构方面提供了更大的灵活性。
下面是一些示例 SQL 查询来说明:SELECT
- 检索特定房间的详细信息:
SELECT *
FROM rooms
WHERE room_id = 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;
- 检索特定日期的房间价格:
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;
- 检索特定日期所有房间的价格:
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;
- 检索某个日期范围内的房间价格(此查询将分别返回该日期范围内每个时间段的价格):
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';
评论