0

假设我有下表

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

4

1 回答 1

0

实际上,您可以对函数的输出进行 UNIQUE 约束。但是,您不能在表定义中执行此操作。您需要做的是在之后创建一个唯一索引。所以像:

CREATE UNIQUE INDEX subgroups_ukey2 ON subgroups(group_id, upper(trim(subgroup_name)));

PostgreSQL 有许多绝对令人惊叹的索引功能,而在函数输出上创建唯一(和部分唯一)索引的能力被低估了。

于 2013-11-01T16:05:12.643 回答