http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html fornece um algoritmo para inserir e excluir de uma tabela de fechamento.
Eu gostaria de modelar uma estrutura de dados semelhante, exceto que os nós podem ter vários pais.
Dado:
Se removermos [B, C]
, espero terminar com:
e se removermos o nó B
, espero terminar com:
No entanto, se você usar o algoritmo do autor para remover links ou nós, notará que ele marca [D, C, 1]
para exclusão, o que é indesejável.
O que eu tentei até agora
Tentei adaptar a estrutura de dados original adicionando uma references
coluna que indica quantas maneiras existem para viajar entre dois nós. No exemplo acima, você pode viajar de A
para C
através B
ou através D
. A idéia seria que, quando B
removida, o caminho de A
para C
é mantido e a contagem de referência diminui de 2 para 1. Foi legal em teoria, mas não consegui descobrir como fazer a implementação funcionar e agora me pergunto se é possível (a estrutura de dados pode não conter informações suficientes para descobrir quais linhas remover).
O que estou perguntando
Como você adaptaria as tabelas de fechamento para apoiar vários pais? Quais estruturas de dados alternativas você recomendaria? https://stackoverflow.com/q/4048151/14731 contém uma lista exaustiva dessas estruturas de dados, mas não está claro quais suportam (ou são melhores para) vários pais.
references
coluna?Respostas:
Geralmente crie uma tabela de nós e uma tabela de relacionamentos. Os gráficos direcionados não são realmente hierárquicos e podem ter loops, o que dificulta a consulta. Mas se você pensa em um DAG como uma árvore generalizada (isto é, uma árvore que permite vários pais, mas ainda é estritamente hierárquica) e um gráfico direcionado como sendo um DAG generalizado (ou seja, como um DAG, mas não estritamente hierárquico), as coisas ficam mais fáceis.
Portanto, para uma solução PostgreSQL muito simples, podemos fazer algo como:
Então você pode consultar algo como isto:
fonte