Общая проблема отношений многих ко многим (Postgresql) - PullRequest
0 голосов
/ 11 мая 2010

У меня есть две таблицы:

CREATE TABLE "public"."auctions" (
"id" VARCHAR(255) NOT NULL, 
"auction_value_key" VARCHAR(255) NOT NULL, 
"ctime" TIMESTAMP WITHOUT TIME ZONE NOT NULL, 
"mtime" TIMESTAMP WITHOUT TIME ZONE NOT NULL,
 CONSTRAINT "pk_XXXX2" PRIMARY KEY("id"), 
);

и

CREATE TABLE "public"."auction_values" (
 "id" NUMERIC DEFAULT nextval('default_seq'::regclass) NOT NULL, 
 "fk_auction_value_key" VARCHAR(255) NOT NULL, 
 "key" VARCHAR(255) NOT NULL, 
 "value" TEXT, 
 "ctime" TIMESTAMP WITHOUT TIME ZONE NOT NULL, 
 "mtime" TIMESTAMP WITHOUT TIME ZONE NOT NULL,
 CONSTRAINT "pk_XXXX1" PRIMARY KEY("id"), 
);

если я хочу создать отношение «многие ко многим» на ключе аукциона, например:

ALTER TABLE "public"."auction_values"
  ADD CONSTRAINT "auction_values_fk" FOREIGN KEY ("fk_auction_value_key")
    REFERENCES "public"."auctions"("auction_value_key")
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
    NOT DEFERRABLE;

я получаю эту ошибку SQL:

ERROR:  there is no unique constraint matching given keys for referenced table "auctions"

Вопрос:

Как вы можете видеть, я хочу, чтобы "auction_values" "повторно использовалась" на разных аукционах без дублирования их для каждого аукциона ... Так что я не хочу иметь ключевое отношение в поле "id" в таблице аукционов ...

Я тут не так думаю или в чем дело? ;)

Спасибо

Ответы [ 3 ]

1 голос
/ 11 мая 2010

Вам нужна дополнительная таблица, чтобы смоделировать отношения многие ко многим. Он будет содержать сопоставления между аукционами и аукционами. Для этого нужны два столбца: auction_id и auction_value_id.

0 голосов
/ 11 мая 2010

Цитирование Википедии

в контексте реляционных базы данных, внешний ключ является референтное ограничение между двумя таблицы. 1 Внешний ключ идентифицирует столбец или набор столбцов в одном (ссылка) таблица, которая ссылается на множество столбцов в другой (ссылка) Таблица. Столбцы в ссылках таблица должна быть первичным ключом или другим ключ-кандидат в ссылочной таблице. Значения в одном ряду ссылающиеся столбцы должны встречаться в одна строка в ссылочной таблице. Таким образом, строка в ссылочной таблице не может содержать значения, которые не существуют в ссылочной таблице (кроме потенциально NULL). Этот способ ссылки можно сделать, чтобы связать информацию вместе, и это важная часть нормализации базы данных. множественный строки в ссылочной таблице могут обратиться к той же строке в ссылочная таблица. В большинстве случаев это отражает один (основная таблица, или ссылочная таблица) многим (детям таблица или справочная таблица) отношения.

Как указывает Кассной, звучит так, как будто вы хотите иметь несколько строк в auctions, ссылающихся на отдельные строки в auction_values.

Для этого главная или ссылочная таблица имеет значение auction_values, а дочерняя или ссылочная таблица имеет значение auction_values.

Если, с другой стороны, Алекс прав и вы хотите сослаться на несколько строк в auction_values, вам понадобится другая таблица.

Эта таблица поможет вам преобразовать отношение «многие ко многим» (которое не может быть непосредственно реализовано на физическом уровне базы данных) в два отношения «один ко многим».

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

Тем не менее, это может быть слишком общим, и вы действительно можете быть за столом auction_value_keys (auction_value_key)

0 голосов
/ 11 мая 2010

Если вы хотите, чтобы auction_values повторно использовался на разных аукционах, вы должны объявить ограничение наоборот:

ALTER TABLE auctions
ADD CONSTRAINT fk_auction_values
FOREIGN KEY (auction_value_key)
REFERENCES auction_values (id)
...