Довольно простой пример:
A Компания может иметь N Местоположений , и одно из этих Местоположений является Основным Местоположением. Можем ли мы решить эту проблему с помощью внешних ключей MySQL?
Наш текущий подход заключается в том, чтобы указатель на компанию в каждом местоположении (company_id) и указатель на местоположение в компании (main_location_id).
Предполагая, что мы не разрешаем нулевые ссылки, этот подход явно неверен, поскольку запрещает создание: вы не можете создать компанию, потому что у нее нет main_location_id, и вы не можете создать местоположение, потому что if не имеет company_id. Транзакции не помогают, учитывая, что проверки по-прежнему выполняются на каждом этапе транзакции.
Есть идеи?
Спасибо!
изменить 1
Некоторые люди предлагали использовать флаг с уникальным индексом в Location или в промежуточной таблице для решения проблемы. Мы уже рассмотрели это, но у него есть одна главная проблема: он добавляет накладные расходы, так как добавление нового основного местоположения потребовало бы обхода всех других местоположений, чтобы установить их флаги в false.
редактировать 2
Нашим предпочтительным решением (в идеальном мире) будет проверка проверок в конце транзакции, а не на каждом этапе. Это можно сделать, отключив проверку внешнего ключа, как это было предложено в комментариях, но это, конечно, неоптимальное решение.
Вывод:
Невозможно сделать это с MySQL, не ослабив одно из ограничений. Мы будем использовать проверку перед вставкой в компании, чтобы проверить, что ссылка на местоположение не является нулевой.
Тем не менее, я все еще заинтригован, почему MySQL не позволяет проходить проверки в конце транзакции, вместо того, чтобы делать это на каждом этапе.