gpt4 book ai didi

sql - 可为空的外键与公共(public)父键

转载 作者:行者123 更新时间:2023-12-04 18:25:19 26 4
gpt4 key购买 nike

如果我们的客户、供应商和分支机构都具有共同的属性(例如地址),那么哪个是更好的解决方案,为什么?

解决方案一:

  • 客户表

  • 供应商表

  • 支表

  • 具有 CustomerID、VendorID、BranchID 的可为空外键的地址表

解决方案 2:

  • 实体表

  • 带有 EntityID 的客户表

  • 带有 EntityID 的供应商表

  • 带有EntityID的分支表

  • 具有 EntityID 和“C”、“V”或“B”的 EntityType 标志的地址表

解决方案 3(AJC 建议):

  • 客户表

  • 供应商表

  • 支表

  • 地址表

  • Customer 和 Address 之间的 CustomerAddress 外部参照表

  • 供应商和地址之间的 VendorAddress 外部参照表

  • BranchAddress Branch 和 Address 之间的外部参照表

方案四(9000推荐)

  • 客户表

  • 供应商表

  • 支表

  • CustomerAddress 与 FK 到 Customer

  • VendorAddress 与供应商的 FK

  • BranchAddress 与 FK 到 Branch

  • vwAddress which UNION ALL 上面的每一个地址表,并且包括一个类型标志('B','C','V')

注意事项:

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

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

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

最佳答案

(这基本上就是@AJC说的,只是解释一下。)

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

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

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

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

要更轻松地查询所有地址,您可以创建一个 View Address,其中将包含公共(public)字段和一个类型标志('B'、'C'、'V')以查看类型地址的是这里。

关于sql - 可为空的外键与公共(public)父键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8042741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com