我有一个表,其中有四列都是不可为空的,并且数据使得需要所有四列来区分唯一记录。这意味着如果我要创建一个主键,它需要包含所有列。对表的查询几乎总是拉回一条记录,即查询中的所有列都将被过滤。
由于需要搜索每一列,拥有主键对我有好处吗(除了强制记录的唯一性)?
我有一个表,其中有四列都是不可为空的,并且数据使得需要所有四列来区分唯一记录。这意味着如果我要创建一个主键,它需要包含所有列。对表的查询几乎总是拉回一条记录,即查询中的所有列都将被过滤。
由于需要搜索每一列,拥有主键对我有好处吗(除了强制记录的唯一性)?
在您的情况下,这些字段是自然键。
主键的代理键与自然键
我更喜欢添加代理键来分离业务和数据库模型管理。其他问题是在主键上使用聚集索引和非聚集索引。如果您更改表(非静态表,它具有高强度的插入或更新),如果在非单调增加的键上使用聚集索引,您将遇到性能问题。
通常建议您在这种情况下使用代理键,因此其他表中的外键(以及可能存储在外部的任何记录引用,例如它们是否承载在 http(s) 请求引用的查询字符串中)的记录)有一些东西可以参考,如果行中的数据发生变化,它不会改变。如果你这样做,那将是你的主键。
如果您不添加这样的代理键,那么考虑到您如何描述将所有四列作为主键访问的数据将不会是一个缺点。如果您将键设置为表的聚集索引,它将有助于这样的请求,因为磁盘上的 b 树中将有一层可以向下查找给定行的数据。
作为主键的复合键也会遇到索引大小问题,这些问题会影响磁盘使用、io 速度和备份。您可能想在这里查看 Kimberly Tripp 关于主键和聚集索引的帖子:http ://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Clustered-Index-Debate-again!.aspx
在这种情况下,我也建议使用代理键而不是自然键。
如果您有一个表表示只有 2 列的多对多关系,这似乎是合理的。
参照。这个问题
但我承认,即使在这些情况下,我也会添加代理键。