You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否为外键添加非空约束?关联表主键设计疑问

评估与项目关联表的主键&外键约束怎么选?

先明确核心逻辑

主键的「最小性」是设计原则,但不是死规矩,得结合你业务场景的实际需求来权衡。


方案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,提问作者노경현

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:52:11