Циркулярные ссылки могут быть плохими по нескольким причинам:
- В случае, когда существуют отношения должны (т. Е. Учитель должен иметь класс, а класс должен иметь учителя, оба из бизнеса и с точки зрения технических требований), вы сталкиваетесь со сценарием «курица или яйцо»: вы не можете добавить учителя без класса и не можете добавить класс без учителя.
- Это затрудняет выяснение того, что находится на "вершине" иерархии (поскольку, честно говоря, нет "вершины")
Предполагая, что у вас могут быть учителя без классов и / или предметов без классов, похоже, что один из этих двух будет «верхом» (с точки зрения бизнеса, я бы предположил, что это будут предметы).
Если то, что у вас есть, работает, я не вижу проблем с дизайном и не вижу альтернативного способа его разработки.
Редактировать после комментария
Нет проблем с односторонней зависимостью (это то, что представляет собой обычный ненулевой внешний ключ).
Я чувствую, что должен также указать кое-что, основываясь на вашем комментарии: возражения против циклических зависимостей технические , а не логические . Если бизнес говорит, что не может быть учителей без классов и классов без учителей, это нормально; вы просто не можете смоделировать данные таким образом, или вы никогда не сможете ничего добавить. Вы должны определить, какой из этих объектов - классы или учителя - может существовать изолированно (с технической точки зрения, а не с точки зрения бизнеса).
Вы несколько спасены тем, что у вас есть отношения 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)
Итак, с технической точки зрения у вас нет истинной круговой зависимости.