代码之家  ›  专栏  ›  技术社区  ›  Ice

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

  •  1
  • Ice  · 技术社区  · 15 年前

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

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   sleske    15 年前

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

    代理密钥的优点:

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

    欺骗:

    • 对于每个候选自然键,您仍然需要一个唯一的索引(因此还需要一个索引)

    一般来说,一致认为代理键通常是一个好主意,但在联接表等简单情况下除外。

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

        2
  •  3
  •   Rob Morrison K. Brian Kelley    10 年前

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

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