Как решить круговую ссылку между двумя таблицами? - PullRequest
0 голосов
/ 06 июля 2018

Довольно простой пример:

A Компания может иметь N Местоположений , и одно из этих Местоположений является Основным Местоположением. Можем ли мы решить эту проблему с помощью внешних ключей MySQL?

Наш текущий подход заключается в том, чтобы указатель на компанию в каждом местоположении (company_id) и указатель на местоположение в компании (main_location_id).

Предполагая, что мы не разрешаем нулевые ссылки, этот подход явно неверен, поскольку запрещает создание: вы не можете создать компанию, потому что у нее нет main_location_id, и вы не можете создать местоположение, потому что if не имеет company_id. Транзакции не помогают, учитывая, что проверки по-прежнему выполняются на каждом этапе транзакции.

Есть идеи?

Спасибо!

изменить 1

Некоторые люди предлагали использовать флаг с уникальным индексом в Location или в промежуточной таблице для решения проблемы. Мы уже рассмотрели это, но у него есть одна главная проблема: он добавляет накладные расходы, так как добавление нового основного местоположения потребовало бы обхода всех других местоположений, чтобы установить их флаги в false.

редактировать 2

Нашим предпочтительным решением (в идеальном мире) будет проверка проверок в конце транзакции, а не на каждом этапе. Это можно сделать, отключив проверку внешнего ключа, как это было предложено в комментариях, но это, конечно, неоптимальное решение.

Вывод:

Невозможно сделать это с MySQL, не ослабив одно из ограничений. Мы будем использовать проверку перед вставкой в ​​компании, чтобы проверить, что ссылка на местоположение не является нулевой.

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

1 Ответ

0 голосов
/ 06 июля 2018

У вас должно быть три стола.

Первая, ваша таблица Company, где вы имеете скалярную информацию о вашей компании (в виде названия, фискального кода и т. Д.)

Второй, таблица с Location без ссылки на вашу компанию. В этой таблице, т.е. у вас есть строки как:

  • Трафальгарская площадь
  • Улица Умберто

и т. Д.

Третья, средняя таблица, CompanyLocation, где у вас есть двойной внешний ключ, companyId и locationId, и третий столбец, представленный флагом (isPrimary)

Вот и все

...