http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html предоставляет алгоритм для вставки и удаления из таблицы закрытия.
Я хотел бы смоделировать подобную структуру данных, за исключением того, что у узлов может быть несколько родителей.
Данный:
Если мы удалим, [B, C]
я ожидаю, что в конечном итоге:
и если мы удалим узел, B
я ожидаю, что в конечном итоге:
Однако, если вы используете авторский алгоритм для удаления ссылок или узлов, вы заметите, что это теги [D, C, 1]
для удаления, что нежелательно.
Что я пробовал до сих пор
Я попытался адаптировать исходную структуру данных, добавив references
столбец, в котором указано, сколько способов пройти между двумя узлами. В приведенном выше примере, вы можете путешествовать от A
до C
или через B
или через D
. Идея состояла в том, чтобы при B
удалении сохранялся путь от A
к C
и счетчик ссылок уменьшался с 2 до 1. Теоретически это было хорошо, но я не мог понять, как заставить реализацию работать, и теперь мне интересно, это вообще возможно (структура данных может не содержать достаточно информации, чтобы выяснить, какие строки удалить).
Что я спрашиваю
Как бы вы адаптировали Closes Tables для поддержки нескольких родителей? Какие альтернативные структуры данных вы бы порекомендовали? https://stackoverflow.com/q/4048151/14731 содержит исчерпывающий список таких структур данных, но не ясно, какие из них поддерживают (или лучше всего подходят) несколько родителей.
references
колонка?Ответы:
Обычно создают таблицу узлов и таблицу отношений. Направленные графы не являются действительно иерархическими, и у них могут быть циклы, что усложняет запрос. Но если вы думаете о DAG как об обобщенном дереве (т. Е. О дереве, допускающем несколько родителей, но все еще строго иерархически), и о ориентированном графе как об обобщенном DAG (то есть, как DAG, но не строго иерархически), то все становится проще.
Поэтому для очень простого решения PostgreSQL мы можем сделать что-то вроде:
Затем вы можете запросить что-то вроде этого:
источник