包含表的所有列的主键有什么好处吗?

gor*_*ric 17 sql-server-2005 primary-key

我有一个包含四列的表,这些列都是不可为空的,并且数据是这样的,需要所有四列来区分唯一记录。这意味着如果我要创建一个主键,它需要包含所有列。对表的查询几乎总是拉回单个记录,即所有列都将在查询中被过滤。

由于需要搜索每一列,拥有主键对我有好处吗(除了强制记录的唯一性)?

gar*_*rik 12

在您的情况下,这些字段是自然键。

代理键:

代理键是没有“业务”含义的键,仅用于标识表中的记录。此类键要么是数据库生成的(例如:SQL Server 中的标识、Oracle 中的序列、DB2 UDB 中的序列/标识等)要么是系统生成的值(例如通过模式中的表生成)。

自然键:

如果键代表的属性用于独立于数据库模式的标识,则键是自然的。这基本上意味着,如果人们使用它们,密钥是自然的,例如:发票号码、税号、SSN 等。

主键的代理键与自然键

我更喜欢添加代理键来分离业务和数据库模型管理。另一个问题是在主键上使用聚簇索引和非聚簇索引。如果您更改表(非静态表,它具有高密集插入或更新),则在非单调增加的键上使用聚簇索引的情况下,您将遇到性能问题。

  • 我通常告诉人们他们应该使用代理键,除非他们想保证碎片索引和糟糕的性能。总是有例外,但在这种情况下非常非常少。 (2认同)

Dav*_*ett 7

通常建议您在这种情况下使用代理键,因此其他表中的外键(以及可能存储在外部的任何记录引用,例如如果它们被携带在 http(s) 请求引用的查询字符串中的记录)有一些东西可以参考,如果行中的数据发生变化,这些东西不会改变。如果你这样做,那么这将是你的主键。

如果您不添加这样的代理键,那么考虑到您如何描述将所有四列作为主键访问的数据,这不会是一个缺点。如果您将键作为表的聚集索引,它将有助于此类请求,因为磁盘上的 b 树中有一个级别可以向下查找给定行的数据。