Database 餐厅网站的一对多关系?

Database 餐厅网站的一对多关系?,database,data-modeling,Database,Data Modeling,每个餐厅都有餐厅分店,每个分店必须确定一周中的哪几天营业,每一天必须确定(几个)营业时间和当天的营业时间 我使用以下表格创建了一对多关系: 休息日名称-->休息日分支机构-->营业日-->营业时间 我走这条路对吗?或者有另一种方法,也许不那么复杂? 查询将如何获得餐厅在特定日期(如周日)的小时数?这取决于您如何存储开放日(我假设您使用的是日期值),但只要DBMS的数据类型支持,您可以将日期和时间组合在一个列中。这样就不必把“开放时间”变成“开放日”。你走的路是对的。我看到的实体是: 连锁餐厅(

每个餐厅都有餐厅分店,每个分店必须确定一周中的哪几天营业,每一天必须确定(几个)营业时间和当天的营业时间

我使用以下表格创建了一对多关系: 休息日名称-->休息日分支机构-->营业日-->营业时间

我走这条路对吗?或者有另一种方法,也许不那么复杂?
查询将如何获得餐厅在特定日期(如周日)的小时数?

这取决于您如何存储开放日(我假设您使用的是日期值),但只要DBMS的数据类型支持,您可以将日期和时间组合在一个列中。这样就不必把“开放时间”变成“开放日”。

你走的路是对的。我看到的实体是:

  • 连锁餐厅(如TGI Friday's)
  • 餐厅(具体一家)
  • 营业时间(餐厅、白天、营业时间、休息时间)

在一天中有一个实体似乎是不必要的。

一家餐馆给许多分店命名
多个分支机构到多个开放日
多个开放日到多个开放时间

选择[列名称]
从开放日开始
在开放日加入rest\u分支。rest\u branchId=rest\u分支。rest\u branchId
在rest\u name.rest\u nameId=rest\u分支上加入rest\u name

如果营业日=‘星期日’
我建议存储营业时间,然后存储每家餐厅的营业时间,而不是关门时间。这将使计算营业时间变得更容易,也将避免午夜后营业的餐馆的模糊性

使用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\u 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)

从数据模型设计来看,在链和分支的表中不一定要有一个ID列作为主键:您可能需要为其他列定义一个唯一的约束(例如,链名称),而该列可能完全是主键。ID列将是一个代理键,您可以决定是否使用它。有些人认为这是一个很好的做法,总是有这样一个主键,但它不是严格必要的。你甚至会发现,在很多情况下,它不值得拥有 关于是否使用此结构的注意事项与以编程方式访问/读取/更新信息的容易程度有关。 如果需要,您还可以在同一行中包含餐厅地址。 注意。”“地址”是属性类型,而不是属性本身。它是一种复合属性类型,与日期相同。名称+属性类型=属性,例如发票+地址=发票地址,发票+日期=发票日期。发票地址和发票日期都是单一复合属性,遵循相同的规则。
关于数据结构的主要问题是数据完整性-规范化只是一种尝试确保数据完整性的方法。

m我认为您将列名与表名进行了切换。开放时间(餐厅、日期、开放时间、关闭时间)此外,该模型仅在假设每周同一天的开放时间相同的情况下工作。@DVK这是典型的情况。不过,如果你想更具体一些,可以用date代替day。非常感谢你的回答,也感谢Daniel的建议。:)哇。这怎么不是公认的答案?只是想知道。:)