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

Récupérer des données avec une structure hiérarchique dans MySQL

MySQL manque de requêtes récursives, qui font partie du SQL standard. De nombreuses autres marques de bases de données prennent en charge cette fonctionnalité, y compris PostgreSQL (voir http ://www.postgresql.org/docs/8.4/static/queries-with.html ).

Il existe plusieurs techniques pour gérer les données hiérarchiques dans MySQL.

  • Le plus simple serait d'ajouter une colonne pour noter la hiérarchie à laquelle appartient une photo donnée. Ensuite, vous pouvez rechercher les photos qui appartiennent à la même hiérarchie, les récupérer toutes dans votre application et déterminer celles dont vous avez besoin. C'est un peu de gaspillage en termes de bande passante, vous oblige à écrire plus de code d'application, et ce n'est pas bon si vos arborescences ont de nombreux nœuds.

Il existe également quelques techniques astucieuses pour stocker des données hiérarchiques afin que vous puissiez les interroger :

  • Énumération des chemins stocke la liste des ancêtres avec chaque nœud. Par exemple, la photo 5 dans votre exemple stockerait "0-2-4-5". Vous pouvez rechercher des ancêtres en recherchant des nœuds dont le chemin concaténé avec "%" correspond au chemin de 5 avec un LIKE prédicat.

  • Ensembles imbriqués est une technique complexe mais astucieuse popularisée par Joe Celko dans ses articles et son livre "Trees and Hierarchical in SQL for Smarties". Il existe également de nombreux blogs et articles en ligne à ce sujet. Il est facile d'interroger des arbres, mais difficile d'interroger des enfants ou des parents immédiats et difficile d'insérer ou de supprimer des nœuds.

  • Tableau de clôture implique de stocker chaque relation ancêtre/descendant dans une table séparée. Il est facile d'interroger les arbres, facile à insérer et à supprimer, et facile d'interroger les parents ou enfants immédiats si vous ajoutez un pathlength colonne.

Vous pouvez voir plus d'informations comparant ces méthodes dans ma présentation Practical Object -Modèles orientés en SQL ou mon prochain livre Antipatterns SQL :éviter les pièges de la programmation de base de données .