Моделирование ориентированного графа со специальным центральным узлом
-
19-09-2019 - |
Вопрос
Я ищу мнения о том, как смоделировать ориентированный граф, содержащий один специальный узел.
Специальный узел:
- Не может иметь никаких ребер, ведущих к нему.
- Не может быть удален.
Текущий дизайн:
Таблицы:Узлы, Ребра.Ребра содержат два столбца;from_node_id и to_node_id, каждый из которых ссылается на запись в таблице узлов.
Вместо того чтобы хранить специальный узел в качестве первой записи в таблице Nodes, я решил вообще не вести для него запись, создав его отдельно от любых запросов к базе данных.В таблице Edges значение NULL приобретает особое значение в столбце from_node_id, относящемся к центральному узлу.
Моей мотивацией для использования этого дизайна было то, что мне не пришлось бы беспокоиться о защите записи центрального узла от удаления / модификации или ссылки в столбце to_node_id таблицы Edges.Это также автоматически предотвратило бы переход ребра от одного и того же узла к другому.Я понимаю, что у этого дизайна есть некоторые недостатки, такие как невозможность создать из from_node_id и to_node_id составной первичный ключ и, вероятно, многие другие.
В настоящее время я склоняюсь к тому, чтобы сделать центральный узел фактической записью и создавать проверки для этого узла в соответствующих методах базы данных.Каков наилучший способ реализовать этот дизайн?
Решение
Я вижу некоторые аргументы против использования NULL в этом случае.
- Если узлы содержат фактические данные, вам пришлось бы жестко закодировать данные для центрального узла в приложении.
- Возникнут проблемы, если удастся изменить центральный узел.
- Обычное значение NULL заключается в том, что значения нет или оно неизвестно.Из-за этого другой человек, который подходит к предлагаемому дизайну, может счесть его неинтуитивным.
Другими словами, я бы предпочел иметь строку в базе данных для центрального узла.