假设我们想要制作最高效的酒店网站。在这个网站上,房间可能会根据“有多少人”、日期和星期几有不同的价格。存储和处理它们最有效的方法是什么?
第一种方法 -> 每个特定日期的价格;
日期 | 房间_id | 价格 | 2 人价格 |
---|---|---|---|
2023年1月1日 | 1 | 20.00 | 40.00 |
2023年2月1日 | 1 | 20.00 | 40.00 |
或 -> 日期范围的价格;
开始日期 | 日期结束 | 房间_id | 价格 | 2 人价格 | 周末价格 |
---|---|---|---|---|---|
2023年1月1日 | 2023年1月3日 | 1 | 20.00 | 40.00 | 30.00 |
2023年1月3日 | 2023年1月7日 | 1 | 30.00 | 50.00 | 40.00 |
请注意,管理员用户有时可能只输入一天的价格,有时会设定很大范围的价格。
此外,在第二个选项中,计算单日价格在 SQL 方面可能看起来更高效。因为如果你要搜索特定的日期,而不是搜索超过 1000 行,而是在 20 30 行中搜索要快得多。但如果客户想要预订7天的房间,就需要在编码端逐天搜索来收集价格。因为开始日和结束日可以在不同的行(价格可能是前三天 30 欧元,然后是 40 欧元)。
此表中可能还会出现一些变量,但这些将是主要变量。我应该如何配置数据库才能不出现错误并且算法运行最有效?我还想避免日期冲突和空白日期。
我希望找到创建酒店预订数据库的最佳方法。
房间_id | 房间类型 | 容量 |
---|---|---|
1 | 单人 | 1 |
2 | 双 | 2 |
3 | 套房 | 4 |
期间_id | 开始日期 | 日期结束 |
---|---|---|
1 | 2023-01-01 | 2023-01-31 |
2 | 2023-02-01 | 2023-02-28 |
3 | 2023-03-01 | 2023-03-31 |
价格_id | 房间_id | 期间_id | 价格 | 2 人价格 | 周末价格 |
---|---|---|---|---|---|
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';