好的数据库设计在表中没有标识列,对吧?

时间:2009-10-28 22:11:17

标签: database sql-server-2008

在数据库的每个表中增加一个标识列有什么好处?有什么缺点?

更新: 现在我想扩展案例并引入复制。除了我们通过复制获得的rowguid之外,这个surogate键(identity comlumn)是什么?代表K. Brian Kelley的反对意见应该在此rowguid上设置聚集索引(并忘记identity-column)。你觉得怎么样?

2 个答案:

答案 0 :(得分:4)

简短版本:代理或合成密钥(你可能在“身份栏”中的意思)与自然密钥相比是一个非常古老的辩论。

代理键的优点:

  • 使您可以独立于自然键的变化(考虑新的需求/更改域模型),否则这些变化将通过您的数据模型级联
  • 有时, 没有自然键(例如地址簿中的人)
  • 通常更快,因为它更短(单个int列,而不是例如几个varchars)
  • 在连接等方面更方便,因为它只是一列

缺点:

  • 您仍需要每个候选自然键的唯一索引(因此需要另外一个索引)
  • 它对域名来说是陌生的,可能需要额外的联接来获取真实数据

一般来说,协议是代理键通常是一个好主意,除了像连接表这样的简单情况。

有关所有详细信息,请参阅Wikipedia,其中有一篇关于该主题的好文章。

答案 1 :(得分:3)

出于性能原因,通常使用代理键(IDENTITY列最常见)。您仍然应该识别自然键(根据数据使行唯一的列)。

通常,代理键是整数值。这使得它们很容易使用与其他表的连接链接在一起(并使用外键相应地进行限制)。此外,在谈论SQL Server时,所有非聚簇索引都依赖于聚簇索引。因此,如果聚簇索引基于自然键并且因此大小很大,那么所有非聚簇索引也会变大,因为它们将引用回聚簇索引。因此,许多人围绕基于整数的代理键构建主键。我知道我正在简化它,但这是使用代理键的一个关键原因。

缺点是代理键实际上毫无意义。如果有人要更改密钥的值,则可以在不存在或禁用外键约束时断开关系。如果进行更改以改变备用键,则实际上是在更改数据本身。因此,如果实体构建正确并且您将更改相关表中的数据,您会期望这样的中断。