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

Database 好的数据库设计在表中没有标识列,对吗?,database,sql-server-2008,Database,Sql Server 2008,在数据库的每个表中增加一个标识列有什么好处?缺点是什么 更新: 现在我想扩展案例并介绍复制。除了复制得到的rowguid之外,这个surogate键(identity-comlumn)还有什么用。代表K.Brian Kelley的反对意见,我们应该在此rowguid上设置聚集索引(并且忘记标识列)。您认为呢?通常,出于性能原因,会使用代理键,其中标识列是最常见的。您仍然应该识别自然键(根据数据使行唯一的列) 通常,代理键是整数值。这使得它们很容易使用与其他表的联接链接在一起(并相应地限制使用外键

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

更新:
现在我想扩展案例并介绍复制。除了复制得到的rowguid之外,这个surogate键(identity-comlumn)还有什么用。代表K.Brian Kelley的反对意见,我们应该在此rowguid上设置聚集索引(并且忘记标识列)。您认为呢?

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

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


缺点是代理密钥实际上没有意义。如果有人要更改键的值,如果外键约束不存在或被禁用,则可能会中断关系。在更改替换键的情况下,实际上是在更改数据本身。因此,如果实体构建正确,并且您也将更改相关表中的数据,那么您可能会遇到这种中断。

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

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


缺点是代理密钥实际上没有意义。如果有人要更改键的值,如果外键约束不存在或被禁用,则可能会中断关系。在更改替换键的情况下,实际上是在更改数据本身。因此,如果实体正确构建,并且您也将更改相关表中的数据,那么您可能会期望出现这样的中断。

简短版本:代理键或合成键(您可能指的是“标识列”)与自然键是一个非常古老的争论

代理密钥的优点:

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

  • 对于每个候选自然键,您仍然需要一个唯一的索引(因此还需要一个索引)
  • 它与域无关,可能需要额外的连接才能获得真实数据
一般来说,一致认为代理键通常是一个好主意,但在联接表等简单情况下除外


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

简短版本:代理键或合成键(您可能指的是“标识列”)与自然键是一个非常古老的争论

代理密钥的优点:

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

  • 对于每个候选自然键,您仍然需要一个唯一的索引(因此还需要一个索引)
  • 它与域无关,可能需要额外的连接才能获得真实数据
一般来说,一致认为代理键通常是一个好主意,但在联接表等简单情况下除外


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

您指的是列(标识列)而不是行吗?是的!这是我的错,我弄错了。我已经改变了,现在应该清楚了,thx Jonathan。你指的是列(标识列)而不是行吗?是的!这是我的错,我弄错了。我改变了这一点,现在应该很清楚了,thx Jonathan。实际上,使用代理密钥的一个更重要的原因是它可以保护您免受数据模型更改的影响。如果数据模型发生了变化,并随之改变了您的自然关键点,该怎么办?如果使用自然键,还必须更改所有外键(以及使用它的所有代码)。代理键可以防止这种情况。此外,甚至有些情况下不存在合理的自然密钥(例如地址簿中的人,有不同的人具有相同的姓名和地址)。我绝对同意不存在自然密钥的情况。有时候确实如此