Реляционные базы данных могут обрабатывать графовые структуры. Некоторые из них могут даже элегантно обрабатывать их (так же элегантно, как и реляционная база данных!).
Ключом к общей обработке графа в реляционных базах данных является рекурсивное общее табличное выражение (RCTE), которое в основном позволяет итеративно (не рекурсивно, несмотря на имя) расширять запрос по набору строк, объединяя запрос, который выбирает корневой набор строк, и запрос, который определяет соседние строки, выбранные до сих пор. Синтаксис немного неуклюжий, но он общий и мощный.
RCTE поддерживаются в PostgreSQL, Firebird, SQL Server и, очевидно, в DB2. Oracle имеет другую, но эквивалентную конструкцию; Я читал, что последние версии поддерживают правильные RCTE. MySQL не поддерживает RCTE. Если вы не знакомы с MySQL, я бы настоятельно рекомендовал вам использовать PostgreSQL, который по сути является гораздо лучшей базой данных.
Однако, похоже, вам не нужно поддерживать общие графики, только деревья. В этом случае вам доступны более конкретные опции.
Один из них - это классические, но довольно умопомрачительные вложенные наборы .
Более простым является сохранение пути с каждой строкой: это строка, которая представляет позицию строки в дереве, и обладает свойством того, что путь для узла является префиксом пути для любого подузла, что позволяет Вы очень эффективно выполняете различные запросы о происхождении («является ли узел A дочерним по отношению к узлу B?», «что такое узел A и самый низкий общий предок узла B?» и т. д.). Например, вы можете построить путь для строки, пройдя дерево от корня и соединив идентификаторы строк, встречающихся на пути, с косой чертой. Это просто построить, но позаботиться о сохранении, если вы переставите дерево. С помощью столбца пути вы можете ограничить запрос заданным деревом, просто добавив and path like '23/%'
, где 23
- идентификатор корня.
Итак, хотя база данных графиков, вероятно, является лучшим способом хранения и запроса данных графиков, это не единственный вариант, и я бы посоветовал вам сравнить преимущества использования базы данных с преимуществами объединения всех ваших данных в одну. базы данных.