我在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
,所以我更喜欢使用复合自然主键。
答案 0 :(得分:1)
当然,为什么不呢?我没有看到任何理由不使用复合主键!
唯一的次要缺点是,任何其他需要引用您的Components
表的表现在必须使用两列来建立外键关系 - 你不能只引用表的一半主键。
另外:如果您选择使用单独的代理列作为PK,则可以始终使用唯一约束强制执行唯一性(JobNumber, ComponentNumber
)....