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 :
- Quelle est la manière la plus efficace/élégante d'analyser une table plate dans un arbre ?
- Modèles pour les données hiérarchiques avec SQL et PHP
- Déplacement des sous-arborescences dans les hiérarchies des tables de fermeture
- Antipatterns SQL :éviter les pièges de la programmation de base de données
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.