在代理键和自然键之间有一个健康的争论:
我的观点似乎与大多数人一致(这是微弱的多数),您应该使用代理键,除非自然键是完全明显的并且保证不会改变。然后你应该对自然键强制唯一性。这意味着几乎所有时间都使用代理键。
两种方法的示例,从 Company 表开始:
1:代理键:表有一个ID字段,即PK(和一个身份)。公司名称在各州必须是唯一的,因此那里有一个唯一的约束。
2:自然键:表使用CompanyName和State作为PK——同时满足PK和唯一性。
假设公司 PK 在其他 10 个表中使用。我的假设是,没有数字支持,代理键方法在这里会快得多。
对于自然键,我看到的唯一令人信服的论点是使用两个外键作为自然键的多对多表。我认为在这种情况下这是有道理的。但是如果你需要重构,你可能会遇到麻烦;我认为这超出了这篇文章的范围。
有没有人看过一篇文章比较使用代理键的一组表与使用自然键的同一组表的性能差异?环顾 SO 和谷歌并没有产生任何有价值的东西,只是大量的理论。
重要更新:我已经开始构建一组测试表来回答这个问题。它看起来像这样:
- PartNatural - 使用唯一 PartNumber 作为 PK 的零件表
- PartSurrogate - 使用 ID (int, identity) 作为 PK 并在 PartNumber 上具有唯一索引的部件表
- 植物 - ID (int, identity) 作为 PK
- Engineer - ID (int, identity) 作为 PK
每个零件都连接到工厂,工厂中零件的每个实例都连接到工程师。如果有人对此测试台有疑问,现在是时候了。