复合主键与基于一列的主键相对

时间:2010-08-19 07:41:29

标签: database-design

我已经通过链接:

Database Design: Composite key vs one column primary key

我的问题:

对于一个永远不能作为任何其他表的外键引用的表,具有基于单列的主键与多列/复合列主键的插入/更新方面的+ ve / -ve方面是什么?

由于

4 个答案:

答案 0 :(得分:3)

是的,如果出现以下情况,多列主键仍然是一个糟糕的选择:

  • 您的主键也是群集密钥
  • 您的表格还包含其他非聚集索引

由于:

  • 来自聚类键的值(例如单个INT列或您的复合键)将被添加到每个非聚集索引中的每个条目

因此:如果你有一个200字节大小的复合主键,并且你的表上有一些非聚集索引,你就会在SQL上浪费很多的内存服务器 - 而不仅仅是(相对便宜的)磁盘,还有SQL Server主内存(通常不那么便宜)。

除了浪费空间外,您的性能也会滞后,因为较大的索引意味着相同操作的磁盘I / O更多。

一般情况下:如果您永远不需要引用该表,那么在您的表 上使用复合主键(实际上从未,甚至将来都不会),如果您有没有其他该表上的非聚集索引。

答案 1 :(得分:1)

你怎么可能绝对肯定你的钥匙“永远不会被FK引用”?

您的属性组合确实是唯一的(否则您不会考虑将其作为'主键')。

因此,您的属性组合是表格中描述的真实世界物品的有效识别方法。

说FK永远不会引用它等于说“没有关于此类事情的额外信息将与业务相关”。你怎么可能知道?

答案 2 :(得分:0)

业务要求(数据完整性要求)应该是实施哪些密钥的决定性因素。在一个属性上强制执行唯一性显然与在多个属性上强制执行它不同,因为在一个案例中允许的重复项在另一个案例中是不允许的(除非您当然实现两个键)。 / p>

请注意,marc的答案仅适用于聚簇索引,而不适用于主键。它们不是同一件事。他的答案也是针对SQL Server的。

答案 3 :(得分:0)

在这个问题上有两种相互竞争的哲学。

我坚定地在为某些桌子使用复合主键的阵营中,我自己。

当我设计数据库时,我使用ER建模在一个地方收集信息需求。数据库要提供的每个值都是属性的实例,每个属性都描述主题实体或两个或多个主题实体之间的关系。外键不会进入分析阶段。

在开始数据库设计之前,我从应用程序的角度决定如何识别每个实体。这些将给我我的主键。每个描述实体的表都有一个简单的主键,即实体的标识符。简单的关系(二元,多对一)不需要自己的表。描述复杂关系的每个表都将具有由参与实体的主键组成的复合主键。

外键以明显的方式插入。好吧,至少对我来说很明显。这提供了3NF的初始表格设计,可能更高。表格设计可能会通过进一步标准化或与标准化不兼容的其他设计模式(所谓的非规范化)而改变。但这是桌面设计的第一次削减。

与业务实践相比,这种设计实践在性能和数据完整性方面产生了不同的结果。 prevaling实践将一个名为“id”的自动编号列作为每个表的第一列。此列成为主键。

本质上,这种做法使用SQL表结构来模拟数据的图模型,即使它看起来像关系模型。 id列本质上是行地址的代理。数据的图形模型具有上行和下行。如有要求,请提供更多相关信息。