Исключение для циклической справочной базы данных - это одно?
У меня есть 4 таблицы, связанные в круговой ссылке - я помню из колледжа, что мне сказали, что это плохо, однако есть исключения...Я надеюсь, что это один из них:)
Моя база данных содержит 4 таблицы; учителя, классы, предметы и классы учителей.
Мои отношения суммируются следующим образом:
- учитель может иметь много классов
- класс может иметь много учителей (поэтому teachers_classes устраняет здесь много-ко-многим).
- класс может иметь многие предметы
- субъект может иметь только 1 класс
- учитель может иметь много предметов
Если вы можете визуализировать это, мой ERD выглядит как квадрат (или круг)... Я уже построил свое простое приложение, и кто-то другой предложил мне проверить эту проблему.. пожалуйста, кто-нибудь скажите мне, что это исключение и почему? Я не могу вспомнить ничего из того, чему меня учили об этом, но мое приложение, кажется, работает совершенно нормально для того, что я хочу, чтобы оно делало!
1 ответ:
Циклические ссылки могут быть плохими по нескольким причинам:
В случае, когда отношения должны существовать (то есть учительдолжен иметь класс, А классдолжен иметь учителя, как с точки зрения бизнеса, так и с точки зрения технических требований), вы сталкиваетесь со сценарием "курица или яйцо": вы не можете добавить учителя без класса, и вы не можете добавить класс без учителя.
Предполагая, что у вас могут быть учителя без классов и / или предметы без классов, похоже, что один из этих двух будет "верхним" (с точки зрения бизнеса, я бы предположил, что это будут предметы). Если то, что у вас есть, работает, я не вижу проблемы с дизайном, и я не вижу альтернативного способа его проектирования.- это затрудняет вычисление того, что находится на "вершине" heirarchy (поскольку, по правде говоря, нет "верха")
Редактировать после комментария
С этим нет проблем. односторонняя зависимость (это как раз то, что представляет собой обычный внешний ключ, не допускающий обнуления).
Мне кажется, что я также должен указать на кое-что, основываясь на вашем комментарии: возражения против циклических зависимостей являются техническими, а не логическими. Если бизнес говорит, что не может быть учителей без классов и классов без учителей, это нормально; вы просто не можете моделировать данные таким образом, или вы никогда не сможете ничего добавить. Вы должны определить, какой из них объекты-классы или учителя-могут существовать изолированно (с технической точки зрения, а не с точки зрения бизнеса).
Вас несколько спасает тот факт, что у вас есть 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)