Где я должен хранить внешний ключ? - PullRequest
20 голосов
/ 20 июля 2010

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

Ответы [ 4 ]

24 голосов
/ 20 июля 2010

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

Многим ко многим потребуется добавить третью таблицу, используя ключи из обеих таблиц в качестве первичного ключа.

8 голосов
/ 21 июля 2010

«Каков систематический способ принятия такого решения?»

Похоже, есть два варианта: сторона «Один», как сторона FK, или сторона «Много», илисторона «Множество» имеет FK в сторону «Один».

Давайте на самом деле рассмотрим варианты.

  • Все ряды стороны «Многие» могут легкоссылаться на одну строку на стороне "One".

  • Одна строка на стороне "One" не может ссылаться на ВСЕ строки на стороне "Many".

Работает только одна техника: сторона «Много» имеет FK в сторону «Один».

Существует только один фактический выбор реализации.Там нет "решение".

3 голосов
/ 20 июля 2010

Внешний ключ - это просто поле в одной таблице, которое ссылается на поле ключа в другой таблице.Не обязательно определять поле внешнего ключа как таковое.То есть вам не нужно явно добавлять ограничение FOREIGN KEY ... REFERENCES в таблицу, чтобы он был внешним ключом.Когда вы объединяете две таблицы вместе, первичный ключ родительской таблицы будет установлен равным внешнему ключу дочерней таблицы.Какой бы из них ни был , а не , первичным ключом является внешний ключ.

В отношениях «один ко многим» FK переходит на сторону «многие».Он не может идти в сторону «один», потому что именно здесь идет PK, и определение первичного ключа включает запрещение дубликатов.

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

0 голосов
/ 02 мая 2017

Как и primary key, foreign key также является типом constraint, размещенным в одном или нескольких столбцах таблицы.

foreign key устанавливает связь между ключевыми столбцами и связанными столбцами в другой таблице. (Вы также можете связать столбцы внешнего ключа со столбцами в той же таблице.)

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

Ключевые моменты

  1. foreign key должен ссылаться на первичный ключ или уникальное ограничение, хотя эта ссылка может находиться в той же таблице или в другой таблице
  2. A foreign key также должно иметь такое же количество столбцов, что и количество столбцов в указанном ограничении, и типы данных должны совпадать между соответствующими столбцами.
  3. В отличие от Primary key, Foreign key столбцы могут содержать NULL значений.
...