能否为外键添加非空约束?关联表主键设计疑问
评估与项目关联表的主键&外键约束怎么选?
先明确核心逻辑
主键的「最小性」是设计原则,但不是死规矩,得结合你业务场景的实际需求来权衡。
方案1:只给外键加非空约束(多数场景推荐)
如果你的关联表不止存关联关系,还得放其他字段(比如评估时间、版本备注这类),或者业务上允许同一个评估和同一个项目存在多条关联记录(比如同一个项目被同一评估反复审核),那直接这么干:
- 保留原来的自增ID当主键,给
evaluation_id和project_id这俩外键都加上NOT NULL约束。 - 额外提一句:如果业务要求「同一个评估和项目只能绑一次」,就给这俩外键加个唯一约束(
UNIQUE(evaluation_id, project_id)),既保证不重复,又不破坏主键的最小性。
举个MySQL的例子:
CREATE TABLE evaluation_project ( id INT AUTO_INCREMENT PRIMARY KEY, evaluation_id INT NOT NULL, project_id INT NOT NULL, eval_time DATETIME, -- 比如这类额外业务字段 FOREIGN KEY (evaluation_id) REFERENCES evaluation(id), FOREIGN KEY (project_id) REFERENCES project(id), UNIQUE KEY uk_eval_project (evaluation_id, project_id) -- 按需加,不是必须 );
方案2:把外键组合当主键(适合纯关联场景)
如果你的关联表就是个纯“中间表”,除了俩外键啥都没有,而且业务上严格要求「一个评估和一个项目只能绑一次」,那直接用(evaluation_id, project_id)当复合主键就行:
- 主键本身默认就是非空的,刚好满足你的依赖要求,还天然保证了关联的唯一性,同时也符合主键最小性——毕竟要唯一标识这条关联,这俩字段就是最小的必要集合。
- 这种情况完全没必要留自增ID,纯纯冗余。
示例SQL:
CREATE TABLE evaluation_project ( evaluation_id INT NOT NULL, project_id INT NOT NULL, PRIMARY KEY (evaluation_id, project_id), FOREIGN KEY (evaluation_id) REFERENCES evaluation(id), FOREIGN KEY (project_id) REFERENCES project(id) );
总结下怎么选
- 关联表有额外业务字段/允许重复关联 → 选方案1,加非空约束,按需加唯一约束。
- 纯关联表+关联唯一 → 选方案2,用复合主键。
内容的提问来源于stack exchange,提问作者노경현
相关产品推荐
相关产品推荐

