在数据库的每个表中增加一个标识列有什么好处?有什么缺点?
更新: 现在我想扩展案例并引入复制。除了我们通过复制获得的rowguid之外,这个surogate键(identity comlumn)是什么?代表K. Brian Kelley的反对意见应该在此rowguid上设置聚集索引(并忘记identity-column)。你觉得怎么样?
答案 0 :(得分:4)
简短版本:代理或合成密钥(你可能在“身份栏”中的意思)与自然密钥相比是一个非常古老的辩论。
代理键的优点:
缺点:
一般来说,协议是代理键通常是一个好主意,除了像连接表这样的简单情况。
有关所有详细信息,请参阅Wikipedia,其中有一篇关于该主题的好文章。
答案 1 :(得分:3)
出于性能原因,通常使用代理键(IDENTITY列最常见)。您仍然应该识别自然键(根据数据使行唯一的列)。
通常,代理键是整数值。这使得它们很容易使用与其他表的连接链接在一起(并使用外键相应地进行限制)。此外,在谈论SQL Server时,所有非聚簇索引都依赖于聚簇索引。因此,如果聚簇索引基于自然键并且因此大小很大,那么所有非聚簇索引也会变大,因为它们将引用回聚簇索引。因此,许多人围绕基于整数的代理键构建主键。我知道我正在简化它,但这是使用代理键的一个关键原因。
缺点是代理键实际上毫无意义。如果有人要更改密钥的值,则可以在不存在或禁用外键约束时断开关系。如果进行更改以改变备用键,则实际上是在更改数据本身。因此,如果实体构建正确并且您将更改相关表中的数据,您会期望这样的中断。