每家餐厅都有餐厅分店,每个分店必须确定它在一周中的哪几天开门,每一天都必须确定(几个)open_hour 和 close_hour 直到那一天。
我使用这些表创建了一对多关系: rest_names ---> rest_branches ---> open_days ---> open_hours
我走对了吗?或者还有另一种方法可以做到这一点,也许不那么复杂? 查询如何获取餐厅在特定日期(比如星期天)的营业时间?
最佳答案
我建议存储营业时间,然后是每家餐厅营业的时间,而不是关门时间。这样可以更轻松地计算营业时间,也可以避免与午夜后营业的餐厅产生歧义。
示例设计,使用 MySQL:
CREATE TABLE restaurant_chains (
id int AUTO_INCREMENT PRIMARY KEY,
name varchar(20)
);
CREATE TABLE restaurant_branches (
id int AUTO_INCREMENT PRIMARY KEY,
chain_id int NOT NULL,
locality varchar(20)
);
CREATE TABLE opening_times (
id int AUTO_INCREMENT PRIMARY KEY,
branch_id int NOT NULL,
day_of_week int NOT NULL,
open_time time,
open_duration time
);
确保添加相关的外键和唯一约束。您还可以添加一个检查约束,以便 day_of_week
始终介于 1 和 7 之间,因为这代表工作日(1 表示星期日,2 表示星期一,等等)。
现在让我们用一些测试数据填充我们的数据库:
INSERT INTO restaurant_chains VALUES (NULL, 'Chain A');
INSERT INTO restaurant_chains VALUES (NULL, 'Chain B');
INSERT INTO restaurant_branches VALUES (NULL, 1, 'Branch 1 for A');
INSERT INTO restaurant_branches VALUES (NULL, 1, 'Branch 2 for A');
INSERT INTO restaurant_branches VALUES (NULL, 2, 'Branch 1 for B');
INSERT INTO restaurant_branches VALUES (NULL, 2, 'Branch 2 for B');
INSERT INTO opening_times VALUES (NULL, 1, 1, '10:00:00', '04:00:00');
INSERT INTO opening_times VALUES (NULL, 1, 1, '19:00:00', '03:00:00');
INSERT INTO opening_times VALUES (NULL, 1, 2, '08:00:00', '12:30:00');
INSERT INTO opening_times VALUES (NULL, 2, 1, '19:00:00', '05:15:00');
INSERT INTO opening_times VALUES (NULL, 2, 2, '19:00:00', '04:00:00');
以下查询返回所有餐厅的开门时间、关门时间和持续时间:
SELECT rb.locality,
ot.day_of_week,
ot.open_time,
ADDTIME(ot.open_time, open_duration) AS close_time,
ot.open_duration
FROM opening_times ot
JOIN restaurant_branches rb ON (rb.id = ot.branch_id)
JOIN restaurant_chains rc ON (rc.id = rb.chain_id);
+----------------+-------------+-----------+------------+---------------+
| locality | day_of_week | open_time | close_time | open_duration |
+----------------+-------------+-----------+------------+---------------+
| Branch 1 for A | 1 | 10:00:00 | 14:00:00 | 04:00:00 |
| Branch 1 for A | 1 | 19:00:00 | 22:00:00 | 03:00:00 |
| Branch 1 for A | 2 | 08:00:00 | 20:30:00 | 12:30:00 |
| Branch 2 for A | 1 | 19:00:00 | 24:15:00 | 05:15:00 |
| Branch 2 for A | 2 | 19:00:00 | 23:00:00 | 04:00:00 |
+----------------+-------------+-----------+------------+---------------+
5 rows in set (0.00 sec)
然后以下查询将返回特定餐厅在特定日期的营业时间:
SELECT ot.open_time,
DATEADD(ot.open_time, open_duration) AS close_time,
ot.open_duration
FROM opening_times ot
JOIN restaurant_branches rb ON (rb.id = ot.branch_id)
JOIN restaurant_chains rc ON (rc.id = rb.chain_id)
WHERE rb.id = 1 AND ot.day_of_week = 1;
+-----------+------------+---------------+
| open_time | close_time | open_duration |
+-----------+------------+---------------+
| 10:00:00 | 14:00:00 | 04:00:00 |
| 19:00:00 | 22:00:00 | 02:00:00 |
+-----------+------------+---------------+
2 rows in set (0.00 sec)
关于database - 餐厅网站的一对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2557073/