具有强制子 类 到 SQL 表的 EER 图

EER diagram with mandatory sub-classes to SQL tables

我正在完成一项任务,为快餐店创建一个数据库,并且一直坚持从我的 EER 生成一个具有强制子类的关系模式。

我有一个带有子类 DeliveryOrder(CallStart,...) 和 PickUpOrder(PickUpName,...) 的 CustOrderDetails(OrderNo {PK}, EmployeeNo, DiscCode,...) 实体。这些是 "Maandatory/Disjoint",因此 CustOrderDetails 必须是其中之一,并且只能是其中之一。我的教科书和讲义暗示我需要创建单独的 table 来执行此操作,其中一个 table 中包含 CUstOrderDetails 的所有属性和 DeliveryOrder 的属性,另一个 table 中包含 CustOrderDetails 的所有属性和 PickUpOrder 的属性,如根据下面的选项 1。

我的问题是我不知道如何执行 "mandatory" 方面的事情,并且仍然能够 link table CustOrderItems(OrderNo, ItemCode, ItemPrice, ItemQty ) 显示订单的各个项目。

我看过一些关于 SO 的问答,但似乎没有任何内容专门提到 mandatory/or 参与限制。使用选项 2(已在其他问题中提出)似乎很简单 link PK 为 (OrderNo, ItemCode) 的 CustOrderItems,但我不知道这是否有效处理 Mandatory/Or 约束。

我的代码尝试如下。任何人都可以帮助解决这个问题。

请注意,这是我第一次介绍数据库设计和 SQL 编码。

选项 1

 DeliveryCustOrder(
 OrderNo    CHAR(7) PRIMARY KEY,
 EmployeeNo CHAR(7),
 DiscCode   CHAR(7),
 ...,
 CallStart  TIME DEFAULT GETDATE(),
 ...,
 FOREIGN KEY (DiscCode) references DiscProg(DiscCode)  ON UPDATE
 CASCADE ON DELETE NO ACTION
 )

 PickUpCustOrder(
 OrderNo    CHAR(7) PRIMARY KEY,
 EmployeeNo CHAR(7),
 DiscCode   CHAR(7),
 ...,
 PickUpName VARCHAR(25),
 ...,
 FOREIGN KEY (DiscCode) references DiscProg(DiscCode)  ON UPDATE
 CASCADE ON DELETE NO ACTION,
 FOREIGN KEY (Employee) references Employee(EmployeeNo) ON UPDATE
 CASCADE ON DELETE NO ACTION
 )

选项 2

 CustOrderDetail(
 OrderNo    CHAR(7) PRIMARY KEY,
 EmployeeNo CHAR(7),
 DiscCode   CHAR(7),
 ...,
 FOREIGN KEY (Employee) references Employee(EmployeeNo) ON UPDATE
 CASCADE ON DELETE NO ACTION,
 FOREIGN KEY (DiscCode) references DiscProg(DiscCode)  ON UPDATE
 CASCADE ON DELETE NO ACTION
 )

 DeliveryOrder (
 OrderNo   CHAR(7) PRIMARY KEY,
 CallStart TIME DEFAULT GETDATE(),
 ...,
 FOREIGN KEY (OrderNo) references CustOrderDetail(OrderNo) ON UPDATE
 CASCADE ON DELETE NO ACTION
 )

 PickUpOrder (
 OrderNo   CHAR(7) PRIMARY KEY,
 PickUpName VARCHAR(25),
 ...,
 FOREIGN KEY (OrderNo) references CustOrderDetail(OrderNo) ON UPDATE
 CASCADE ON DELETE NO ACTION
 )

P.S。我希望我的 "jargon" 是正确的! 提前致谢。

我可以想到两种方法。

  1. 在 CustOrderDetail table 中,添加两列:SubTypeTable(包含 "DeliveryOrder" 或 "PickupOrder",以及 SubTypeID(包含子类型的 PK table)。两列都不是 NULL,这强制订单必须与 SubType table 之一的一行且仅一行相关。缺点是您不能使用 FK,因为SubTypeID 可能与两个 table 中的任何一个相关。您只能使用触发器强制执行 RI。

  2. 在 CustOrderDetail table 中,添加两列:DeliveryOrderID 和 PickupOrderID。这些列可以为 NULL,并且每个列都将具有与其关联的子类型 table 的外键。缺点是您只能使用 CHECK 约束或 TRIGGER 强制执行 "One and Only One" 规则。此外,由于两个 SubTypeID 之一将始终为 NULL,因此您将具有一些内置的稀疏性。