假设我有下表
TABLE subgroups (
group_id t_group_id NOT NULL REFERENCES groups(group_id),
subgroup_name t_subgroup_name NOT NULL,
more attributes ...
)
subgroup_name
对 a 是唯一的group(group_id)
。- 一个
group
可以有很多subgroups
。 - 由
subgroup_names
用户提供。(我想避免使用subgroup_id
列。subgroup_name
在模型中具有意义并且不仅仅是一个标签,我提供了一个预先确定的名称列表,但允许用户添加自己的名称以提高灵活性)。 - 该表有 2 级引用包含子组属性的子表(具有多对一关系);
我想在 (group_id, upper(trim(subgroup_name))) 上有一个主键;
据我所知,postgres 不允许在函数上使用 PRIMARY KEY/UNIQUE。IIRC,关系模型还要求将列用作存储。
CREATE UNIQUE INDEX ON subgroups (group_id, upper(trim(subgroup_name)));
不能解决我的问题,因为我模型中的其他表将有指向这两列的 FOREIGN KEYs。
我看到两个选项。
选项 A)
- 将清理后的子组名称存储在 subgroup_name 中
- 添加一个名为 subgroup_name_raw 的额外列,其中包含未清理的字符串
选项 B)
- 在我的密钥对上创建一个 UNIQUE INDEX 和 PRIMARY KEY。(似乎是一个巨大的浪费)
有什么见解吗?
注意:我使用的是 Postgres 9.2