Vue d'ensemble
Comment un logiciel de gestion de notes, un site de reservation ou un reseau social rangent-ils des millions d'informations sans jamais les melanger ? Presque tous utilisent le meme outil, invente par Edgar Codd en 1970 : le modele relationnel. L'idee est d'une simplicite redoutable : on range les donnees dans des tables (des tableaux a lignes et colonnes), et on relie ces tables entre elles. Cette fiche pose tout le vocabulaire — relation, attribut, tuple, cle primaire, cle etrangere — que tu reutiliseras des que tu ecriras une requete.
Prerequis
- Aucun prerequis informatique strict : on part de zero.
- Utile seulement pour une analogie : le dictionnaire Python, qui associe a une cle une valeur — on retrouvera cette idee d'acces « par la cle ».
- Savoir lire un tableau a double entree (lignes / colonnes).
Le vocabulaire des bases de donnees se retient en 20 minutes bien accompagnees. Nos mentors alumni X · Centrale · Mines te font manipuler un vrai schema des la premiere seance, pour que « cle primaire » et « cle etrangere » ne soient plus jamais confondues.
Trouver un mentor →1. Une base relationnelle, ce sont des tables
Une base de donnees est un ensemble organise de donnees, stocke de facon durable, que l'on peut consulter et modifier. Dans le modele relationnel, cette organisation prend la forme la plus familiere qui soit : des tableaux.
Une relation, aussi appelee table, est un tableau a deux dimensions : chaque colonne decrit une caracteristique (un attribut), chaque ligne decrit une entite (un tuple). Le mot « relation » est le terme mathematique historique ; en pratique on dit « table ».
Un attribut est une colonne de la table : il porte un nom (par exemple nom, classe). Le domaine d'un attribut est l'ensemble des valeurs qu'il a le droit de prendre — autrement dit son type : entiers, texte, nombres decimaux, dates… Toutes les valeurs d'une meme colonne appartiennent au meme domaine.
Un tuple (ou enregistrement) est une ligne de la table : c'est la donnee complete d'une entite, une valeur pour chaque attribut. Un tuple de la table des eleves, c'est « un eleve » avec toutes ses caracteristiques.
Chaque notion a deux noms : le nom theorique (relation, attribut, tuple) et le nom concret du tableau (table, colonne, ligne). Les sujets de concours emploient les deux ; il faut savoir passer de l'un a l'autre sans hesiter.
| Terme theorique | Terme du tableau | Analogie dictionnaire |
|---|---|---|
| Relation | Table | Le dictionnaire entier |
| Attribut | Colonne | Un champ d'information |
| Tuple | Ligne (enregistrement) | Une entree cle → valeur |
| Domaine | Type de la colonne | Le type des valeurs |
2. Le schema d'une relation
Avant de remplir une table, il faut la decrire : quel est son nom ? Quels attributs contient-elle, et de quel domaine ? C'est le role du schema.
Le schema d'une relation est la donnee de son nom suivi de la liste de ses attributs, chacun avec son domaine. On le note souvent :
L'attribut souligne est la cle primaire (voir §3). Le schema decrit la structure de la table ; les tuples en sont le contenu.
Prenons deux relations qui vont nous servir de fil rouge : une table des eleves et une table de leurs notes.
L'etoile sur id_eleve dans Note signale une cle etrangere vers Eleve — on y arrive au §4. Voici les deux tables une fois remplies :
| id_eleve (cle primaire) | nom | classe |
|---|---|---|
| 1 | Diallo | MP2I |
| 2 | Nguyen | MPSI |
| 3 | Martin | MP2I |
| id_note (cle primaire) | id_eleve (cle etrangere →) | matiere | valeur |
|---|---|---|---|
| 101 | 1 | Informatique | 17.0 |
| 102 | 1 | Maths | 14.5 |
| 103 | 2 | Informatique | 12.0 |
| 104 | 3 | Maths | 18.0 |
La note d'id_note = 102 a pour id_eleve la valeur 1. On va chercher, dans la table Eleve, le tuple dont id_eleve vaut 1 : c'est Diallo (MP2I). Cette note de 14,5 en Maths est donc celle de Diallo. Diallo a d'ailleurs deux notes (101 et 102) : un meme eleve peut apparaitre dans plusieurs tuples de Note.
3. La cle primaire : identifier chaque tuple sans ambiguite
Dans la table Eleve, deux eleves pourraient s'appeler tous les deux « Martin » et etre en MP2I. Comment les distinguer ? Il faut un attribut qui ne se repete jamais : c'est la cle primaire.
La cle primaire d'une relation est un attribut (ou un groupe d'attributs) qui identifie de facon unique chaque tuple de la table. Elle doit verifier deux proprietes :
- Unicite : deux tuples differents ne peuvent pas avoir la meme valeur de cle primaire.
- Non-nullite : la cle primaire ne peut jamais etre vide (valeur nulle) — sinon on ne pourrait pas identifier le tuple.
Dans Eleve, la cle primaire est id_eleve : connaitre id_eleve, c'est connaitre un seul eleve.
Demande-toi : « Si je connais cette valeur, est-ce que je designe un seul tuple ? » Le nom est un mauvais candidat (deux eleves peuvent avoir le meme). Un numero d'identifiant attribue une fois pour toutes (id_eleve) est un bon candidat. En pratique, on ajoute souvent un attribut identifiant artificiel expres pour servir de cle primaire.
Une cle primaire n'est pas forcement un seul attribut. Imagine une table Presence(id_eleve, date, present) qui dit si un eleve etait la un jour donne : aucun des deux attributs id_eleve ou date n'est unique a lui seul (un eleve a plusieurs dates ; une date concerne plusieurs eleves). En revanche, le couple l'est : c'est une cle primaire composee.
Ce n'est pas parce qu'une valeur se repete dans la colonne qu'elle ne peut jamais servir de cle : elle ne peut simplement pas servir seule. On peut la combiner avec un autre attribut pour former une cle composee. Ne conclus pas trop vite « impossible ».
4. La cle etrangere : relier les tables entre elles
On a separe les eleves (Eleve) et les notes (Note) dans deux tables. Il faut donc un moyen de dire « cette note appartient a cet eleve ». C'est exactement le role de la cle etrangere.
Une cle etrangere est un attribut (ou un groupe d'attributs) d'une relation qui reference la cle primaire d'une autre relation. Sa valeur, dans chaque tuple, designe le tuple correspondant de la table referencee ; c'est ce qui relie les deux tables.
Dans Note, l'attribut id_eleve est une cle etrangere qui reference Eleve(id_eleve). La valeur 1 dans une ligne de Note renvoie a l'eleve dont la cle primaire vaut 1.
Reprends la note 103 : id_eleve = 2. On lit dans Eleve que le tuple de cle 2 est Nguyen (MPSI). Donc « 12,0 en Informatique » est la note de Nguyen. La cle etrangere id_eleve n'invente aucune information : elle pointe vers un tuple existant de Eleve et recupere ainsi tout ce qu'on sait de cet eleve. C'est le contraire de tout recopier (nom, classe…) dans chaque note.
Le meme nom d'attribut id_eleve joue deux roles opposes selon la table :
- Dans
Eleve,id_eleveest la cle primaire : elle identifie, elle est unique et non nulle. - Dans
Note,id_eleveest une cle etrangere : elle pointe versEleve, et elle peut se repeter (Diallo a deux notes → deux lignes avecid_eleve= 1).
Retiens : la cle primaire identifie chez elle ; la cle etrangere renvoie chez le voisin.
« Primaire ou etrangere ? » est la question qui fait perdre des points en colle. Nos mentors alumni X · Centrale · Mines t'entrainent a annoter n'importe quel schema en quelques secondes, un reflexe qui paie a l'ecrit comme a l'oral.
Trouver un mentor →5. L'integrite referentielle
Une cle etrangere ne doit jamais « pointer dans le vide ». Si une ligne de Note portait id_eleve = 99 alors qu'aucun eleve n'a la cle 99, la note appartiendrait a un fantome. Le modele relationnel l'interdit.
La contrainte d'integrite referentielle impose que toute valeur d'une cle etrangere corresponde a un tuple reellement existant dans la table referencee (ou soit eventuellement nulle si l'attribut l'autorise). Le systeme de gestion de base de donnees refuse toute operation qui la violerait.
Sur nos tables (eleves de cles 1, 2, 3) :
- Inserer
Note(105, id_eleve=2, 'Physique', 10.0)→ accepte : l'eleve 2 existe. - Inserer
Note(106, id_eleve=99, 'Physique', 10.0)→ refuse : aucun eleve de cle 99 (integrite referentielle violee). - Supprimer l'eleve 1 alors que les notes 101 et 102 le referencent → refuse par defaut : on laisserait des notes orphelines.
Declaration concrete (SQL DDL)
Quand on cree reellement ces tables, on declare les cles au systeme. Voici la declaration en SQL (langage de definition de donnees). Tu la reverras en detail dans la fiche SQL ; l'important ici est de reconnaitre les mots-cles qui traduisent chaque notion.
CREATE TABLE Eleve (
id_eleve INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
classe TEXT NOT NULL
);
CREATE TABLE Note (
id_note INTEGER PRIMARY KEY,
id_eleve INTEGER NOT NULL,
matiere TEXT NOT NULL,
valeur REAL NOT NULL,
FOREIGN KEY (id_eleve) REFERENCES Eleve(id_eleve)
);CREATE TABLE Eleve (cree une nouvelle relation (table) nommee Eleve ; entre parentheses viendra la liste de ses attributs avec leur domaine.id_eleve INTEGER PRIMARY KEY,attribut id_eleve de domaine entier ; PRIMARY KEY le declare cle primaire, donc le systeme garantit automatiquement l'unicite ET la non-nullite.nom TEXT NOT NULL,attribut nom de domaine texte ; NOT NULL interdit de laisser ce champ vide, sans pour autant en faire une cle.classe TEXT NOT NULLattribut classe, texte, obligatoire lui aussi. Fin des attributs de Eleve.CREATE TABLE Note (on cree la deuxieme table, Note, qui va referencer Eleve.id_note INTEGER PRIMARY KEY,cle primaire de Note : identifie chaque note de facon unique. C'est la cle de cette table.id_eleve INTEGER NOT NULL,l'attribut qui portera le lien vers un eleve ; entier, obligatoire (une note appartient forcement a quelqu'un). Il n'est pas encore dit que c'est une cle etrangere.matiere TEXT NOT NULL,attribut matiere de domaine texte, obligatoire : la matiere concernee par la note (Informatique, Maths…).valeur REAL NOT NULL,la note elle-meme, de domaine reel (nombre decimal), obligatoire.FOREIGN KEY (id_eleve) REFERENCES Eleve(id_eleve)LA ligne cle : elle declare que id_eleve est une cle etrangere qui REFERENCES (reference) la cle primaire id_eleve de Eleve. C'est elle qui active l'integrite referentielle : toute valeur devra correspondre a un eleve existant.Que se passe-t-il vraiment quand on remplit ces tables puis qu'on tente les insertions de l'exemple ? Voici l'execution reelle (verifiee avec le moteur SQLite) :
| Operation tentee | Contrainte concernee | Resultat du systeme |
|---|---|---|
| INSERT Note(105, id_eleve=2, …) | Integrite referentielle | Accepte ✓ (l'eleve 2 existe) |
| INSERT Note(106, id_eleve=99, …) | Integrite referentielle | Refuse — FOREIGN KEY constraint failed |
| INSERT Eleve(1, 'Autre', …) | Unicite de la cle primaire | Refuse — UNIQUE constraint failed |
On aurait pu tout mettre dans une seule table geante (nom, classe et note sur chaque ligne). Mais alors le nom et la classe de Diallo seraient recopies a chaque note : gaspillage et surtout risque d'incoherence (corriger la classe a un endroit et pas a l'autre). Separer en Eleve + Note reliees par une cle etrangere evite cette redondance : chaque fait est ecrit une seule fois.
6. Exercices corriges
On donne le schema . La table contient 500 lignes. Reponds :
- Comment appelle-t-on une ligne de cette table ?
- Combien la table a-t-elle d'attributs, et lesquels ?
- Quel est le domaine plausible de
annee? - Deux livres peuvent-ils avoir le meme
id_livre?
Voir la correction detaillee
1. Une ligne est un tuple (ou enregistrement). La table a donc 500 tuples.
2. Trois attributs : id_livre, titre, annee (le nom de la table, Livre, n'est pas un attribut).
3. annee a pour domaine les entiers (une annee comme 1998). Son domaine, c'est le type des valeurs autorisees.
4. Non : id_livre est souligne, c'est la cle primaire — elle est unique, donc deux livres ne peuvent pas partager la meme valeur.
Une mediatheque utilise :
- Quelle est la cle primaire de
Emprunt? - Quel(s) attribut(s) de
Empruntsont des cles etrangeres, et vers quoi ? - La valeur de
id_adherentpeut-elle se repeter dans la tableEmprunt? Pourquoi ?
Voir la correction detaillee
1. La cle primaire de Emprunt est id_emprunt (l'attribut souligne) : elle identifie chaque emprunt de facon unique.
2. id_adherent est une cle etrangere vers Adherent(id_adherent) ; id_livre est une cle etrangere vers la table des livres (Livre(id_livre)). Une table peut avoir plusieurs cles etrangeres.
3. Oui, elle peut se repeter : un meme adherent emprunte plusieurs livres, donc apparait sur plusieurs lignes de Emprunt. Une cle etrangere, contrairement a une cle primaire, n'a aucune obligation d'unicite.
On modelise l'inscription d'etudiants a des options avec :
Un etudiant peut suivre plusieurs options, et une option est suivie par plusieurs etudiants ; mais un etudiant ne s'inscrit qu'une fois a une option donnee.
- Aucun des deux attributs
id_etudiantouid_optionn'est unique. Proposer une cle primaire pourInscriptionet la justifier. - La table
Etudiant(id_etudiant, nom), de cle primaireid_etudiant, ne contient que les identifiants 1, 2, 3. Un logiciel tente d'insererInscription(id_etudiant=4, id_option=10, note=15). Le systeme l'accepte-t-il ? Quelle contrainte est en jeu ?
Voir la correction detaillee
1. On prend la cle primaire composee . Le couple est unique : puisqu'un etudiant ne s'inscrit qu'une fois a une option donnee, il n'existe jamais deux lignes avec le meme couple. Chacun des deux attributs pris seul se repete, mais leur combinaison identifie un tuple unique — c'est precisement le cas d'usage d'une cle composee.
2. Refuse. id_etudiant est une cle etrangere vers Etudiant, or aucun etudiant n'a l'identifiant 4. C'est une violation de l'integrite referentielle : le systeme rejette l'insertion tant que l'etudiant 4 n'existe pas dans Etudiant.
Recap final — Ce qu'il faut absolument retenir
Le modele relationnel range les donnees dans des tables et les relie par des cles. Verifie que tu maitrises chaque brique du vocabulaire :
- Sais-tu nommer les trois vocabulaires equivalents : relation = table, attribut = colonne, tuple = ligne ?
- Sais-tu ce qu'est le domaine d'un attribut (l'ensemble/type des valeurs autorisees) ?
- Sais-tu dire ce que contient le schema d'une relation (nom + attributs avec leur domaine) ?
- Sais-tu enoncer les deux proprietes d'une cle primaire (unicite ET non-nullite) ?
- Sais-tu qu'une cle primaire peut etre composee de plusieurs attributs ?
- Sais-tu expliquer le role d'une cle etrangere (referencer la cle primaire d'une autre table pour la relier) ?
- Sais-tu distinguer, pour un meme nom d'attribut, son role de cle primaire (chez elle, unique) et de cle etrangere (chez le voisin, peut se repeter) ?
- Sais-tu ce qu'exige l'integrite referentielle (une cle etrangere pointe vers un tuple existant) ?