@beetlezilla

На сколько необходимы внешние ключи в базах данных?

Некоторое непродолжительное время работаю в одной компании. Имеется база данных с 1000+ таблиц. Смутило меня то, что не смотря на наличие полей с названием ключевого поля другой таблицы, между этими таблицами отсутствует связь и внешние ключи. Иными словами очень много внешних ключей не помечены внешними ключами. С моего маленького опыта это кажется очень странным и отсюда у меня несколько вопросов возникает:
  1. Всегда ли необходимы внешние ключи?
  2. Чем чревато отсутствие внешних ключей? (Про каскадное обновление и удаление знаю, именно поэтому и возник этот вопрос)
  3. Какие могут быть причины для отсутствия внешних ключей в этой базе?
  • Вопрос задан
  • 568 просмотров
Пригласить эксперта
Ответы на вопрос 5
terrier
@terrier
1. Всегда ли необходимы внешние ключи?

Внешние ключи необходимы несколько менее, чем всегда.

2. Чем чревато отсутствие внешних ключей?

Потерей консистентности данных

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

Производительность и локи. Вот здесь отвечал на похожий вопрос в контексте постгреса, у других RDBMS примерно так же.
Ответ написан
Комментировать
qonand
@qonand
Software Engineer
1. Все зависит от организации проекта, если например у Вас база данных шардированная - то внешнее ключи как бы Вы не сделаете, или например если Вы хотите избежать проверок на целостность данных при каждом изменении данных, а проводить их самостоятельно раз в сутки. В общем внешние ключи крайне желательны, но бывают ситуации когда стоит их не использовать
2. Не консистентными даными
3. В пункте 1 привел некоторые примеры
Ответ написан
@Eldar01
Если приложение, которое работает с этой БД само проверяет все связи на своем прикладном, более высоком чем БД уровне. - то почему бы и нет.

Проще манипулировать с таблицами, если СУБД тебе не докучает со своим контролем зависимостей.
Ответ написан
Комментировать
Fragster
@Fragster
помогло? отметь решением!
1. Только если пихать бизнес логику в СУБД
2. Неконсистентностью данных, если её не обеспечивает уровень бизнес-логики
3. Например приложение поддерживает несколько СУБД, не все из которых умеют внешние ключи.
Ответ написан
Комментировать
1000+ таблиц

Очень вероятно, что это и есть ответ.
Если вы все связи объявите как FK, модификация (вставка, изменение, удаление) одной записи в случае, когда у вас уже провалидированы все значения (а так бывает, видимо, всегда в грамотном коде), будет ощутимо замедленна этими самыми проверками на консистентность.
В противовес другим высказавшмся.
С базами я работаю 20+ лет.
10+ лет назад, когда начал работать с MySQL (он тогда никакой консистентности не умел) очень сильно удивлялся, как на таком можно работать. Но вариантов не было, работать пришлось.
Так вот.
За эти 10+ лет никогда не возникало никаких проблем, связанных с отсутствием контроля FK на стороне БД.
Впрочем, возможно, для этого таки обязательно сильно применять мозг при разработке.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы