表示两个表之间关系的行业设计标准是什么?应该使用复合键,还是分开的主键和外键?这两个选项之间有性能差异吗?
例如,假设您有一个用户,该用户可以有零个或多个订单。您拥有具有属性
PK UserID
和 Name
的用户表。没有用户,订单永远不会存在。现在,这就是我问题的核心所在......
您是否遵循第一张图,其中
OrderID
和 UserID
之间使用了复合键?或者,您是否遵循第二张图,其中没有复合键,并且订单只是通过
OrderID
和 User 表中的 FK UserID
来标识?一般规则是“让你的键尽可能窄,除非你有明确的要求来扩展它们”。
典型情况
按照您的示例,当您开始设计
OrderDetails
桌子时,对于设计 1,您的选择是:
OrderId, UserId
迁移到子表中,或者Orders
表中引入一些单列备用密钥,并引用该AK,而不是PK。如果您确实需要订单详细信息中的用户(这极不可能),则前一个模式很好,但您可能不需要。此外,如果您需要实现“更改订单所有权”之类的功能,使用第一种方法您会发现任务突然变得比正常情况下更加复杂。
因此,在绝大多数情况下,后一种设计是可行的。
极端情况
假设您有一些特殊的业务需求,请说:
对于每个用户,订单号应该形成一个独立于任何其他用户的订单的序列。
看起来是设计 1 的合理理由,不是吗?嗯,是的,也不是。当然,您必须创建一个由
UserId, OrderId
组成的复合键,以便不同用户可以重复使用订单号,但是:
Id bigint identity(1,1) primary key
并从任何地方引用它即可。