Использовать внешний ключ в MySQL или нет? - PullRequest
6 голосов
/ 07 августа 2009

Я уже пару лет пишу с БД MySQL и никогда не использовал внешний ключ. Теперь я понимаю, что внешний ключ похож на идентификатор одной таблицы, который соответствует первичному ключу другой таблицы. У меня есть пользовательская таблица на моем сайте и, вероятно, около 10 других таблиц, которые все соответствуют первичному ключу моей пользовательской таблицы - однако они не установлены как внешние ключи.

Что я упускаю из-за отсутствия у этих 10 других таблиц внешнего ключа? Я имею в виду, насколько я могу судить, они в основном являются внешним ключом, за исключением того, что у них нет значения, сохраненного / присвоенного им в БД.

Есть ли какая-то другая выгода, о которой я просто не знаю?

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

Ответы [ 5 ]

6 голосов
/ 19 августа 2009

Добавление внешних ключей всегда хорошая идея - по крайней мере, я никогда не видел веских причин не использовать их.

  • обеспечивает ссылочную целостность (нельзя удалить родителя, если существует ребенок, нельзя вставить сирот или ребенка с недопустимым идентификатором родителя)
  • работает как индекс
  • При использовании внешних ключей независимо от способа доступа к данным, будь то приложение, автоматизированный процесс или кто-то без кофеина в терминале, правила применяются единообразно.
3 голосов
/ 07 августа 2009

A FOREIGN KEY служит двум целям:

  • Это гарантирует, что ваши отношения всегда согласованы за счет некоторых накладных расходов на проверку
  • Он (спорно) упрощает каскадные обновления и удаления.

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

1 голос
/ 07 августа 2009

с внешними ключами вы

  • может убедиться, что в эти поля введены только действительные идентификаторы пользователя
  • использовать каскады при удалении проще не
  • не нужно вручную определять индексы для этих полей (innodb)
0 голосов
/ 07 августа 2009

В некоторых базах данных (не уверен насчет MySQL), FOREIGN KEY автоматически индексирует, что значительно ускоряет ваши объединения и запросы по внешним ключам. Кроме того, есть уже упомянутые преимущества каскадного удаления, ссылочной целостности и т. Д.

0 голосов
/ 07 августа 2009

Что вы упускаете, так это принудительная ссылочная целостность (т. Е. Если ваша другая таблица имеет user_id 27, в таблице пользователей ДОЛЖЕН быть идентификатор 27) и возможность автоматического каскадного обновления и удаления (т. Е. Если Вы удаляете пользователя 27, соответствующие строки в другой таблице также автоматически удаляются и т. д.).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...