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'
| code | famille | parent |
|---|---|---|
| 02RACINE | **** Racines & Tubercules | 02 |
| 02CUCURB | **** Cucurbitacées | 02 |
| 02LEGUM | **** Légumineuses | 02 |
| 02COMPOS | *** Produits composés | 02 |
| 02FEUILLE | **** Feuilles et tiges v02 | |
| 02SOLAN | **** Solanacées | 02 |
| 02CHAM | Champignons | 02 |
| 02CHOU | Chou | 02 |
| 02MAIS | Maïs | 02 |
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