Эффективная база данных для предков на ациклическом направленном графике

StackOverflow https://stackoverflow.com/questions/3755439

Вопрос

Скажем, у меня есть ациклический направленный график, такой как семья «дерево» (не очень дерево, так как у ребенка есть 2 родителя). Я хочу разместить представление этого графа в реляционный База данных, так что быстро вычислять все предки узла, и все потомки узла. Как бы вы представляли этот график? Как бы вы запрашивали всех потомков? Как бы вы вставили и удалите узлы и отношения? Какие предположения вы делаете о данных?

Лучшее решение будет иметь лучший большой O для числа select/insert/delete Заявления, которые вы выполняете, чтобы запросить предки и потомки, причем галстуки, сломанные лучшими большими o для полной среды выполнения, причем связи, сломанные требованиями к пространству.

Мой коллеги поставил этот вопрос ко мне. У меня есть решение, но это экспоненциальный размер в худшем случае, поэтому я хотел понять, как другие люди решат это.

редактировать

Осветленная реляционная база данных. Этот вопрос тривиальный (и скучный), если вы используете графические базы данных со встроенным транзитивным замком.

Это было полезно?

Решение

Если selects > manipulations, и особенно поддерево выбирает (все предки, все потомки) я бы пошел на Закрытиеподход подхода. Да, взрыв дорожек в вашем патриственном столе, но он быстро доставляет результаты (в отличие от модели смежности) и сохраняет обновления ограничиваться соответствующими частями (в отличие от обновления 50% со вложенным набором).

Билл Карвин имеет хорошую презентацию онлайн о плюсах и минусах разных моделей, см. http://www.slidehare.net/billkarwin/models-for-hierarchical-data. (Slide 48 - это обзор).

Другие советы

Для DAGS в базах данных SQL появилось только два решения:

  1. Рекурсивный с предложением.

  2. Переходное закрытие

Я не знаю о любой схеме маркировки практического графика (например, вложенные множества, интервалы или материализованный путь)

«Как бы вы представляли этот график?»

  • Соотношение узлов 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, не имея их всех.

Вы «прыгаете» образуют под дереву в поддеревку: больше запроса, но более быстрых и перемещают узел.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top