我在SQL Server中有两个表 . 第一个是属于单个作业的所有1:1关系,其主键声明如下:
CREATE TABLE Jobs(
JobNumber bigint PRIMARY KEY )
第二个表是所有作业组件及其1:1关系的列表 .
每个组件通过其作业编号引用单个作业,该作业是外键,并且多个组件可以引用相同的作业 . 组件在作业中编号为1,2,3等 .
是否可以合理地在第二个表中的复合主键中使用 JobNumber
(外键)列,以便主键由( JobNumber, ComponentNumber
)组成,如下所示:
CREATE TABLE Components(
JobNumber bigint FOREIGN KEY REFERENCES Jobs(JobNumber) NOT NULL,
ComponentNumber int NOT NULL,
PRIMARY KEY(JobNumber, ComponentNumber)
)
当然,另一个选择是使用代理主键,但这不会对 JobNumber
和 ComponentNumber
的组合强制执行唯一性约束(例如,第二个表中的两个记录可能有 JobNumber=1
和 ComponentNumber=1
),所以我会更喜欢使用复合自然主键 .
1 回答
当然,为什么不呢?我没有看到任何理由不使用复合主键!
唯一的小缺点是,任何其他需要引用您的
Components
表的表现在也都是 must use 两列来 Build 外键关系 - 您不能仅引用表的一半主键 .另外:如果您选择使用单独的代理列作为您的PK,您始终可以使用 unique constraint (
JobNumber, ComponentNumber
)强制执行唯一性....