Использование реляционной базы данных является жизнеспособным решением.Для ваших нужд - быстрая вставка, обновление, удаление - я бы использовал Список смежности с дополнительными настройками:
id
parent_id
cardinality -- sort order for all nodes with the same parent_id
depth -- distance from the root node
Вычисление cardinality
и depth
выполняется с помощью кода или - предпочтительно- триггер базы данных для любой вставки, удаления или обновления.Кроме того, для извлечения всей иерархии с помощью одного оператора SELECT вызывается таблица моста иерархии:
id
descendent_id
Эта таблица также заполняется через тот же триггер, упомянутый выше, и служит средством для извлечения всехузлы выше или ниже данного id
.
См. Этот вопрос для получения дополнительной информации о Списке смежности, Мосте иерархии и других подходах для хранения иерархических данных в реляционной базе данных .
Наконец, чтобы дать некоторые дополнительные разъяснения по опциям, которые вы перечислили:
- Плоские файлы : комбинация связанных списков и файлов, отображаемых в память, вероятно, подойдет, нона самом деле вы просто катитесь на своем месте в тот момент, когда решение SQL или NoSQL, вероятно, будет лучше.
- SQL : это мой подход - здесь лучше всего подходят инструменты для манипулирования данными, резервного копирования и восстановления.
- XML : это также возможно с базой данных, в зависимости от конкретного поставщика, вам необходимо изучить синтаксис для вставки, обновления и удаления узла.Может быть очень быстрым, если база данных предлагает тип данных XML.
- NoSQL : если вы говорите хранилище значений ключей , типичный подход для иерархических данных представляется материализованным путем, но для этого потребуется пересчитать весь путь для всех затронутых узлов при изменении, что, вероятно, медленно.Вместо этого рассмотрим Java Content Repository (JCR) - Apache Jackrabbit - это реализация - весь API, сосредоточенный вокруг представления иерархически структурированных данных и их сохранения - возможно, слишком тяжелый для проблемы, которую вы пытаетесь решитьрешать.
- voodoo : гм ...
Обновление
Если , вы реализуете всекусочки из этого ответа, добавить это дешево, пересортировать это небольшая стоимость, перемещение стоит дорого.Компромисс - быстрое чтение иерархии - например, найдите полное происхождение узла за одну операцию.В частности, добавление листа является операцией O (1).Повторная сортировка означает обновление мощности всех равноправных узлов, следующих за перемещенным узлом.Перемещение означает обновление (1) количества элементов для узлов-отправителей источника и назначения, следующих после, (2) глубины перемещенных и нисходящих узлов и (3) удаление и добавление предков в таблицу мостов иерархии.
Тем не менее, используйте только Список смежности (т. Е. id, parent_id
), и запись становится дешевой, чтение для одного уровня - дешевым, но чтение, которое пересекает иерархию, дорого.Тогда последнему потребуется использовать рекурсивный SQL, такой как Oracle CONNECT BY или Common Table Expressions, как в SQL Server и других RDBMS.