Нужны ли ограничения внешнего ключа? - PullRequest
4 голосов
/ 03 октября 2009

В идеальном мире когда-нибудь действительно нужны ограничения внешнего ключа?

Ответы [ 7 ]

20 голосов
/ 03 октября 2009

Внешние ключи обеспечивают согласованность в СУБД. То есть ни одна дочерняя строка не может ссылаться на несуществующий родительский элемент.

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

Когда в СУБД применяются ограничения, вы можете рассчитывать на согласованность. Другими словами, база данных никогда не позволяет зафиксировать изменение, которое нарушает ссылки.

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

14 голосов
/ 03 октября 2009

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

12 голосов
/ 03 октября 2009

Мир не идеален, поэтому они нужны.

5 голосов
/ 03 октября 2009

Мир не может быть идеальным без внешних ключей.

3 голосов
/ 03 октября 2009

Да, если вы хотите обеспечить ссылочную целостность.

2 голосов
/ 03 октября 2009

В дополнение к обеспечению согласованности и документации, они могут на самом деле ускорить запросы. Оптимизатор запросов может видеть внешнее ограничение, понимать его эффект и составлять план оптимизации, который был бы невозможен без установленного ограничения. См. Ограничения внешнего ключа (без NOCHECK). Повышение производительности и целостности данных . (Специфично для SQL Server)

1 голос
/ 03 октября 2009

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

Если вы, например, удалите запись клиента, все его счета-фактуры и строки счетов-фактур также удаляются автоматически, если в их ограничении FK указано «ON DELETE CASCADE».

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