Исключение для круговой базы данных - это? - PullRequest
2 голосов
/ 29 апреля 2010

У меня есть 4 таблицы, связанные в круговую ссылку - я помню из колледжа, что мне сказали, что это плохо, но есть исключения ... Я надеюсь, что это одна из них:)

Моя база данных содержит 4 таблицы; учителя, классы, предметы и учителя_классы.

Следующее подводит итог моих отношений:

  • Учитель может иметь много классов
  • В классе может быть много учителей (поэтому учителя_классы здесь исключают множество ко многим).
  • В классе может быть много предметов
  • Субъект может иметь только 1 класс
  • Учитель может иметь много предметов

Если вы можете визуализировать это, мой ERD выглядит как квадрат (или круг) ... Я уже построил свое простое приложение, и кто-то еще попросил его проверить эту проблему. Пожалуйста, кто-то скажет мне, что это исключение и почему? Я не могу вспомнить ничего из того, чему меня учили об этом, но, похоже, мое приложение работает совершенно нормально для того, что я хочу, чтобы оно делало!

1 Ответ

2 голосов
/ 29 апреля 2010

Циркулярные ссылки могут быть плохими по нескольким причинам:

  1. В случае, когда существуют отношения должны (т. Е. Учитель должен иметь класс, а класс должен иметь учителя, оба из бизнеса и с точки зрения технических требований), вы сталкиваетесь со сценарием «курица или яйцо»: вы не можете добавить учителя без класса и не можете добавить класс без учителя.
  2. Это затрудняет выяснение того, что находится на "вершине" иерархии (поскольку, честно говоря, нет "вершины")

Предполагая, что у вас могут быть учителя без классов и / или предметов без классов, похоже, что один из этих двух будет «верхом» (с точки зрения бизнеса, я бы предположил, что это будут предметы).

Если то, что у вас есть, работает, я не вижу проблем с дизайном и не вижу альтернативного способа его разработки.


Редактировать после комментария

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

Я чувствую, что должен также указать кое-что, основываясь на вашем комментарии: возражения против циклических зависимостей технические , а не логические . Если бизнес говорит, что не может быть учителей без классов и классов без учителей, это нормально; вы просто не можете смоделировать данные таким образом, или вы никогда не сможете ничего добавить. Вы должны определить, какой из этих объектов - классы или учителя - может существовать изолированно (с технической точки зрения, а не с точки зрения бизнеса).

Вы несколько спасены тем, что у вас есть отношения M: M между учителями и классами, потому что это заставляет вас оба существовать в изоляции (так как соединение устанавливается в таблица ссылок, а не в самих таблицах участников.

Из-за этого у вас нет истинной круговой зависимости. Ваша бизнес-логика круговая, но это нормально, поскольку вы полностью контролируете ее работу. Ваш макет либо выглядит так:

   Teacher <----- TeacherClass -----> Class
      ^                                 ^
      |                                 |
      |                                 |
TeacherSubject --------------------> Subject

(если учитель может иметь несколько предметов)

Или это:

   Teacher <----- TeacherClass -----> Class
      |                                 ^
      |                                 |
      |                                 |
      \----------------------------> Subject

(если учитель может иметь только один предмет)

Или это:

   Teacher <----- TeacherClass -----> Class
      ^                                 ^
      |                                 |
      |                                 |
      \----------------------------- Subject

(Если предмет может иметь только одного учителя)

В первом случае и Teacher, и Class являются объектами верхнего уровня, поскольку ни один из них не указывает ни на что другое (таблицы ссылок выполняют это). Во втором случае только Class является сущностью верхнего уровня.

Пока на пути есть сущность верхнего уровня, все в порядке. Во первых, вы можете добавлять записи в следующем порядке:

Teacher -> Class -> (TeacherClass -> Subject) -> TeacherSubject

(я заключил TeacherClass -> Subject в парены, потому что вы можете добавить их в любом порядке)

Во втором вы можете добавить их в следующем порядке:

Class -> Subject -> Teacher -> TeacherClass

В третьем вы можете добавить их в следующем порядке:

Class -> Teacher -> (TeacherClass -> Subject)

Итак, с технической точки зрения у вас нет истинной круговой зависимости.

...