2010-07-20 1 views
13

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

+2

«Что такое систематический способ принятия такого решения?» «понять, что характер отношений, вероятно, имеет значение». Верный. Характер отношений имеет значение. Я не понимаю. Вы хотите знать, как определить, что зависит от другого? –

+0

[Документация по внешним ключам MySQL для MySQL] (https://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html#idm139680617903472) обеспечивает простой пример взаимосвязи между двумя родителями таблицы: 'customer',' product' и одна дочерняя таблица: 'product_order'. В этом примере 'product_order' является дочерней таблицей, которая должна содержать внешние ключи. –

ответ

18

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

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

+3

... и если нет отношения «ребенок/родитель». это, вероятно, много-ко-многим в таблице соединений. – Wrikken

+5

Или это отношения «один-к-одному», и ОП должен спрашивать себя, почему он разбит на две таблицы в первую очередь. – Allan

+1

@Wrikken, @Allan: Отличные моменты, вы оба. –

1

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

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

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

7

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

Возможны два варианта: Сторона «Один» как FK для «Много сторон», или «Многосторонняя» сторона имеет FK для «одной» стороны.

Давайте посмотрим на выбор.

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

  • Одна строка на стороне «Один» не может ссылаться на ВСЕ строки на стороне «Многие».

Только одна методика работает: «Многие» имеют FK на «одну» сторону.

Существует только один фактический выбор реализации. Нет «решения».

+3

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

0

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

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

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

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

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