我知道这是一个常见的问题,我只是非常生疏,不记得如何正确建模这个图。
https://i.imgur.com/BTOzRRp.png
每个[LineItem]
包含多个[Designs]
和多个[LineItem]
但是,每个[Designs]
我都希望在订单中关联一个或多个可用的[LineItem]
。
如何做到这一点?
显然,我不能简单地在[Designs]
和[Designs]
之间建立关系,对吗?
我想要将关系移动如下: https://i.imgur.com/TqQCyqj.png
然而,我遇到[Order]
不再与import {AdalService} from 'ng2-adal/core';
class whateverComponent{
public logOut() {
this.adalService.logOut();
}
}
相关联的问题。
答案 0 :(得分:0)
您的图表不是ER图表。要称为ER图,图表符号必须能够表示ER概念,如实体集(表表示实体关系),三元和更高阶关系,关系属性和关系关系。你所拥有的是表格图,代表物理模型。
这是一张ER图(概念模型),显示了LineItems
和Designs
之间的多对多关系。为简单起见,我遗漏了非关键属性。
我还将其翻译成物理模型。但是,如果在第二个示例中实现LineItem_Designs
,则存在不一致的风险。 DBMS无法确保只有来自同一订单的LineItems
和Designs
相互关联。为了解决这个问题,我们可以使用受控冗余。
通过将OrderID
添加到LineItems_Designs
表,我们可以使用重叠的复合FK约束来确保一致性。 (DesignID, OrderID)
中的LineItems_Designs
将在Designs
中引用相同的两个字段,(LineID, OrderID)
中的LineItems_Designs
将引用LineItems
中的相同两个字段。< / p>
这是一个简化的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查询不受其删除的影响)。在关系模型中,表表示关系,而不是相关的元素。相关的元素是值和域,分别代表实体和实体集。