2014-01-24 2 views
1

Для очень большой базы данных данных (более миллиарда строк), где есть очень глубокое дерево данных, какова наиболее эффективная структура? Чтение загрузки является наивысшим использованием, но также есть изменения в дереве на регулярной основе.Эффективная структура базы данных для данных глубокого дерева

Существует несколько стандартных алгоритмов для представления дерева данных. Я нашел эту ссылку в качестве части руководства Mongodb отличным сводкой: http://docs.mongodb.org/manual/tutorial/model-tree-structures/

Моя система имеет свойства, которые плохо сопоставляются ни с одним из этих случаев. Проблема в том, что глубина дерева настолько велика, что держать «предков» или «путь» очень велико. Дерево также часто изменяется настолько, что подход «Вложенные наборы» неэффективен. Я рассматриваю гибрид подхода «Материализованные пути» и «Родительские ссылки», где вместо пути я храню хэш, который не гарантированно является уникальным, но в 90% случаев он является. Затем в 10% случаев происходит столкновение, исходная ссылка разрешает его. Идея состоит в том, что в 90% случаев существует быстрый запрос для хэша пути. Эта идея похожа на технологию фильтра цветения. Но это все для фона: вопрос находится в первой строке этого сообщения.

+0

Не могли бы вы уточнить, что вы подразумеваете под «чтением загрузки»? –

+0

Я имел в виду запросы против вставок, я должен был это сказать. Я имею в виду, что в БД есть регулярные вставки, но большинство запросов - это запросы. Важно то, что это не статическое дерево, вставки могут происходить где угодно в дереве, но 70% доступа для запросов. – tradetree

+0

Какие запросы? Получение всего дерева (из «дерева»)? Получение (прямой) детей данного узла? Получение (рекурсивных) потомков данного узла? Получение (прямой) родительского узла данного узла? Получение (всех) предков данного узла? –

ответ

1

То, что я делал в прошлом с произвольно глубокими деревьями, - это просто хранить родительский ключ с каждым, а также порядковый номер, который управляет порядком детей под родителем. Я использовал RDBM, и это работало очень эффективно. Чтобы упорядочить древовидную структуру после прочтения требуемого кода для правильного упорядочивания - поместите каждый узел в дочернюю коллекцию в родительских узлах, но это фактически довольно быстро.

Это довольно наивный подход, в котором нет ничего умного, но он работает для меня.

У дерева было около 300 или 400 членов, и, я думаю, 7 или 8 уровней в глубину. У этой части системы вообще не было проблем с производительностью: это было очень быстро. Пользовательский интерфейс был другим делом, но это уже другая история.

+0

Возможно, я ошибаюсь, но разве это не очень маленькая БД? 400 членов на 8 уровнях глубоко крошечные, не так ли? Моя проблема заключается не в поиске функционального решения, а в поиске эффективного решения. У меня есть миллиард «членов», если я не понимаю ваше определение для «членов»? – tradetree

+0

Хорошо, вы сказали, что миллиард членов Q. Но это не то, что можно считать само собой разумеющимся (люди на SO говорят всевозможные вещи). Вам нужно сделать это более правдоподобным - например, «миллиард точек данных из-за того-то». В противном случае люди могут подумать, что вы строите новый Facebook (все они, кажется, строят «Социальные сайты»), и, по всей вероятности, он никогда не увидит больше, чем их семья. Так извиняйтесь; этот ответ не подходит. –

+0

PS Я думаю, вы уже посмотрели, но статья Википедии http://en.wikipedia.org/wiki/Graph_(data_structure)#Representations имеет некоторые альтернативы. –

Смежные вопросы