</>
Plan du cours — 19/64

Modéliser les relations 1-N et N-N

Intermédiaire

Trois 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èlePrincipeÀ privilégier quand
Liste d'adjacence (parent_id)Une colonne pointe vers le parentLe 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/droiteRare : écritures coûteuses