http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html fournit un algorithme pour l'insertion et la suppression d'une table de fermeture.
Je voudrais modéliser une structure de données similaire, sauf que les nœuds peuvent avoir plusieurs parents.
Donné:
Si nous supprimons, [B, C]
je m'attends à me retrouver avec:
et si nous supprimons le nœud, B
je m'attends à finir avec:
Cependant, si vous utilisez l'algorithme de l'auteur pour supprimer des liens ou des nœuds, vous remarquerez qu'il marque [D, C, 1]
pour la suppression, ce qui n'est pas souhaitable.
Ce que j'ai essayé jusqu'à présent
J'ai essayé d'adapter la structure de données d'origine en ajoutant une references
colonne qui indique le nombre de façons de voyager entre deux nœuds. Dans l'exemple ci-dessus, vous pouvez voyager de A
à C
à travers B
ou à travers D
. L'idée aurait été que lors de la B
suppression, le chemin de A
à C
est conservé et le nombre de références diminue de 2 à 1. C'était sympa en théorie, mais je ne pouvais pas comprendre comment faire fonctionner l'implémentation et maintenant je me demande si c'est tout à fait possible (la structure de données peut ne pas contenir suffisamment d'informations pour déterminer les lignes à supprimer).
Ce que je demande
Comment adapteriez-vous les tables de fermeture pour soutenir plusieurs parents? Quelles structures de données alternatives recommanderiez-vous? https://stackoverflow.com/q/4048151/14731 contient une liste exaustive de ces structures de données, mais il n'est pas clair lesquelles prennent en charge (ou sont les meilleures pour) plusieurs parents.
references
colonne?Réponses:
Créez généralement une table de nœuds et une table de relations. Les graphiques dirigés ne sont pas vraiment hiérarchiques et peuvent avoir des boucles, ce qui rend les requêtes plus difficiles. Mais si vous considérez un DAG comme un arbre généralisé (c'est-à-dire un arbre qui autorise plusieurs parents mais est toujours strictement hiérarchique) et un graphique dirigé comme étant un DAG généralisé (c'est-à-dire comme un DAG mais pas strictement hiérarchique), les choses deviennent plus faciles.
Donc, pour une solution PostgreSQL très simple, nous pourrions faire quelque chose comme:
Ensuite, vous pouvez interroger quelque chose comme ceci:
la source