可空外键与普通父键

时间:2011-11-07 21:19:44

标签: sql tsql

在我们有客户,供应商和&所有具有共同属性的分支,例如地址,这是一个更好的解决方案,为什么?

解决方案1:

  • 客户表

  • 供应商表

  • 分支表

  • 包含CustomerID,VendorID,BranchID的可空外键的地址表

解决方案2:

  • 实体表

  • 包含EntityID的客户表

  • 包含EntityID的供应商表

  • 包含EntityID的分支表

  • 包含EntityID的地址表和EntityType标志为“C”,“V”或“B”

解决方案3(由AJC建议):

  • 客户表

  • 供应商表

  • 分支表

  • 地址表

  • 客户与地址之间的CustomerAddress外部参照表

  • 供应商和地址之间的VendorAddress xref表

  • 分支和地址之间的BranchAddress外部参照表

解决方案4(由9000建议)

  • 客户表

  • 供应商表

  • 分支表

  • FK到客户的CustomerAddress

  • FK与供应商的VendorAddress

  • BranchAddress with FK to Branch

  • vwAddress UNION ALLs上述每个地址表,并包含一个类型标志('B','C','V')

注意:

每个客户,供应商或分支机构可能有多个地址,但至少应有一个。

如果“实体”既是客户又是供应商,则每个角色可以有单独的地址。

想知道客户是否也是供应商。

2 个答案:

答案 0 :(得分:3)

(这基本上是@AJC所说的,只是解释过。)

解决方案1可能允许为最多三个不同类型的实体分配相同的地址。除非后者完全是您的意图,否则请避免使用此解决方案。

解决方案2允许为客户等分配“B”类型地址。可能这也不是您想要的。

据我了解您的意图,您需要能够为实体分配多个地址,但不能相反。

为每个实体类型创建一个地址表:CustomerAddress,其中FK引用CustomerVendorAddress,FK引用Vendor等。除了严格的引用完整性和不可能分配这是一个不正确类型的地址,这使您能够扩展每种类型的地址,并使用仅对其有意义的额外字段。

要更轻松地查询所有地址,您可以创建一个视图Address,其中包含公共字段和类型标记('B','C','V')以查看哪种地址是这个。

答案 1 :(得分:2)

C)以上都不是。

正确的方法是分别使用地址表和CustomerAddress,VendorAddress和BranchAddress将每个C V B实体与一个或多个地址连接起来。

对于一对一的属性,显然不需要额外的表,只需将Id添加到主表(AddressId)......

相关问题