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

时间:2013-07-17 15:00:55

标签: postgresql relational-database composite-primary-key data-integrity relational-model

假设我有下表

TABLE subgroups (
    group_id        t_group_id NOT NULL REFERENCES groups(group_id),
    subgroup_name   t_subgroup_name NOT NULL,
    more attributes ...
)
  • subgroup_name对于group(group_id)非常独特。
  • group可以包含多个subgroups
  • subgroup_names是用户提供的。 (我想避免使用subgroup_id列。subgroup_name在模型中有意义,不仅仅是一个标签,我提供了一个预定名称列表,但允许用户添加他的所有者柔韧性)。
  • 此表有2个级别的引用子表,包含子组属性(具有多对一关系);


我想有一个PRIMARY KEY(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

1 个答案:

答案 0 :(得分:0)

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

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

PostgreSQL具有许多绝对惊人的索引功能,并且在功能输出上创建唯一(和部分唯一)索引的能力被严重低估。

相关问题