我有两个具有以下属性(字段)的表:
接触
- ID联系方式
- 姓
- 名
- 父亲姓名
- IDGender
- 称呼
- 出生日期
- ...
法律实体
- IDLegalEntity
- 姓名
- 合法名称
- IDLegalForm
- ...
在我的数据库中,我想存储有关Customers的信息。
顾客
- ID客户
- 税号
- 税务局
- ...
客户可以是自然人(联系人)或公司(法人实体)。表Customer应如何与表Contact和表Legal Entity相关联,以便在其他表中使用唯一的 CustomerID(主键)?
我有两个具有以下属性(字段)的表:
在我的数据库中,我想存储有关Customers的信息。
客户可以是自然人(联系人)或公司(法人实体)。表Customer应如何与表Contact和表Legal Entity相关联,以便在其他表中使用唯一的 CustomerID(主键)?
这通常是通过实现一个超类型表来完成的。您可以通过在每个指向超类型的子类型表中放置一个外键来创建和子类型LegalEntity
。Contact
你可能会称它为PotentialCustomer
.
然后将Customer
表中的外键添加到适当的超类型记录(在 PotentialCustomer 中)。这使您可以将客户记录仅链接到一个表,避免使用多个可为空的外键。
它还允许您拥有一个超类型的单个实例,该实例恰好同时是多个子类型。这可能不适用于您的情况,但在您的法人实体在您的业务中扮演特定角色的情况下通常会出现这种情况。例如,很多时候您的供应商也可以是您的客户。
我会改变很多事情。首先,摆脱您那里的愚蠢的 ID 命名方案。以 ID 开头的一切看起来很奇怪。通常你会以 ID 结尾,大多数 ORM 会寻找以 ID 结尾的约定。
其次,除非他们碰巧是一家公司的联系人,否则我不会称您的自然人为“联系人”。否则,称他们为 Person。
第三,两者都使用取决于你想怎么做。您想一视同仁地对待所有客户、人员和合法实体吗?如果是这种情况,您需要一个具有 UniqueID 的客户表。您使用相同的 id 作为您的 Person/Contact 表和 LegalEntity 的主键。这将创建客户到客户类型的 1:1 映射,并且它们共享一个通用 ID 系统。
在客户表中创建列CustomerType(个人/法人实体),在法人实体和联系人(子)表中创建外键CustomerId,以引用客户(父)表中的列CustomerId。