我有下表:
CREATE TABLE Salesperson
(
id INT,
name VARCHAR(30),
age INT,
salary INT,
PRIMARY KEY (id)
);
CREATE TABLE Orders
(
Number INT,
ORDER_DATE DATE,
cust_id INT,
salesperson_id INT,
Amount INT,
PRIMARY KEY (Number),
FOREIGN KEY (salesperson_id) REFERENCES Salesperson (id)
);
我将外键关系描述为引用(子)表Orders
与引用的(父)表Salesperson
。
但是,MySQL Workbench 将这种关系描述为引用表(子)表 Orders
与引用的表(父表)Salesperson
。
是我,还是 MySQL Workbench 落后了?如果有解释,我们将不胜感激。
更新 我在 MySQL Workbench 文档下找到了“强制”的定义:
强制复选框用于选择引用表和被引用表是否是强制的。默认情况下,这两个约束都是 true(由选中的复选框表示)。
最佳答案
这种关系是双向的。或者,您可以将其视为同一关系的两半。
像这样的外键关系通常称为“一对多”,而不是“多对一”。 MySQL Workbench 使用规范模式来引用它。
跟进
问:为什么 Orders.salesperson_id
是强制性的,而 Salesperson.id
是非强制性的? Salesperson.id
是主键,Orders.salesperson_id
不是主键,那么复选框不会颠倒吗?
答:我不熟悉 MySQL Workbench 中的复选框。
正如 Mike Lischke 在他的评论中指出的那样,我们在实体关系建模级别关心的是关系的“基数”。基本上,我们问的问题是,我们是否要求订单与销售人员相关?也就是说,我们可以有一个与销售人员不相关的订单吗?
我们可以拥有与订单不相关的销售人员吗?
显然我们已经回答了以下问题:一名销售人员是否可以与多个订单相关?一个订单可以与多个销售人员相关吗?这就是我们确定这是一对多关系的方式。现在我们只是进一步完善基数。
我认为 UI 中的“强制”复选框旨在回答以下问题:我们是否可以创建一个与订单不相关的 Salesperson 实例,或者我们是否要求 一名销售人员至少与一个订单相关?
同样,如果我们将其视为我们提出问题的两种关系,那么这些问题就有意义。我们正在询问有关销售人员与订单之间关系的问题,以及有关订单与销售人员之间关系的问题。
根据问题的答案,我们将 Order.salesperson_id
标记为“强制”,以表明我们将要求订单与销售人员相关。我们将关系的另一个方向标记为“非强制性”,以表明我们不会要求销售人员与订单相关。
关于MySQL 工作台 : What is the foreign key relationship between child and parent tables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24176064/