Эффективная база данных для предков на ациклическом направленном графике
-
04-10-2019 - |
Вопрос
Скажем, у меня есть ациклический направленный график, такой как семья «дерево» (не очень дерево, так как у ребенка есть 2 родителя). Я хочу разместить представление этого графа в реляционный База данных, так что быстро вычислять все предки узла, и все потомки узла. Как бы вы представляли этот график? Как бы вы запрашивали всех потомков? Как бы вы вставили и удалите узлы и отношения? Какие предположения вы делаете о данных?
Лучшее решение будет иметь лучший большой O для числа select/insert/delete
Заявления, которые вы выполняете, чтобы запросить предки и потомки, причем галстуки, сломанные лучшими большими o для полной среды выполнения, причем связи, сломанные требованиями к пространству.
Мой коллеги поставил этот вопрос ко мне. У меня есть решение, но это экспоненциальный размер в худшем случае, поэтому я хотел понять, как другие люди решат это.
редактировать
Осветленная реляционная база данных. Этот вопрос тривиальный (и скучный), если вы используете графические базы данных со встроенным транзитивным замком.
Решение
Если selects
> manipulations
, и особенно поддерево выбирает (все предки, все потомки) я бы пошел на Закрытиеподход подхода. Да, взрыв дорожек в вашем патриственном столе, но он быстро доставляет результаты (в отличие от модели смежности) и сохраняет обновления ограничиваться соответствующими частями (в отличие от обновления 50% со вложенным набором).
Билл Карвин имеет хорошую презентацию онлайн о плюсах и минусах разных моделей, см. http://www.slidehare.net/billkarwin/models-for-hierarchical-data. (Slide 48 - это обзор).
Другие советы
Для DAGS в базах данных SQL появилось только два решения:
Рекурсивный с предложением.
Я не знаю о любой схеме маркировки практического графика (например, вложенные множества, интервалы или материализованный путь)
«Как бы вы представляли этот график?»
- Соотношение узлов VAR {Узел: keyype} Ключ {Узел};
- RA VAR REGES REATION {Parentnode: keype childnode: keyype} key {childnode parentnode};
- CONSTRAINT NO_CYCLES ISEMPTY (TCLOSE (края), где Parentnode = Childnode);
«Как бы вы запрашивали всех потомков?»
TCLOSE (кромки), где Parentnode = quoteValue;
«Как бы вы вставили и удалите узлы и отношения?»
- Вставьте в ребра соотношение {Tupple {parentnode quotalue chlidnode quotalue}};
- Удалить края, где удаление;
«Какие предположения вы делаете о данных?»
Что делать предположения, чтобы сделать? Вы указали все, что есть указать, говоря «направленный ациклический график».
RDBMS: S не очень предназначен для обработки этих данных. Очевидный выбор - использовать Графическая база данных Вместо этого нет необходимости переводить график в другое представление, вы используете графический API полностью. Там хорошая презентация Марко Родригеса, объясняющая влияние базовой модели данных при работе с графическими обходами, см. Шаблон программирования обхода графика Если вы хотите выглядеть глубже в это.
Я записал простой пример Обработка DAGS с базой данных Graph Neo4j Данное назад, что может быть полезно для вас.
В реляционной базе данных я бы хранил для каждого узла:
- отец
- Дети
- предки
С индексом на все и полный индекс на предках
Запрос :
- Все предки:
- O (log n) (найдите узел, то вы закончите)
- Все потомки:
- O (Поиск полного индекса на предках) (зависит от базы данных)
- Добавьте новый узел / Удалить узла (без детей):
- O (1) для отца + предков
- O (log n), чтобы найти отца
- Обновление детей отца O (| Ребенок отца |)
- Переместить узел (сложно) :
- O (1) обновить отец
- O (log n) найти старых / новых отцов
- Обновите детей отца дважды O (детей отца |)
- Обновить предки всех потомков (простой заменить): O (| потомки | * | глубина максимального дерева |) (глубина max: заменить и создать большую строку max (глубину))
Общая сложность будет зависит от:
- глубина дерева
- Сбалансированное дерево?
- Количество детей? (в среднем, макс ...)
- сложность работы в данной реляционной базе данных
Для выбора только эффективно, но сложно для обновлений.
На практике: Работа на дереве ОЗУ (например, MemChaed, держите все в оперативной памяти) и если нет возможности купить больше RAM, «Cur», которое вы деревате в меньших деревьях.
Все потомки все равно будут стоить намного, с подделками вы можете иметь потомки максимальной глубины D, не имея их всех.
Вы «прыгаете» образуют под дереву в поддеревку: больше запроса, но более быстрых и перемещают узел.