假设我有下表
TABLE subgroups (
group_id t_group_id NOT NULL REFERENCES groups(group_id),
subgroup_name t_subgroup_name NOT NULL,
more attributes ...
)
- CCD_ 1与CCD_ 2是唯一的
- 一个CCD_ 3可以有许多CCD_
subgroup_names
由用户提供。(我想避免使用subgroup_id
列。subgroup_name
在模型中有意义,它不仅仅是一个标签,我提供了一个预定名称的列表,但允许用户添加自己的名称以获得灵活性)- 该表有两个级别的引用子表,子表包含子组属性(具有多对一关系)
我想在(group_id,upper(trim(subgroup_name))上有一个PRIMARY KEY;
据我所知,postgres不允许在函数上使用PRIMARY KEY/UNIQUE。IIRC,关系模型还要求将列用作存储。
CREATE UNIQUE INDEX ON subgroups (group_id, upper(trim(subgroup_name)));
不能解决我的问题因为我的模型中的其他表将具有指向这两列的FOREIGN KEY。
我看到两种选择。
选项A)
- 将已清理的子组名称存储在subgroup_name中
- 添加一个名为subgroup_name_raw的额外列,该列将包含未清除的字符串
选项B)
- 在我的密钥对上创建一个UNIQUE INDEX和PRIMARY KEY。(看起来像是一个巨大的浪费)
有什么见解吗?
注意:我使用的是Postgres 9.2
实际上,您可以对函数的输出执行UNIQUE约束。但是在表定义中不能这样做。您需要做的是在之后创建一个唯一的索引。所以类似于:
CREATE UNIQUE INDEX subgroups_ukey2 ON subgroups(group_id, upper(trim(subgroup_name)));
PostgreSQL有许多绝对惊人的索引功能,在函数输出上创建唯一(和部分唯一)索引的能力被低估了。