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

lignes d'arbre sql complexes

Il existe plusieurs alternatives pour faciliter l'utilisation des informations hiérarchiques dans SQL :

  • Expressions de tableau courantes (conformément à la norme SQL-2003) prend en charge les requêtes SQL récursives par rapport au type de données parent-id que vous utilisez. Jusqu'à présent, MySQL ne prend pas en charge cette fonctionnalité. PostgreSQL 8.4, Microsoft SQL Server et IBM DB2 sont des exemples de marques RDBMS prenant en charge la syntaxe CTE. Oracle dispose également d'une extension propriétaire de la syntaxe SQL qui prend en charge les requêtes récursives.

  • Ensembles imbriqués (la solution gauche/droite mentionnée par @phantombrain) est une solution détaillée dans le livre de Joe Celko "Trees and Hierarchies in SQL for Smarties" et également dans de nombreux articles et blogs sur Internet.

  • Énumération des chemins (aka Materialized Path) stocke une chaîne dans chaque ligne de la hiérarchie pour noter le chemin des ancêtres de cette ligne. Combinez ceci avec LIKE requêtes pour comparer la chaîne de chemin aux chemins de ses ancêtres et aux chemins de ses descendants.

  • Tableau de clôture (alias Transitive Closure Relation) utilise une deuxième table pour stocker toutes les relations ancêtre-descendant, pas seulement le parent immédiat comme dans la conception que vous utilisez. De nombreux types de requêtes deviennent plus faciles une fois que tous les chemins sont stockés.

  • Solutions hybrides existent aussi. Par exemple, stockez l'id parent immédiat comme vous le faites, mais aussi la racine de l'arbre. Vous pouvez maintenant obtenir toutes les autres lignes dans la même hiérarchie, les extraire dans le code de l'application et trier l'arborescence avec des structures de données conventionnelles.