具有用户提供的字符串列的组合键,外键



假设我有下表

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有许多绝对惊人的索引功能,在函数输出上创建唯一(和部分唯一)索引的能力被低估了。

最新更新