Внешний ключ к одной из многих таблиц? - PullRequest
17 голосов
/ 01 августа 2010

Обычный способ установки ограничения внешнего ключа - выбрать таблицу, на которую будет ссылаться внешний ключ.

У меня полиморфное отношение между 1 таблицей и набором таблиц.

Это означает, что эта таблица будет иметь отношение с одной из этих таблиц в наборе.

например.

images: person_id, person_type
subordinates: id, col1, col2...col9
products: id, colA, colB...colZ

В приведенном выше примере, если person_type - это "subordinates", то person_idдолжен быть внешним ключом для subordinates.id, и то же самое относится и к продуктам.

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

Этот вопрос касается и MySQL, и PostgreSQL.

Спасибо

Ответы [ 4 ]

42 голосов
/ 01 августа 2010

Нет, ограничение внешнего ключа всегда ссылается только на одну родительскую таблицу.

Этот вопрос часто возникает.Вот некоторые из моих прошлых ответов на него:

Подробнее о полиморфных ассоциациях см. Мою презентацию Практические объектно-ориентированные модели в SQL или мою книгу Антипаттерны SQL: предотвращение ловушек программирования баз данных .

2 голосов
/ 01 августа 2010

Внешний ключ по определению должен указывать либо на первичный, либо на кандидатный ключ в таблице «один-единственный-единственный» - первичный-только доступен в типичной СУБД.Вам лучше иметь одну таблицу «человек» и иметь таблицы, связанные с этим, например, с информацией менеджера.

1 голос
/ 01 августа 2010

Внешний ключ может указывать только на одну таблицу.

Мне кажется, что вы действительно хотели сделать здесь - создать родительский идентификатор в вашей таблице персон.У подчиненных будет родительский идентификатор, указывающий на их менеджеров.Если подчиненному необходимо иметь несколько менеджеров, можно создать отдельную объединяющую таблицу с двумя столбцами, каждый из которых содержит идентификатор человека, один из которых является подчиненным, а другой - одним из менеджеров.

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

1 голос
/ 01 августа 2010

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

Ничто не мешает вам определить несколько ограничений внешнего ключа для столбца.Но это означает, что единственным допустимым значением, которое можно сохранить, будут значения, которые уже существуют во всех других сторонних связанных таблицах.IE: TABLE_1 имеет значения 1 и 2, TABLE_2 имеет значения 2 и 3 - TABLE_3 имеет отношения внешнего ключа, определенные для таблиц 1 и 2 в столбце col таблицы TABLE_3 ... Единственное допустимое значение, которое я могу вставить в TABLE_3.col, это 2потому что это в обеих таблицах (при условии, что col не обнуляется).

...