2009-10-02 3 views
4

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

+1

В чем проблема с ограничениями FK? Почему бы вам не использовать их? –

+9

Только если у вас несколько таблиц. –

+4

@Charles: внешний ключ может ссылаться на ту же таблицу, в которой он определен, например. 'Employees.manager_id'. –

ответ

20

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

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

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

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

+0

+1 - Хорошо сказано. –

14

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

+0

+1 - хорошая точка. Они могут быть очень удобными при использовании инструментов генерации кода, таких как CodeSmith. – TrueWill

3

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

5

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

12

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

1

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

Если вы, например, удалите запись клиента, все его счета-фактуры и строки счетов также удаляются автоматически, если у вас есть «ВКЛЮЧИТЬ КАСКАД» на их FK constrainst.

+0

... но зачем вам это нужно? Если вы удалите клиента, разве вы все еще не хотите делать записи о покупках, сделанных ими для ведения бухгалтерского учета? –

+0

Крис: Я понимаю, что вы говорите, но в этом случае вы, вероятно, не хотите удалять клиента, просто установите флаг в своей записи, указав, что они больше не активны. – bcat

+0

@chris: вот почему он настраивается! Для отношений между родителями и детьми это может быть хорошо, но для чисто ссылочных отношений, очевидно, вы не ... –

2

В дополнение к принудительному исполнению и документированию они могут ускорить выполнение запросов. Оптимизатор запросов может видеть внешнее ограничение, понимать его эффект и делать оптимизацию плана, которая была бы невозможна без ограничения. См. Foreign Key Constraints (Without NOCHECK) Boost Performance and Data Integrity. (Специфичный для SQL Server)

Смежные вопросы