Мне нужен совет по структуре SQL для Postgresql.
У меня есть эти две таблицы:
DROP TABLE IF EXISTS "public"."attribute_value";
CREATE TABLE "public"."attribute_value"
(
"id" INTEGER NOT NULL,
"attribute_id" INTEGER NOT NULL,
"value" CHARACTER VARYING(100) NULL
);
--*****************************************************
DROP TABLE IF EXISTS "public"."product_attribute";
CREATE TABLE "public"."product_attribute"
(
"product_id" INTEGER NOT NULL,
"attribute_value_id" INTEGER NOT NULL,
"attribute_id" INTEGER NOT NULL
);
Я не добавил никаких ограничений по назначению. Мне нужен внешний ключ для дочерней таблицы product_attribute.attribute_value_id, ссылающийся на родительскую таблицу attribute_value.id. Лучше всего создать первичный ключ в поле attribute_value.id (может быть, с последовательностью) или создать CREATE UNIQUE INDEX для attribute_value.id? Сначала я подумал, что индексы - это только специальные таблицы поиска, которые поисковая система базы данных может использовать для ускорения поиска данных. Но когда я играл с внешними ключами, я обнаружил, что создание уникального индекса позволило мне избежать ошибки "нет уникального ограничения, соответствующего данным ключам для указанной таблицы blablabla", потому что внешний ключ не должен указывать на не уникальное значение. Должны ли индексы использоваться для создания внешних ключей?
Мне также нужен внешний ключ для дочерней таблицы product_attribute.attribute_id, ссылающийся на родительскую таблицу attribute_value.attribute_id. Проблема в том, что attribute_value.attribute_id не является уникальным. Но все строки в product_attribute.attribute_id не должны принимать какие-либо значения из возможных значений attribute_value.attribute_id. Как мне быть?