Aller au contenu principal

Adjacency List (modèle d’adjacence)

Chaque nœud stocke l’identifiant de son parent.

Avantages

  • Simple à comprendre.
  • Facile à insérer et à modifier.

Limites

  • Difficile d’interroger plusieurs niveaux sans récursivité.
CREATE TABLE familles (
id SERIAL PRIMARY KEY,
nom TEXT NOT NULL,
parent_id INT REFERENCES familles(id)
);
Primeur
├── Légumes
│ ├── Racines
│ └── Feuilles
└── Fruits
└── Pépins

Sélectionner tous les descendants d'un niveau​

Lire la famille de premier niveau

SELECT code, famille, code_parent
FROM famille
WHERE code = '02'

Lire les enfants directs du premier niveau

SELECT code, famille, code_parent
FROM famille
WHERE code_parent = '02'
codefamilleparent
02RACINE**** Racines & Tubercules02
02CUCURB**** Cucurbitacées02
02LEGUM**** Légumineuses02
02COMPOS*** Produits composés02
02FEUILLE**** Feuilles et tiges v02
02SOLAN**** Solanacées02
02CHAMChampignons02
02CHOUChou02
02MAISMaïs02

Combiner les résultats avec l'opérateur UNION ALL

SELECT code, famille, code_parent
FROM famille
WHERE code = '02'
UNION ALL
SELECT code, famille, code_parent
FROM famille
WHERE code_parent = '02'

Utiliser la récursivité pour descendre en profondeur

WITH RECURSIVE famille_parent AS (
SELECT code, famille, code_parent
FROM famille
WHERE code = '01'
UNION ALL
SELECT f.code, f.famille, f.code_parent
FROM famille f
join famille_parent on f.code_parent = famille_parent.code
)
SELECT * FROM famille_parent;

Remonter les familles jusqu'à la racine​

WITH RECURSIVE ancetre AS (
SELECT code, famille, code_parent, 1 AS niveau
FROM famille
WHERE code = '02CUCURB'
UNION ALL
SELECT f.code, f.famille, f.code_parent, a.niveau + 1
FROM famille f
JOIN ancetre a ON a.code_parent = f.code
)
SELECT *
FROM ancetre
ORDER BY niveau DESC; -- de la racine vers le nœud

Récupérer la hiérarchie dans une chaîne de caractères formatée.​

SELECT string_agg(famille, ' > ' ORDER BY niveau DESC) AS fil_ariane
FROM ancetre;

La fonction string_agg construit une chaîne de caractères en concaténant les noms des familles