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


17

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

由于将需要搜索每一列,因此拥有主键是否对我完全有益(除了强制记录的唯一性)?

Answers:


12

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

代理密钥:

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

自然键:

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

替代键与主键的自然键

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


2
我通常告诉人们他们应该使用代理键,除非他们想保证索引碎片和性能不佳。总是有例外,但在这种情况下很少。
AndrewSQL 2011年

7

通常建议您在这种情况下使用代理键,以便将其他表(以及可能存储在外部的任何记录引用)中的外键(例如,它们携带在查询字符串中,其中http(s)请求引用了一个)记录)有要引用的内容,如果行中的数据发生更改,这些内容也不会更改。如果这样做,那将是您的主键。

如果您不添加这样的代理键,那么考虑如何描述将所有四列都作为主键的正在访问的数据,将不是不利的。如果将键作为表的聚集索引,它将帮助此类请求,因为磁盘上的b树中将有一层向下查找给定行的数据。


1

复合键作为主键还会遇到索引大小问题,这可能会影响磁盘使用,io速度和备份。您可能想在这里查看Kimberly Tripp关于主键和聚集索引的帖子:http ://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Clustered-Index-Debate-again!.aspx

我也建议在这种情况下使用替代密钥,而不是自然密钥。


0

如果您有一个表示多对多关系的表只有2列,这似乎是合理的。

cf. 这个问题

但我承认,即使在这种情况下,我也要添加代理密钥。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.