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

stockage hiérarchique mysql avec de grands arbres

La conception des ensembles imbriqués est définitivement difficile lorsque vous devez effectuer des mises à jour fréquentes de l'arborescence. Vous finissez par devoir renuméroter de grandes parties de l'arbre.

Une suggestion pour atténuer ce problème est d'utiliser des nombres à virgule flottante au lieu d'entiers. Si vous insérez un nouveau nœud dans l'arborescence, il est relativement facile de trouver des nombres FLOAT entre les nombres imbriqués du parent du nouveau nœud. Vous pouvez éventuellement atteindre les limites de la précision d'un nombre à virgule flottante, mais comme votre arbre n'est pas très profond, cela n'arrivera pas avant longtemps.

Une autre technique sur laquelle j'ai écrit que j'appelle Table de fermeture . Cette méthode de stockage des hiérarchies facilite grandement l'insertion/la mise à jour/la suppression de nœuds dans une grande arborescence sans avoir à mettre à jour une grande partie de votre arborescence. Et vous pouvez toujours interroger l'ensemble de l'arborescence ou n'importe quelle sous-arborescence dans une seule requête SQL non récursive.

Pour en savoir plus sur le tableau de clôture, consultez :

Concernant votre commentaire :

La liste de contiguïté est simple, a un minimum de redondance et prend en charge les relations FK, contrairement aux ensembles imbriqués. La liste d'adjacence prend en charge l'interrogation d'un arbre entier de profondeur arbitraire si vous utilisez requêtes récursives . Mais MySQL ne prend pas en charge les requêtes récursives.

Si vous avez besoin d'interroger uniquement les relations parent-enfant immédiates (c'est-à-dire un niveau de profondeur), ou d'interroger uniquement les arbres de profondeur fixe, alors la liste de contiguïté est correcte.