[英]How to relate these tables in an ER Diagram?
我知道这是一个常见问题,我非常生锈,不记得如何正确地对此图建模。
https://i.imgur.com/BTOzRRp.png
每个Order
包含多个[LineItem]
和多个[Designs]
但是,我想将每个[LineItem]
每个与订单中的1个或多个可用[Designs]
相关联。
如何才能做到这一点?
显然,我不能简单地在[LineItem]
和[Designs]
之间建立关系,对吗?
我想到了如下移动关系: https : //i.imgur.com/TqQCyqj.png
但是,然后我面临[Designs]
不再与[Order]
关联的问题。
您的图不是ER图。 要称为ER图,图解符号必须能够表示ER概念,例如实体集(表表示实体关系),三元和更高阶关系,关系上的属性以及关系上的关系。 您所拥有的是代表物理模型的表格图。
这是一个ER图(概念模型),显示了LineItems
和Designs
之间的多对多关系。 为简单起见,我忽略了非关键属性。
我也将其转换为物理模型。 但是,如果像第二个示例中那样实现LineItem_Designs
,则存在不一致的风险。 DBMS无法确保只有相同顺序的LineItems
和Designs
相互关联。 为了解决这个问题,我们可以使用受控冗余。
通过向LineItems_Designs
表添加OrderID
,我们可以使用重叠的复合FK约束来确保一致性。 (DesignID, OrderID)
在LineItems_Designs
将引用在相同的两个场Designs
,和(LineID, OrderID)
在LineItems_Designs
将引用相同的两个字段LineItems
。
这是一个简化的SQL脚本来说明:
CREATE TABLE Customers (
CustomerID INT NOT NULL,
Customer_Name VARCHAR(255) NULL,
Company_Name VARCHAR(255) NULL,
Phone_Number VARCHAR(255) NULL,
Email VARCHAR(255) NULL,
PRIMARY KEY (CustomerID)
);
CREATE TABLE Orders (
OrderID INT NOT NULL,
CustomerID INT NOT NULL,
Order_Title VARCHAR(255) NULL,
Order_Date DATE NULL,
Due_Date DATE NULL,
PRIMARY KEY (OrderID),
FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID)
);
CREATE TABLE Designs (
DesignID INT NOT NULL,
OrderID INT NOT NULL,
Design_Type VARCHAR(255) NULL,
Design_Location VARCHAR(255) NULL,
Design_Colors VARCHAR(255) NULL,
PRIMARY KEY (DesignID),
UNIQUE KEY Design_Order (DesignID, OrderID),
FOREIGN KEY (OrderID) REFERENCES Orders (OrderID)
);
CREATE TABLE LineItems (
LineID INT NOT NULL,
OrderID INT NOT NULL,
Product_Description VARCHAR(255) NULL,
Product_Color VARCHAR(255) NULL,
PRIMARY KEY (LineID),
UNIQUE KEY LineItem_Order (LineID, OrderID),
FOREIGN KEY (OrderID) REFERENCES Orders (OrderID)
);
CREATE TABLE LineItems_Designs (
DesignID INT NOT NULL,
LineID INT NOT NULL,
OrderID INT NOT NULL,
FOREIGN KEY (DesignID, OrderID) REFERENCES Designs (DesignID, OrderID)
FOREIGN KEY (LineID, OrderID) REFERENCES LineItems (LineID, OrderID)
);
请注意Designs
和LineItems
的复合唯一键以支持FK约束。
最后,请注意您的术语/概念。 尽管使用erd
和relational-database
标记了您的问题,但您的语言使我想起了网络数据模型。 在ER模型中,关系不映射到外键约束。 用Chen的方法,关系关系映射到他们自己的表。 如果允许将多对多的二元关系关系规范化为多面实体集的实体关系,则可以说该关系映射到表中的列集。 例如, LineItem
和Order
之间的关系由对(LineID PK, OrderID)
(无论是否在其自己的表中)。 外键约束仅仅是完整性约束,并不与表相关(请注意,SELECT查询不受其删除的影响)。 在关系模型中,表表示关系,而不是相关的元素。 相关的元素是值和域,分别代表实体和实体集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.