Postgres外键关联表唯一约束设置与校验方案咨询
约束编写方法
你需要实现的是同一命令下的Option名称唯一、不同命令下的Option名称可重复的效果,只需要在Option表添加command_id与name的联合唯一约束即可,PostgreSQL 下的 SQL 语句如下:
ALTER TABLE "Option" ADD CONSTRAINT unique_option_name_per_command UNIQUE (command_id, name);
表名加双引号是因为Option属于PostgreSQL的保留字,避免语法报错。
数据库约束 vs 后端校验的选择
优先推荐添加数据库层面的约束,原因如下:
- 数据库约束是数据一致性的最后一道防线,哪怕后端校验逻辑出现bug、或者存在后端之外的角色(比如运维手动修改数据、其他业务服务直连数据库写入)操作数据库时,也不会产生不符合规则的脏数据
- 联合唯一约束的性能开销极低,对写入性能几乎没有影响
只有当你的业务规则灵活性极高、约束逻辑无法用固定的数据库约束实现,且完全没有后端之外的渠道写入数据库时,才考虑仅用后端做校验。
JSON存储方案补充
针对你提到的简单场景用JSON字段存储Option的方案,确实可以满足轻量业务需求,不需要额外做关联查询,开发效率更高。但如果后续需要对Option做单独的统计、查询、或者关联其他业务表,还是拆分为两张表加数据库约束的方案扩展性更强。
内容的提问来源于stack exchange,提问作者Epic Programmer
相关产品推荐
相关产品推荐

