【问题标题】:How to represent this type of FK relationship in SQL Server 2005?如何在 SQL Server 2005 中表示这种类型的 FK 关系?
【发布时间】:2011-11-03 09:48:45
【问题描述】:

假设我有两个父表:CompanyContact。假设CompanyContact 记录都需要针对它们记录0 个或多个地址,其中两种记录类型的地址格式相同。这意味着需要第三张表Address 来存储地址。

我的问题是,CompanyContactAddress 之间的关系如何使用外键约束来表达,这样CASCADE DELETE 这样的东西才能起作用? (我猜这意味着地址中不能有OwnerTable 字段)。

我使用的是 SQL Server 2005。

【问题讨论】:

    标签: sql sql-server sql-server-2005 constraints


    【解决方案1】:

    声明:
    - 每个公司可以有多个地址
    - 每个联系人可以有多个地址


    这似乎也暗示了每个地址都可以重复使用多次:
    - 每个地址可以有很多公司/联系人

    如果是这种情况,那么您实际上需要一个链接表,允许多对多关系。在您的情况下,我将有一个公司(CompanyID,AddressID)的链接表和一个联系人(ContactID,AddressID)的链接表。

    您可以进行配置,例如删除地址会删除链接表中的所有相应记录。但是如果所有映射的公司和联系人都被删除,则要删除和地址,这将需要一个触发器。


    如果一个地址实际上只使用一次,并且您明确希望删除公司/联系人以删除关联的地址...
    1. 再次使用触发器
    2.有一个ContactAddress表和一个CompanyAddressTable

    我不知道有什么技巧可以让一个表将外键指向两个不同的表,并允许两个主表级联删除到单个外表。 SQL Server 明确禁止这样做,以防止循环引用之间的级联删除。

    【讨论】:

    • 谢谢,我认为这完美地描述了我的情况和采取的方法。
    【解决方案2】:

    如果地址是共享的,自动级联是否应该工作?您可以使用INSTEAD OF DELETE 触发器来正确实现此特殊级联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      相关资源
      最近更新 更多