Допустим, у меня есть следующая таблицаСоставной ключ с пользовательским поставляемыми колонке строки, внешние ключи
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
Почему вы хотите сохранить не очищенную версию имени подгруппы? Я пытаюсь понять ваше мышление. Разумеется, у вас есть чистые версии идентификаторов group + subgroup и lookup table для отображения отображаемого имени. –
Я бы хотел, чтобы не очищенная версия отображалась в пользовательском интерфейсе. Я бы не хотел отображать версию с верхним индексом, и я хочу, чтобы имя было незаметно для случая. Подгруппа будет иметь членов, сообщений и других объектов, прикрепленных к ней. Таблицы, содержащие эти объекты, будут иметь внешний ключ в таблице подгрупп. Я вижу чистое имя subgroup_name как эквивалент subgroup_id. – akp
Так что, если это для пользовательского отображения, вы все равно хотите поместить его в таблицу поиска. Вероятно, они захотят изменить отображаемое имя в какой-то момент. Они всегда это делают. –