问题描述
我有两个包含以下列的 Postgres 表:
命令
列 | 类型 |
---|---|
id | 整数主键 |
名称 | VARCHAR(32) |
选项
列 | 类型 |
---|---|
id | 整数主键 |
名称 | VARCHAR(32) |
command_id | COMMAND("id") 上的外键 |
我想添加另一个约束,其中命令 name
列和选项 command_id
列是绑定的,这样两个命令可以共享相同的名称,前提是它们属于不同选项的一部分。我将如何做出这样的约束?不加约束,只允许后端在输入数据前做必要的检查会更好吗?
编辑:我意识到对于我的简单用例我想得太多了,存储一个 JSON 字段就足够了。但是,如果表结构碰巧更复杂,那么这个问题仍然有效。
解决方法
如果 Command 表中的 name
与 Option 列中的 name
列相同。那么选项表中的那一列是多余的,你总是可以通过你已经拥有的 FK 来获取名称 (command_id)。
但通常您可以将 composite key
用于 FK,例如:
create table Options(
id int primary key,name varchar(32),command_id int,foreign key fk_name (name,command_id) references Command(name,id)
);
当然,命令表中的 name 和 id 应该是候选键的一部分。