复合主键效率作为外键


12

我有一个带有复合主键(由4列组成)的表,该键用于确保没有重复项输入到表中。我现在需要一个新表,该表需要将该表中的键作为外键引用。

我的问题是哪种方法对查找速度更有效:

1)我是否创建包括所有4列的新表,并在外键中引用它们。

要么

2)我是否在主键表中创建了一个新的标识列,并将其用作新表中的外键。

预计该数据库将存储大量数据,因此到目前为止,我已经建立了该数据库,以最大程度地减少每个表中存储的数据量。考虑到这一点,选项2将是最好的方法,因为我将为每行保存2个int列和一个datetime列,但是我想避免不必要的增加查找时间。


1
INT IDENTITY在这种情况下,我个人几乎总是使用代理键(例如)-使引用和连接该表变得非常容易。为避免重复,请将UNIQUE约束放在这四列上。另外:出于性能方面的考虑,窄主键要好得多(如果它们用作群集键)
marc_s 2013年

Answers:


11

使用简单的合成整数PK的成本很小,在您的情况下,其收益可能会相当可观。

  • 如您所指出的,您将拥有更简单的FK关系。
  • 较小的PK表示较小(且较快)的索引。通过添加这样的列,您的总表空间可能会减少。
  • 如果业务规则发生变化,则无需重新排序表。

想到的唯一实质性缺点是,由于复合PK上的群集优势,您可能会失去查询性能。如果您认为这可能很重要,则可以继续在复合候选键上进行聚类,但将PK放在合成键上。


5

在SQL世界中,答案通常是:“取决于情况”。

请看一下有关某些指针的问题:与代理整数键相比,自然键在SQL Server中提供的性能更高还是更低?

在某些情况下,使用自然键作为外键可以看到性能的提高。但是,在大多数情况下,使用较小的键会更好(请阅读:替代键)。

如果您引入该IDENTITY列,我什至将其用作主键,然后将“自然”列更改为UNIQUE CONSTRAINT。

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.