Включить внешние ключи в таблицу создания таблицы Mysql или таблицы ссылок в приложении php?

Перед созданием базы данных для потенциального приложения PHP/Mysql я просматривал свои таблицы в MySql Workbench и замечал возможность включения внешнего ключа при построении каждой таблицы.

Должен ли я объявлять внешние ключи в операторах SQL, которые строят таблицы при создании базы данных? Или... должен ли я просто связывать таблицы в операциях select и insert SQL на моих PHP-страницах? Почему или почему нет?

3 ответа

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

Внешние ключи являются одним из наиболее важных способов обеспечения целостности данных (они существенно защищают от оборванных указателей 1). Это почти единственный правильный и эффективный способ сделать это в параллельной среде.

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

1 Я использую слово "указатель" здесь свободно.

2 Ошибка даже в одном из приложений, которые записывают в базу данных, может привести к опасным последствиям для данных. Если несколько клиентов пытаются одновременно сопоставить связанные данные, могут возникнуть жесткие условия гонки; блокировка, вероятно, будет необходима, оказывая влияние на масштабируемость.

3 Целостность домена (ограничения типа и ограничения CHECK), целостность ключа (ограничения PRIMARY KEY и UNIQUE) и ссылочная целостность (ограничения FOREIGN KEY).

4 Такие как триггеры и хранимые процедуры.


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

Эти "сиротские" строки трудно предотвратить и даже трудно обнаружить, если у вас нет ограничений внешнего ключа. Вы в основном должны полагаться на создание идеального кода в своем приложении - это опасная вещь, от которой зависит! ;-)

Я написал о том, как автоматизировать обнаружение сиротских строк здесь: http://www.mysqlperformanceblog.com/2011/11/18/eventual-consistency-in-mysql/


Сначала узнайте, каково значение ограничений внешнего ключа.

http://www.w3schools.com/sql/sql_foreignkey.asp

И кроме того, я всегда верю, что работать в вашем DB труднее с кодом меньше

licensed under cc by-sa 3.0 with attribution.