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

Atteindre la hiérarchie, la relation parent/enfant de manière efficace et simple

Malheureusement, si vous ne pouvez pas modifier le modèle de données et que vous utilisez MySQL, vous êtes coincé dans une situation où vous avez besoin de requêtes récursives et vous utilisez un SGBD qui ne prend pas en charge les requêtes récursives.

Quassnoi a écrit une intéressante série d'articles de blog, montrant des techniques d'interrogation des données hiérarchiques. Ses solutions sont assez intelligentes, mais très complexes.http:// expliquerextended.com/2009/03/17/hierarchical-queries-in-mysql/

PostgreSQL est un autre SGBDR open source, qui prend en charge les requêtes récursives , afin que vous puissiez récupérer un arbre entier stocké de la manière que vous montrez. Mais si vous ne pouvez pas modifier le modèle de données, je suppose que vous ne pouvez pas passer à un autre SGBDR.

Il existe plusieurs modèles de données alternatifs qui facilitent la récupération d'arbres de profondeur arbitraire :

  • Table de fermeture
  • Ensembles imbriqués ou parcours d'arbre de précommande modifié
  • Énumération de chemin ou chemin matérialisé

Je les couvre dans ma présentation Modèles pour les données hiérarchiques avec SQL et PHP , et dans mon livre Antipatterns SQL :éviter les pièges de la programmation de base de données .

Enfin, il existe une autre solution que j'ai vue utilisée dans le code pour Slashdot , pour leurs hiérarchies de commentaires :ils stockent "parent_id" comme dans Adjacency List, mais ils stockent également une colonne "root_id". Chaque membre d'un arbre donné a la même valeur pour root_id, qui est le nœud ancêtre le plus élevé de son arbre. Ensuite, il est facile de récupérer un arbre entier en une seule requête :

SELECT * FROM site WHERE root_id = 123;

Ensuite, votre application récupère tous les nœuds de la base de données dans un tableau, et vous devez écrire le code pour boucler sur ce tableau, en insérant les nœuds dans une structure de données arborescente en mémoire. C'est une bonne solution si vous avez de nombreux arbres séparés et que chaque arbre a relativement peu d'entrées. C'est bon pour le cas de Slashdot.