带有SQL表的强制子类的EER图

时间:2015-05-07 13:18:00

标签: sql sql-server mapping relational

我正致力于为快餐店创建一个数据库,并且我很难从我的EER生成一个具有强制性子类的关系模式。

我有一个CustOrderDetails(OrderNo {PK},EmployeeNo,DiscCode,....)实体,子类为DeliveryOrder(CallStart,...)和PickUpOrder(PickUpName,...)。这些是“Maandatory / Disjoint”,因此CustOrderDetails必须是其中之一,并且只能是其中之一。我的教科书和讲义意味着我需要创建单独的表来执行此操作,在一个表中使用CUOOrderDetails的所有属性和DeliveryOrder的属性,以及另一个表中的CustOrderDetails AND属性PickUpOrder的所有属性,如下面的选项1所示。

我的问题是我无法弄清楚如何强制执行“强制”方面的事情,并且仍然能够链接表CustOrderItems(OrderNo,ItemCode,ItemPrice,ItemQty),该表显示订单的各个项目。

我已经在SO上查看了一些Q& A,但似乎没有任何具体的参考强制/或参与约束。使用选项2(已在其他问题中提出)似乎很简单,可以将CustOrderItems与PK链接为(OrderNo,ItemCode),但我不知道这有效地处理了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。我希望我的“行话”正确! 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我可以想到两种方式。

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

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