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 Уникален к group(group_id).
  • A group может иметь много subgroups.
  • subgroup_names предоставляются пользователем. (Я бы хотел избежать использования столбца subgroup_id. subgroup_name имеет смысл в модели и больше, чем просто ярлык, я предоставляю список предопределенных имен, но позволяю пользователю добавлять его для гибкости).
  • В этой таблице имеется 2 уровня ссылок на дочерние таблицы, содержащие атрибуты подгрупп (со многими отношениями);


Я хотел бы иметь первичный ключ (group_id, верхняя (дифферент (subgroup_name)));

Из того, что я знаю, postgres не позволяет использовать PRIMARY KEY/UNIQUE для функции. IIRC, реляционная модель также требует, чтобы столбцы были использованы в качестве хранимых.

CREATE UNIQUE INDEX ON subgroups (group_id, upper(trim(subgroup_name))); не решает мою проблему , так как другие таблицы в моей модели будут иметь ИНОСТРАННЫЕ КЛЮЧИ, указывающие на эти два столбца.


Я вижу два варианта.

Вариант А)

  • Магазин очищенный от имени подгруппы в subgroup_name
  • добавить дополнительную колонку под названием subgroup_name_raw, который содержал неочищенные строку

Вариант B)

  • Создайте UNIQUE INDEX и PRIMARY KEY на моей ключевой паре. (похоже, огромные отходы)

Любые идеи?

Примечание: Я использую Postgres 9.2

+0

Почему вы хотите сохранить не очищенную версию имени подгруппы? Я пытаюсь понять ваше мышление. Разумеется, у вас есть чистые версии идентификаторов group + subgroup и lookup table для отображения отображаемого имени. –

+0

Я бы хотел, чтобы не очищенная версия отображалась в пользовательском интерфейсе. Я бы не хотел отображать версию с верхним индексом, и я хочу, чтобы имя было незаметно для случая. Подгруппа будет иметь членов, сообщений и других объектов, прикрепленных к ней. Таблицы, содержащие эти объекты, будут иметь внешний ключ в таблице подгрупп. Я вижу чистое имя subgroup_name как эквивалент subgroup_id. – akp

+1

Так что, если это для пользовательского отображения, вы все равно хотите поместить его в таблицу поиска. Вероятно, они захотят изменить отображаемое имя в какой-то момент. Они всегда это делают. –

ответ

0

На самом деле вы можете сделать UNIQUE ограничение на выходе функции. Однако вы не можете это сделать в определении таблицы. Что вам нужно сделать, это создать уникальный индекс после. Так что-то вроде:

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

PostgreSQL имеет ряд совершенно удивительные возможности индексирования, а также возможность создавать уникальные (и частичный уникальный) индексы на выходе функции весьма недооцененный.

Смежные вопросы