2010-08-01 3 views
17

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

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

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

например.

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

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

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

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

Благодаря

+0

[Вы можете сделать это в Yii-каркасе] (http://www.yiiframework.com/forum/index.php/topic/20018-conditional-relation) – Alireza

ответ

41

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

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

Подробнее о полиморфных ассоциациях см. В моей презентации Practical Object-Oriented Models in SQL или моей книге, SQL Antipatterns: Avoiding the Pitfalls of Database Programming.

+3

wow ... как вам удалось найти все эти ссылки +1! –

+9

Поиск по идентификатору пользователя и по тегу: 'user: 20860 [polymorphic-association]' –

2

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

1

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

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

1

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

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

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

+0

MySQL имеет, но не обеспечивает соблюдения ограничений CHECK. То, что вы описываете, по-прежнему является отношением внешнего ключа, только к той же таблице, что обычно означает необходимость рекурсивных/иерархических запросов, которые MySQL не имеет (PostgreSQL 8.x). –

+0

Это было не то, что я хотел сделать, я не был так ясен о том, что я имел в виду. Посмотрите мои обновленные таблицы и столбцы, и вы поймете, что я ищу. –

+0

Насколько я ненавижу этот тип ответа, я определенно чувствую, что здесь «то, что вы хотите, не так». Я думаю, что @Bill Karwin имеет правильную идею. – Mykroft

Смежные вопросы