• # 3 façons

    Posté par (site web personnel) . En réponse au message Sauvegarder et ressortir un arbre, typiquement les commentaires de linuxfr. Évalué à 8.

    Pour enregistrer des arbres dans une base de données, il existe 3 grandes façons de faire.

    La première consiste à avoir un champ parent_id sur chaque élément. C'est celle que l'on rencontre le plus souvent et pourtant, c'est probablement celle qui est la moins intéressante et la moins performante.

    La seconde technique est celle utilisée par LinuxFr.org. On la retrouve généralement sous le nom de materialized path. Ça consiste à avoir sur chaque enregistrement un champ path avec la liste des identifiants des parents. Par exemple, si le commentaire 12 a pour parent le commentaire 7, et que le commentaire 7 a pour parent le commentaire 3, alors le commentaire 12 aura pour path 3.7.12 (en fait, pour LinuxFr.org, on remplit les ids sur une taille fixe plutôt que d'utiliser un séparateur, donc ce serait plutôt 00000003000000700000012).

    Enfin, la troisième manière est ce que l'on appelle les nested sets. Ça consiste à parcourir un arbre et à donner des numéros à chaque élément. On part de la racine et on fait le tour. Quand on passe à gauche, on remplit le champ lft (left est un mot-clé réservé) et quand on repasse à droite, on remplit le champ rgt (right) :

     (1) Commentaire n°1 (10)
     / \
     (2) Commentaire n°3 (7) (8) Commentaire n°5 (9)
     / \
    (3) Commentaire n°7 (4) (5) Commentaire n°9 (6)
    ID | lft | rgt |
     1 | 1 | 10 |
     3 | 2 | 7 |
     5 | 8 | 9 |
     7 | 3 | 4 |
     9 | 5 | 6 |
    
    

    Il devient aussi alors très facile de retrouver tous les commentaires d'un même fil de discussions. Il suffit de prendre tous ceux qui ont un lft plus grand que celui du commentaire parent et un rgt plus petit que celui du commentaire parent.