复合主键作为外键的效率

aar*_*lin 12 sql-server-2008 database-design primary-key identity composite-types

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

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

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

或者

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

预计该数据库将保存大量数据,因此我一直构建它,以期最大限度地减少每个表中保存的数据量。考虑到这一点,选项 2 将是最好的方法,因为我将为每一行保存 2 个 int 列和一个 datetime 列,但我想避免在不必要的情况下增加查找时间。

Jon*_*des 11

使用简单的合成整数 PK 的成本很小,并且在您的情况下的好处可能相当可观。

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

唯一想到的重大缺点是,您可能会失去从复合 PK 上的集群中受益的查询的性能。如果您认为这可能很重要,请继续在复合候选键上进行聚类,但将 PK 放在合成键上。


Seb*_*ine 5

在 SQL 世界中,答案是:“视情况而定”。

看看这个问题的一些指针:在 SQL Server 中,自然键比代理整数键提供更高还是更低的性能?

在某些情况下,使用自然键作为外键时性能会有所提高。但是,在大多数情况下,使用较小的键(阅读:代理键)会更好。

如果您引入 IDENTITY 列,我什至会将其设为主键,并将“自然”列更改为 UNIQUE CONSTRAINT。