database - 餐厅网站的一对多关系?

标签 database data-modeling

每家餐厅都有餐厅分店,每个分店必须确定它在一周中的哪几天开门,每一天都必须确定(几个)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/

相关文章:

php - android php mysql从应用程序到数据库数据库插入多行

database-design - 为什么数据库系统不支持1 :M and 1:1 relationships directly?

sql - 软删除是个好主意吗?

java - 我应该使用哪种类型来表示 Java 中的任意 blob?

php - 从订单表中查找新买家和回头客

database - 推荐几个好的sybase数据库表查看器

oop - 我应该如何在数据库和 OOP 中建模组关系?

mysql - 客户必须至少有 3 封电子邮件

mysql - 如何加速 sql 查询?索引?

c# - C#中如何通过多层代码使用事务