2

这里是 ER 图的一部分。

这里,Customer 是超类,Private 和 Business 是子类,强制参与不相交,Business 客户又是 Silver、Gold 和 Diamond 子类的超类,强制参与不相交

快速解释:客户分为商业和私人。商业客户有三种会员选择:银牌:10% 折扣,金牌:25% 折扣,钻石:40% 折扣。将上述内容映射到关系模式的最佳方法是什么?什么是区分属性和通用属性?目前,我想出了以下几点:

4 张表 - PrivateCustomer(来自 Customer Superclass)和 SilverMember、GoldMember 和 DiamondMember(来自 Business Superclass)

PrivateCustomer (CuID, CuFirstName, CuLastName, CuDOB, CompanyName, CuAddressLine1, CuAddressLine2, PhoneNumber, CuEmail, CuNotes, CuLocID)

SilverMember (CuID, ????? DiscPerc, DiscAccrued, CuLocID)

GoldMember (CuID, ???? DiscPerc, DiscAccrued, CuLocID)

DiamondMember (CuID, ???? DiscPerc, DiscAccrued, CuLocID)

CuLocID是一个外键,用于删除与邮政编码、城市、国家/地区相关的传递依赖项(存储在不同表中的位置详细信息 - tblCuLoc

4

1 回答 1

0

首先,我认为您的 ERM 设计不佳,因为您应该更好地使用角色模式,而不是将它们放入实体中。换句话说,membership options和Silver没有实体。GoldDiamond

要回答您的问题,您可以通过三个选项来映射您的课程:

  1. 类层次结构的所有属性都进入一个表(单表继承)。
  2. 每个类的所有属性都进入一个单独的表(类表继承)。
  3. 所有非抽象类的所有属性都进入一个单独的表(具体表继承)。

但老实说,您应该在之前修改您的 ERM。至少您应该为折扣会员(例如Discount Group)创建一个具有属性的实体Percentage,以及您的实体和您的实体Name之间的一对多关系。您还可以对客户实体本身使用角色模式,而不是为它们使用子类。这是我作为 UML 中的 ERM 以提高折扣成员资格的建议:Business CustomerDiscount Group

改进原始 ERM 的建议

通过使用例如 2. 方法(类表继承)将其映射到关系模式,您将具有以下关系:

  • customer(id, ...)
  • business_customer(id, ...)
  • private_customer(id, ...)
  • discount_membership(customer_id, group_id, discount_accrued)
  • discount_group(id, name, discount_percantage)

要强制多重性,discount_membership您应该在列上使用唯一的约束customer_id,当然还有正确的外键约束。

于 2013-03-23T01:16:51.303 回答