Предполагаю, что вы говорите о ограничениях внешнего ключа, обеспечиваемых базой данных. Вы, вероятно, уже используете внешние ключи, вы просто не сказали базе данных об этом.
Предположим, что программист фактически делает это в правильном порядке уже, то мы действительно нуждаемся в концепции внешних ключей?
Теоретически, нет. Тем не менее, никогда не было части программного обеспечения без ошибок.
Ошибки в коде приложения обычно не так опасны - вы идентифицируете ошибку и исправляете ее, после чего приложение запускается плавно снова. Но если ошибка позволяет текущим данным вводить базу данных, то вы застряли с ней! Очень сложно восстановить поврежденные данные в базе данных.
Рассмотрите, если тонкая ошибка в FogBugz разрешена для ввода в базу данных поврежденного внешнего ключа. Возможно, будет легко исправить ошибку и быстро нажать на исправление для клиентов в выпуске исправления ошибок. Однако каким образом следует восстановить поврежденные данные в десятках баз данных? Правильный код может теперь внезапно сломаться, потому что предположения о целостности внешних ключей больше не сохраняются.
В веб-приложениях обычно используется только одна программа, работающая с базой данных, поэтому есть только одно место, где ошибки могут испортить данные. В корпоративном приложении может быть несколько независимых приложений, обращающихся к одной и той же базе данных (не говоря уже о тех, кто работает непосредственно с оболочкой базы данных). Нет никакого способа убедиться, что все приложения следуют тем же предположениям без ошибок, всегда и навсегда.
Если ограничения закодированы в базе данных, то худшее, что может случиться с ошибками, заключается в том, что пользователю показано уродливое сообщение об ошибке, которое не удовлетворено некоторым ограничением SQL. Это предпочтительнее передавать данные в свою корпоративную базу данных, где она, в свою очередь, разбивает все ваши приложения или просто приводит к различным видам неправильного или вводящего в заблуждение вывода.
Ох и ограничения внешнего ключа также улучшают производительность, поскольку они индексируются по умолчанию. Я не могу думать о какой-либо причине не, чтобы использовать ограничения внешнего ключа.
«Предположим, что программист на самом деле делает это правильно» - я даже не могу представить такой сценарий. – recursive 2009-04-19 15:05:38
«Иностранный ключ» - это идея, а не технология. Это реляционное правило. Ваш вопрос действительно о том, следует ли пытаться обеспечить соблюдение правила в вашем коде или позволить базе данных помочь вам. Когда задействован параллелизм, лучше всего позволить механизму базы данных обеспечить соблюдение этого правила, поскольку он знает ВСЕ, что происходит в базе данных, в то время как ваш код не может быть осведомлен. – Triynko 2009-08-25 18:20:01
@ Трийнко, понятие внешних ключей не является реляционным правилом. – 2010-02-08 12:21:33