Пусть та же система, что и тут
https://rsdn.org/forum/db/8843633.1Автор: Pavel Dvorkin
Дата: 30.10 04:24
пусть есть таблица institute с одной строкой. Или как-то иначе. Это здесь не обсуждаем.
Есть факультеты. Таблица faculty с FK (или без него, как хотите) на institute
На факультете есть группы. Таблица `group` с FK на faculty.
А еще есть студенты. Таблица student и вот тут вопрос
Студент входит в группу, но ей не принадлежит. После приказа ректора о зачислении он на короткое время становится студентом вне группы, пока его в группу декан не определит. Если уйдет в академотпуск, то до возвращения из него будет опять студентом вне группы.
Значит, FK на `group' с разрешением NULL и с ON DELETE SET NULL. Допустим.
Но если он не в группе, то он все же на факультете. Впрочем, если и в группе, то тоже.
Получается еще один FK на faculty, и тут уже без разрешения NULL, так как вне факультета он быть не может.
В итоге у студента должно быть 2 FK — на группу и факультет. Но группа имеет FK на факультет. Получается, что студент фактически имеет 2 FK на факультет — один явно, а другой косвенно, через свой FK на группу и FK группы на факультет.
Убрать его явный FK на факультет нельзя — при выходе из группы он станет не пойми какого факультета.
Убрать его FK на группу тоже нельзя.
На императивном языке можно было бы ограничиться одной ссылкой на некий интерфейс или базовый класс. Если студент член группы, то на Group (а она на Faculty), если не член — прямо на Faculty. Может, и не лучшее решение, но возможное. А тут одним FK можно обойтись ?