2016-04-17 2 views
0

У меня есть две таблицы; чтобы упростить пример, назовем их lawnmower и lawn.Как избежать круговой зависимости здесь

  • Газонокосилка всегда косит газон.
  • Несколько газонокосилок могут косить один и тот же газон.
  • газон имеет одну газонокосилку, которая отвечает за этот газон.
  • Газонокосилка может, однако, быть ответственной за 3 газонов, в то же время .

Интуитивное решение:

  • Пусть ссылка газонокосилки газона он скашивание
  • Пусть лужайки ссылка ответственным газонокосилок

Это дает циклическую зависимость. Какое лучшее решение, чтобы избежать этого? В настоящее время я рассматриваю таблицу responsiblefor с иностранными ключами на газон и газонокосилку. Это, однако, позволяет нескольким газонокосилкам отвечать за тот же газон, чего раньше не было.

+0

OOP проблема с циклическими зависимостями, не применяется к базам данных. В вашем интуитивном решении нет ничего плохого. – reaanb

+0

Интуитивно это было бы невозможно. Либо не может существовать без другого. Я никогда не смогу создать свою первую лужайку или газонокосилку, потому что они нужны друг другу для существования. – Treeline

+1

Для этого нужны транзакции. – reaanb

ответ

1

Во-первых, вы хотите таблицу перехода, потому что это в корне п-м отношения. В этой таблице будет одна строка на газонокосилку и на лужайку (я бы назвал ее LawnmowerLawns или что-то в этом роде).

Теперь обрабатывать пункты пули:

  • Первый из них требует строку в этой таблице для каждого газонокосилки. Это можно обрабатывать с помощью триггера в большинстве баз данных. Есть, вероятно, и другие решения.
  • Второй обрабатывается соединительной таблицей.
  • Третий обрабатываются, имеющим флаг в таблице, чтобы представлять «первичную» газонокосилку для каждого газона. Это можно выполнить с помощью триггера или других механизмов.
  • Четвертый требует триггера (в зависимости от отношения обычно требуются триггеры).
+0

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

+1

Поскольку мы имеем дело с двумя отличными предикатами ('газонокосилка косит газон 'и' газонокосилкой отвечает за газон'), я бы рекомендовал две отдельные таблицы отношений. Это позволяет нам использовать ПК или уникальный ключ для обеспечения эффективности отношений. – reaanb

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