Как управлять postgresql внешними ключами? - PullRequest
1 голос
/ 09 марта 2020

Мне нужен совет по структуре 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. Как мне быть?

1 Ответ

1 голос
/ 10 марта 2020

Каждая таблица должна иметь первичный ключ. Не присоединяйтесь к легиону людей, которые жалуются на повторяющиеся строки в своих таблицах.

Поэтому сделайте id первичным ключом attribute_value, тогда вы можете создать ограничение внешнего ключа.

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

О attribute_id: это не должно быть ограничение внешнего ключа между двумя таблицами из вашего вопроса, но обеими таблицами должен иметь внешний ключ, ссылающийся на еще одну таблицу (attribute?).

...