Использование реляционной базы данных является жизнеспособным решением.Для ваших нужд - быстрой вставки, обновления, удаления - я бы использовать список смежности с дополнительными настройками, как, например:
id
parent_id
cardinality -- sort order for all nodes with the same parent_id
depth -- distance from the root node
Расчет cardinality
и depth
осуществляется либо с кодом или - предпочтительно - триггер базы данных для любого вставить, удалить или обновить. Кроме того, для извлечения целой иерархии с одним ЗЕЬЕСТОМ, иерархия таблица моста вызывается для:
id
descendent_id
Этой таблица также будет заполняться с помощью тех же триггеров, упомянутых выше, и служит в качестве средства для извлечения всех узлов выше или ниже заданного id
.
See this question for additional detail around Adjacency List, Hierarchy Bridge and other approaches for storing hierarchical data in a relational database.
Наконец, чтобы предоставить некоторые дополнительные разъяснения относительно вариантов, которые вы перечислили:
- Flat Files: сочетание связанных списков и памяти отображаются файлы, вероятно, служить, но вы на самом деле просто добавить собственные в эта точка, где решение SQL или NoSQL, вероятно, будет лучше.
- SQL: это был бы мой подход - инструментарий лучше всего подходит для обработки данных, резервного копирования и восстановления.
- XML: это также возможность с базой данных, очень конкретный поставщик, вам необходимо изучить синтаксис для вставки узла, обновления и удаления. Может быть очень быстрым, если база данных предлагает тип данных XML.
- NoSQL: если вы говорите, тем key-value storagetypical approach for hierarchical data appears to be materialized path, но это потребует перерасчет всего пути для всех затронутых узлов на изменениях, которые, вероятно, медленно. Вместо этого рассмотрим, что Java Content Repository (JCR) - Apache Jackrabbit - это API всей реализации, ориентированный вокруг иерархических структурированных данных и сохраняющий его - возможно, слишком тяжелый для проблемы, которую вы пытаетесь решить.
- вуду: гм ...
Update
Если вы реализуете все части из этого ответа, добавить дешево, пересортировывать небольшая стоимость, шаг стоит дорого. Компромисс - это быстрый просмотр обхода иерархии - например, найдите полную родословную узла за одну операцию. В частности, добавление листа является операцией O (1). Повторная сортировка означает обновление мощности всех узлов-узлов, следующих за перемещенным узлом. Перемещение означает обновление (1) мощности для исходных и целевых узлов-узлов, следующих за ним, (2) глубина перемещенных и потоковых-узлов и (3) удаление и добавление родословной в таблицу иерархических мостов.
Однако, перейдите только с списком Adjancency List (т. Е. id, parent_id
), и напишите, что дешево, читает на одном уровне, дешево, но читает, что траверс иерархии дорог. В последнем случае потребуется использовать рекурсивный SQL, такой как CONNECT BY Oracle или Common Table Expressions, как в SQL Server и других РСУБД.
Насколько эффективны эти методы sql для представления деревьев и упорядоченных списков? Я всегда думал, что SQL лучше с наборами/неупорядоченными. Тем не менее, я рассмотрю эти представления иерархии SQL. JCR казался интересным, но для этого довольно тяжело – windoze
@windoze: см. Мое обновление. – orangepips