Mysql
 sql >> Base de données >  >> RDS >> Mysql

Calculer la profondeur dans un modèle parent-enfant dans MySQL

Cela dépend de l'implémentation réelle de votre hiérarchie dans la base de données. Si vous utilisez le modèle d'ensembles imbriqués ( http://mikehillyer.com/articles/managing-hierarchical-data- in-mysql/ ) vous pouvez récupérer le chemin complet parent-enfant via une seule sélection.

Mettre à jour :Ok, puisque vous utilisez le modèle de liste de contiguïté, je suggère de stocker le niveau de nœud dans la table. Non seulement cela vous donnera la profondeur du nœud dans une requête, mais cela vous permettra également de récupérer le chemin complet vers ce nœud dans une requête (bien que cette requête doive être générée dynamiquement) :

SELECT n1.name AS lvl1, n2.name as lvl2, n3.name as lvl3, ..., nN.name as lvlN
  FROM nodes AS n1
  JOIN nodes AS n2 ON n2.parent_id = n1.id
  JOIN nodes AS n3 ON n3.parent_id = n2.id
  ...
  JOIN nodes AS nN ON nN.parent_id = n(N-1).id
WHERE nN.id = myChildNode;

Puisque vous savez que votre nœud est au niveau N, il n'y a pas besoin de jointures à gauche et, étant donné les index appropriés sur id / parent_id, cela devrait être raisonnablement rapide.
L'inconvénient de cette approche est que vous devrez garder le niveau du nœud mis à jour lors des déplacements de nœuds, mais cela devrait être raisonnablement simple et rapide car vous ne le feriez que pour le nœud lui-même et ses enfants - pas pour la majorité de la table comme vous le feriez avec des ensembles imbriqués.