Modéliser les relations 1-N et N-N
IntermédiaireTrois formes couvrent presque tous les cas : un-à-plusieurs, plusieurs-à-plusieurs et un-à-un.
-- 1-N : un client a plusieurs commandes (clé étrangère côté « plusieurs »)
commandes.client_id -> clients.id
-- N-N : un article a plusieurs tags, un tag plusieurs articles → table de jointure
CREATE TABLE article_tags (
article_id bigint NOT NULL REFERENCES articles (id) ON DELETE CASCADE,
tag_id bigint NOT NULL REFERENCES tags (id) ON DELETE CASCADE,
PRIMARY KEY (article_id, tag_id) -- empêche les doublons
);
CREATE INDEX ON article_tags (tag_id); -- pour les recherches dans l'autre sens
Table de jointure porteuse d'informations#
Dès qu'un lien a ses propres attributs (date d'inscription, rôle, quantité), la table de jointure devient une vraie entité :
CREATE TABLE lignes_commande (
commande_id bigint NOT NULL REFERENCES commandes (id) ON DELETE CASCADE,
produit_id bigint NOT NULL REFERENCES produits (id),
quantite integer NOT NULL CHECK (quantite > 0),
prix_unitaire numeric(12, 2) NOT NULL,
PRIMARY KEY (commande_id, produit_id)
);
Hiérarchies#
| Modèle | Principe | À privilégier quand |
|---|---|---|
Liste d'adjacence (parent_id) | Une colonne pointe vers le parent | Le plus simple ; requêtes récursives avec WITH RECURSIVE |
Chemin matérialisé (ltree) | Le chemin complet est stocké (a.b.c) | Lectures de sous-arbres fréquentes |
| Ensemble imbriqué | Bornes gauche/droite | Rare : écritures coûteuses |