Подтвердить что ты не робот

Иностранный ключ к одной из многих таблиц?

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

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

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

например.

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

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

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

Этот вопрос предназначен как для MySQL, так и для PostgreSQL.

Спасибо

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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