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可以有很多subgroups
  • subgroup_names是用户提供的。 (我想避免使用subgroup_id列,subgroup_name在模型中有意义,不仅仅是一个标签,我提供了预定名称的列表,但允许用户添加他的所有者以获得灵活性)。
  • 此表具有2级引用包含子组属性(包含多对一关系)的子表;


我想有一个PRIMARY KEY(GROUP_ID,上部(修剪(subgroup_name)));

据我所知,postgres不允许在函数上使用PRIMARY KEY/UNIQUE。 IIRC,关系模型也要求使用列作为存储。

CREATE UNIQUE INDEX ON subgroups (group_id, upper(trim(subgroup_name)));不能解决我的问题 因为我模型中的其他表将有指向这两列的FOREIGN KEY。


我看到两个选项。

选项A)

  • 存放在subgroup_name
  • 一个清理分组名称添加,将包含未清洁的字符串

选项B)

    一个额外的列称为subgroup_name_raw
  • 在我的密钥对上创建一个UNIQUE INDEX和PRIMARY KEY。 (看起来像是一个巨大的浪费)

任何见解?

注:我使用的是Postgres 9.2

+0

为什么要存储未清理的subgroup_name版本?我试图弄清楚你的想法。当然,你有干净的版本的组+子组ID和一个查找表给出显示名称。 –

+0

我想让未清理的版本显示在用户界面中。我不想显示uppercased版本,我想确保名称不区分大小写。 子组将有成员,消息和其他对象附加到它。包含这些对象的表将具有子组表的外键。我看到一个干净的subgroup_name等同于subgroup_id。 – akp

+1

因此,如果是用户显示,您仍然希望将其放入查找表中。他们大概会想在某个时候改变显示名称。他们总是这样做。 –

回答

0

其实你可以做一个函数的输出的唯一约束。你不能在表格定义中做到这一点。你需要做的是创建一个唯一的索引。因此,像:

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

PostgreSQL有一些绝对惊人的索引功能,并在功能输出创造独特的(和部分唯一的)指标的能力是相当低估。