【问题标题】:How to represent this type of FK relationship in SQL Server 2005?如何在 SQL Server 2005 中表示这种类型的 FK 关系?
【发布时间】:2011-11-03 09:48:45
【问题描述】:
假设我有两个父表:Company 和 Contact。假设Company 和Contact 记录都需要针对它们记录0 个或多个地址,其中两种记录类型的地址格式相同。这意味着需要第三张表Address 来存储地址。
我的问题是,Company 和Contact 和Address 之间的关系如何使用外键约束来表达,这样CASCADE DELETE 这样的东西才能起作用? (我猜这意味着地址中不能有OwnerTable 字段)。
我使用的是 SQL Server 2005。
【问题讨论】:
标签:
sql
sql-server
sql-server-2005
constraints
【解决方案1】:
声明:
- 每个公司可以有多个地址
- 每个联系人可以有多个地址
这似乎也暗示了每个地址都可以重复使用多次:
- 每个地址可以有很多公司/联系人
如果是这种情况,那么您实际上需要一个链接表,允许多对多关系。在您的情况下,我将有一个公司(CompanyID,AddressID)的链接表和一个联系人(ContactID,AddressID)的链接表。
您可以进行配置,例如删除地址会删除链接表中的所有相应记录。但是如果所有映射的公司和联系人都被删除,则要删除和地址,这将需要一个触发器。
如果一个地址实际上只使用一次,并且您明确希望删除公司/联系人以删除关联的地址...
1. 再次使用触发器
2.有一个ContactAddress表和一个CompanyAddressTable
我不知道有什么技巧可以让一个表将外键指向两个不同的表,并允许两个主表级联删除到单个外表。 SQL Server 明确禁止这样做,以防止循环引用之间的级联删除。