代理键和自然键之间存在着健康的争论: SO Post 1 SO Post 2我的观点似乎与大多数人(微弱多数)一致,除非自然键是完全明显的并且保证不会改变,否则您应该使用代理键。然后你应该在自然键上强制唯一性。这意味着几乎所有时间都使用代理键。两种方法的示例,从 Company 表开始:1:代理键:表有一个 ID 字段,它是 PK(和一个身份)。公司名称按州要求是唯一的,因此这里有一个唯一的约束。2:自然键:表使用CompanyName和State作为PK——既满足PK又满足唯一性。假设公司 PK 用于其他 10 个表。我的假设(没有数字支持)是代理键方法在这里会快得多。我见过的关于自然键的唯一令人信服的论点是使用两个外键作为自然键的多对多表。我认为在这种情况下这是有道理的。但是如果你需要重构,你可能会遇到麻烦;我认为这超出了这篇文章的范围。有没有人看过一篇文章比较 性能差异 在一组使用 代理键的表 与 使用 自然键 的同一组表?环顾 SO 和 Google 并没有产生任何有值(value)的东西,只是大量的理论制作。 重要更新 :我已经开始构建一组 测试表 来回答这个问题。它看起来像这样: PartNatural - 使用的零件表唯一的 PartNumber 作为 PK PartSurrogate - 零件表使用 ID (int, identity) 作为 PK 和在 PartNumber 上有一个唯一索引 工厂 - ID (int, identity) 作为 PK 工程师 - ID (int, identity) 作为 PK 每个零件都与一个工厂相连,工厂中零件的每个实例都与一个工程师相连。如果有人对此测试平台有疑问,现在是时候了。 最佳答案 两个都用!自然键防止数据库损坏(不一致可能是一个更好的词)。当出于性能目的,“正确的”自然键(以消除重复的行)由于长度或涉及的列数而导致性能下降时,也可以添加替代键并用作其他表中的外键,而不是自然键...但自然键应保留为备用键或唯一索引,以防止数据损坏并强制执行数据库一致性...大部分 hoohah(在关于这个问题的“辩论”中)可能是由于错误的假设 - 您必须使用 主键 用于其他表中的连接和外键。这是错误的。您可以使用 ANY 键作为其他表中外键的目标。它可以是主键、备用键或任何唯一索引或唯一约束。只要它在目标关系(表)中是唯一的。至于连接,您可以对连接条件使用任何东西,它甚至不必是键、索引,甚至是唯一的! (尽管如果它不是唯一的,您将在它创建的笛卡尔积中获得多行)。您甚至可以使用非特定条件(例如 >、实际上,您可以使用任何计算为 bool 值的有效 SQL 表达式来创建连接。关于database - 代理vs自然键: hard numbers on performance differences?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1229173/ 10-10 03:23