12 我有一个带有复合主键(由4列组成)的表,该键用于确保没有重复项输入到表中。我现在需要一个新表,该表需要将该表中的键作为外键引用。 我的问题是哪种方法对查找速度更有效: 1)我是否创建包括所有4列的新表,并在外键中引用它们。 要么 2)我是否在主键表中创建了一个新的标识列,并将其用作新表中的外键。 预计该数据库将存储大量数据,因此到目前为止,我已经建立了该数据库,以最大程度地减少每个表中存储的数据量。考虑到这一点,选项2将是最好的方法,因为我将为每行保存2个int列和一个datetime列,但是我想避免不必要的增加查找时间。 sql-server-2008 database-design primary-key identity composite-types — 亚伦卡特林 source 1 INT IDENTITY在这种情况下,我个人几乎总是使用代理键(例如)-使引用和连接该表变得非常容易。为避免重复,请将UNIQUE约束放在这四列上。另外:出于性能方面的考虑,窄主键要好得多(如果它们用作群集键) — marc_s 2013年
11 使用简单的合成整数PK的成本很小,在您的情况下,其收益可能会相当可观。 如您所指出的,您将拥有更简单的FK关系。 较小的PK表示较小(且较快)的索引。通过添加这样的列,您的总表空间可能会减少。 如果业务规则发生变化,则无需重新排序表。 想到的唯一实质性缺点是,由于复合PK上的群集优势,您可能会失去查询性能。如果您认为这可能很重要,则可以继续在复合候选键上进行聚类,但将PK放在合成键上。 — 所有行业的乔恩 source
5 在SQL世界中,答案通常是:“取决于情况”。 请看一下有关某些指针的问题:与代理整数键相比,自然键在SQL Server中提供的性能更高还是更低? 在某些情况下,使用自然键作为外键可以看到性能的提高。但是,在大多数情况下,使用较小的键会更好(请阅读:替代键)。 如果您引入该IDENTITY列,我什至将其用作主键,然后将“自然”列更改为UNIQUE CONSTRAINT。 — 塞巴斯蒂安·梅恩(Sebastian Meine) source
INT IDENTITY
在这种情况下,我个人几乎总是使用代理键(例如)-使引用和连接该表变得非常容易。为避免重复,请将UNIQUE约束放在这四列上。另外:出于性能方面的考虑,窄主键要好得多(如果它们用作群集键)