graph TD
FILM["FILM"]
ACTEUR["ACTEUR"]
JOUE_DANS(("JOUE_DANS"))
FILM --- |"0,N"| JOUE_DANS
JOUE_DANS --- |"0,N"| ACTEUR
Cardinalités :
Quand on dit “un film peut avoir zéro ou plusieurs acteurs”, on ne parle pas de tous les films en général, mais d’un film précis dans la base.
Exemple concret :
De l’autre côté, l’acteur “Leonardo DiCaprio” (un enregistrement) a joué dans 25 films enregistrés dans la base.
Les cardinalités décrivent combien d’enregistrements peuvent être liés, pas des généralités sur la table entière.
graph TD
LIVRE["LIVRE"]
AUTEUR["AUTEUR"]
ECRIT_PAR(("ECRIT_PAR"))
LIVRE --- |"1,N"| ECRIT_PAR
ECRIT_PAR --- |"0,N"| AUTEUR
Cardinalités :
“Un livre est écrit par un ou plusieurs auteurs” signifie : chaque ligne de la table LIVRE doit être liée à au moins une ligne de la table AUTEUR.
Exemple concret :
Du côté auteur, l’auteur “Marie Dupont” (un enregistrement) peut avoir écrit 0 livres si elle vient d’être ajoutée, ou 50 livres si elle est prolifique.
Pourquoi (1,N) et pas (0,N) ? Dans une librairie, on n’enregistre pas de livres sans connaître l’auteur. C’est une règle métier : tout livre doit avoir au moins un auteur.
graph TD
ARTICLE["ARTICLE"]
EDITEUR["EDITEUR"]
PUBLIE(("PUBLIE"))
ARTICLE --- |"1,N"| PUBLIE
PUBLIE --- |"0,N"| EDITEUR
Cardinalités :
Chaque article (une ligne spécifique) doit être lié à au moins un éditeur qui l’a publié ou modifié.
Exemple concret :
L’éditeur “Jean Martin” (un enregistrement) peut avoir publié 0 article s’il vient d’être embauché, ou 300 articles s’il travaille là depuis des années.
La règle métier : Un article ne peut pas exister dans le système sans qu’un éditeur l’ait créé. C’est pour ça que le minimum est 1, pas 0.
graph TD
PAYS["PAYS"]
VILLE["VILLE"]
CONTIENT(("CONTIENT"))
PAYS --- |"0,N"| CONTIENT
CONTIENT --- |"1,1"| VILLE
Cardinalités :
Attention au piège ! “Un pays contient zéro ou plusieurs villes” ne veut pas dire qu’un pays réel n’a pas de villes. Cela signifie : dans notre base de données, un pays (un enregistrement) peut être présent sans qu’on ait encore enregistré ses villes.
Exemple concret :
De l’autre côté, la ville “Paris” (un enregistrement) appartient à exactement 1 pays : la France. Elle ne peut pas appartenir à 0 pays (elle doit être quelque part) ni à 2 pays (une ville n’est que dans un seul pays).
Pourquoi (0,N) pour le pays ? Parce qu’on veut pouvoir enregistrer un pays dans le système avant d’avoir référencé toutes ses villes. Sinon, il faudrait tout saisir d’un coup, ce qui n’est pas pratique.
graph TD
LANGUE["LANGUE"]
REGION["REGION"]
PARLEE_DANS(("PARLEE_DANS"))
LANGUE --- |"0,N"| PARLEE_DANS
PARLEE_DANS --- |"0,N"| REGION
Cardinalités :
Ici, les deux côtés ont (0,N), ce qui signifie qu’on peut enregistrer des langues et des régions indépendamment avant de les lier.
Exemple concret :
De l’autre côté :
Pourquoi (0,N) des deux côtés ? Parce qu’on veut un catalogue complet de langues (même mortes) et de régions (même non documentées). On les relie ensuite progressivement.
graph TD
CLIENT["CLIENT"]
COMMANDE["COMMANDE"]
PRODUIT["PRODUIT"]
PASSE(("PASSE"))
CONTIENT(("CONTIENT"))
CLIENT --- |"0,N"| PASSE
PASSE --- |"1,1"| COMMANDE
COMMANDE --- |"1,N"| CONTIENT
CONTIENT --- |"0,N"| PRODUIT
Cardinalités :
Ce modèle montre 3 tables liées par 2 relations.
Exemple concret pour CLIENT → COMMANDE :
Pourquoi (0,N) pour le client ? On veut pouvoir créer un compte client avant qu’il n’achète quoi que ce soit.
Exemple concret pour COMMANDE → PRODUIT :
Pourquoi (1,N) pour la commande ? Une commande vide n’a aucun sens. Si elle existe, c’est qu’elle contient au moins un produit.
Pourquoi (0,N) pour le produit ? Un produit peut exister dans le catalogue avant d’avoir été commandé.
graph TD
MEDECIN["MEDECIN"]
PATIENT["PATIENT"]
CONSULTATION["CONSULTATION"]
REALISE(("REALISE"))
CONCERNE(("CONCERNE"))
MEDECIN --- |"0,N"| REALISE
REALISE --- |"1,1"| CONSULTATION
PATIENT --- |"0,N"| CONCERNE
CONCERNE --- |"1,1"| CONSULTATION
Cardinalités :
Ici, CONSULTATION est une entité centrale qui lie médecins et patients. Chaque consultation est un événement précis.
Exemple concret côté MEDECIN :
Exemple concret côté PATIENT :
Pourquoi (1,1) des deux côtés pour CONSULTATION ? Une consultation ne peut pas exister sans médecin ET sans patient. C’est l’événement qui les relie. On ne peut pas avoir :
graph TD
ETUDIANT["ETUDIANT"]
COURS["COURS"]
SUIT(("SUIT"))
ETUDIANT --- |"0,N"| SUIT
SUIT --- |"0,N"| COURS
Cardinalités :
Les deux côtés sont (0,N), ce qui donne beaucoup de flexibilité au système.
Exemple concret côté ETUDIANT :
Exemple concret côté COURS :
Pourquoi (0,N) des deux côtés ?
Cette flexibilité permet de gérer les périodes d’inscription, les cours annulés faute d’étudiants, les étudiants en pause, etc.