xpt Asked: 2023-01-03 14:05:59 +0800 CST2023-01-03 14:05:59 +0800 CST 2023-01-03 14:05:59 +0800 CST 一对多关系的两种类型 772 第一次在这里发布海报,2023 年快乐! 在谈论不同类型的实体关系时,我倾向于认为以下三种: 一对一 一对多/多对一 多对多 但是,我知道鱼尾纹符号将一对多分为两种类型: 即, “CUSTOMER places ORDER”可以有零个或多个,但是 “ORDER contains LINE-ITEM ”必须一对多 我知道它更准确,但我从未进一步考虑对 DDL 和 DML 级别的影响。所以, 请问这两种一对多关系在DDL和DML层面有什么影响?例如, 如果我告诉或不告诉他们一部分,那么在定义 DDL 中的关系时有什么区别;以及做 DML 时的限制。我会得到或失去什么? relational-theory 1 个回答 Voted Best Answer David Browne - Microsoft 2023-01-03T14:36:45+08:002023-01-03T14:36:45+08:00 没有自然的、一流的方法来在 RDBMS 中对一对(一个或多个)进行建模。 您可以通过在 SalesOrder 上添加指向某些 LineItem 的外键来对此建模,但实际上很少这样做。 您使用外键对所有 1-1、1-多、1-零或一以及 1-一对多进行建模。 这些关系之间存在影响 DDL 的重要差异,但您使用的表示法并未体现这一点。Order 和 customer 之间的关系是弱关系,因为你可以有一个没有 customer 的订单,而 Order 和 Customer 都是“强实体”。Order 和 LineItem 之间的关系很强,因为没有订单就没有 LineItem,而 LineItem 是一个“弱实体”。 对 DDL 的影响是强包含类型关系通过多边外键作为其键的子集并通过使用级联删除来规范建模。 在 SQL Server 中,我会将其建模为 create table Customer ( CustomerNumber varchar(20) primary key, Name nvarchar(200), Sector varchar(20) ) create table SalesOrder ( OrderNumber int identity primary key, CustomerNumber varchar(20) null references Customer on delete set null, DeliveryAddress nvarchar(200) ) create table SalesOrderLineItem ( SalesOrderId int not null references SalesOrder on delete cascade, SalesOrderLineItemId int identity not null, Quantity int, PricePerUnit decimal(20,2), primary key (SalesOrderId, SalesOrderLineItemId) )
没有自然的、一流的方法来在 RDBMS 中对一对(一个或多个)进行建模。
您可以通过在 SalesOrder 上添加指向某些 LineItem 的外键来对此建模,但实际上很少这样做。
您使用外键对所有 1-1、1-多、1-零或一以及 1-一对多进行建模。
这些关系之间存在影响 DDL 的重要差异,但您使用的表示法并未体现这一点。Order 和 customer 之间的关系是弱关系,因为你可以有一个没有 customer 的订单,而 Order 和 Customer 都是“强实体”。Order 和 LineItem 之间的关系很强,因为没有订单就没有 LineItem,而 LineItem 是一个“弱实体”。
对 DDL 的影响是强包含类型关系通过多边外键作为其键的子集并通过使用级联删除来规范建模。
在 SQL Server 中,我会将其建模为