Aller au contenu

Chapitre 2 - Partie 2 : Le modèle relationnel


En classe de première, on a travaillé avec des tables stockées dans des fichiers CSV. Cette approche convient pour de petits volumes de données, mais présente vite des limites :

  • Redondance : les mêmes informations sont répétées dans plusieurs lignes ;
  • Incohérence : une modification oubliée dans une ligne crée des contradictions ;
  • Accès concurrent : plusieurs utilisateurs ne peuvent pas modifier le fichier en même temps ;
  • Volume : le fichier entier doit être chargé en mémoire pour être exploité.

Le modèle relationnel, proposé par Edgar F. Codd en 1970, répond à ces problèmes. Il organise les données en relations (tables) liées entre elles par des clés, et garantit leur cohérence grâce à des contraintes d'intégrité.


Une relation est un ensemble de données organisées en lignes et colonnes, similaire à un tableau. On la désigne aussi par le terme table.

Exemple : la relation Eleves contient les informations sur les élèves d'un lycée.

idnomprenomclassedate_naissance
1DupontAliceT32008-03-15
2MartinBobT12008-07-22
3DurandClaraT32007-12-01
4PetitDavidT22008-01-30

Un attribut est une colonne de la relation. Il porte un nom unique au sein de la relation et décrit une propriété des données.

Dans l'exemple ci-dessus, les attributs sont : id, nom, prenom, classe, date_naissance.

Le domaine d'un attribut est l'ensemble des valeurs qu'il peut prendre. Cela correspond au type de la donnée.

AttributDomaineDescription
idEntier positif (INT)Identifiant numérique
nomChaîne de caractères (VARCHAR)Nom de famille
prenomChaîne de caractères (VARCHAR)Prénom
classeChaîne de caractères (VARCHAR)Classe de l'élève
date_naissanceDate (DATE)Format AAAA-MM-JJ

Un enregistrement (ou n-uplet, ou tuple) est une ligne de la relation. Il contient une valeur pour chaque attribut.

L'enregistrement (2, "Martin", "Bob", "T1", "2008-07-22") représente un élève précis.

Le schéma d'une relation décrit sa structure : le nom de la relation suivi de la liste de ses attributs avec leurs domaines. On souligne la clé primaire.

Eleves(id‾:INT,nom:VARCHAR,prenom:VARCHAR,classe:VARCHAR,date_naissance:DATE)\text{Eleves}(\underline{\text{id}} : \text{INT}, \text{nom} : \text{VARCHAR}, \text{prenom} : \text{VARCHAR}, \text{classe} : \text{VARCHAR}, \text{date\_naissance} : \text{DATE})


La clé primaire est un attribut (ou un ensemble d'attributs) qui identifie de manière unique chaque enregistrement de la relation. Elle a deux propriétés essentielles :

  • Unicité : deux enregistrements ne peuvent pas avoir la même valeur de clé primaire ;
  • Non-nullité : la clé primaire ne peut jamais être vide (NULL).

Dans la relation Eleves, l'attribut id est la clé primaire : chaque élève a un numéro unique.

Une clé étrangère est un attribut d'une relation qui fait référence à la clé primaire d'une autre relation. Elle permet de relier deux tables entre elles.

Exemple : on ajoute une relation Notes qui fait référence aux élèves.

Relation Matieres :

id_matiereintitule
1Mathématiques
2NSI
3Français

Relation Notes :

id_noteid_eleveid_matierenotedate_eval
112172025-09-15
221142025-09-15
311162025-09-20
432192025-09-15

Ici, id_eleve est une clé étrangère qui fait référence à la clé primaire id de la relation Eleves. De même, id_matiere fait référence à id_matiere dans Matieres.

Le schéma de Notes s'écrit :

Notes(id_note‾:INT,id_eleve:INT,id_matiere:INT,note:FLOAT,date_eval:DATE)\text{Notes}(\underline{\text{id\_note}} : \text{INT}, \text{id\_eleve} : \text{INT}, \text{id\_matiere} : \text{INT}, \text{note} : \text{FLOAT}, \text{date\_eval} : \text{DATE})

On indique les clés étrangères par une notation avec # ou en les précisant séparément :

  • id_eleve : clé étrangère → Eleves(id)
  • id_matiere : clé étrangère → Matieres(id_matiere)

Le schéma relationnel d'une base de données est l'ensemble des schémas de toutes ses relations, avec l'indication des clés primaires et des clés étrangères.

Pour notre exemple :

Eleves(id : INT, nom : VARCHAR, prenom : VARCHAR,
classe : VARCHAR, date_naissance : DATE)
Clé primaire : id
Matieres(id_matiere : INT, intitule : VARCHAR)
Clé primaire : id_matiere
Notes(id_note : INT, id_eleve : INT, id_matiere : INT,
note : FLOAT, date_eval : DATE)
Clé primaire : id_note
Clé étrangère : id_eleve → Eleves(id)
Clé étrangère : id_matiere → Matieres(id_matiere)

On peut aussi représenter le schéma sous forme de diagramme, où chaque table est un rectangle et les flèches indiquent les clés étrangères :

┌──────────────────┐ ┌──────────────────────────────┐ ┌──────────────┐
│ Eleves │ │ Notes │ │ Matieres │
├──────────────────┤ ├──────────────────────────────┤ ├──────────────┤
│ id (PK) │◄──────│ id_note (PK) │──────►│ id_matiere │
│ nom │ │ id_eleve (FK) │ │ (PK) │
│ prenom │ │ id_matiere (FK) │ │ intitule │
│ classe │ │ note │ └──────────────┘
│ date_naissance │ │ date_eval │
└──────────────────┘ └──────────────────────────────┘

Les contraintes d'intégrité sont des règles qui garantissent la cohérence des données dans la base.

Chaque valeur d'un attribut doit appartenir à son domaine. Par exemple, une note doit être un nombre (pas du texte), une date doit respecter un format valide.

La clé primaire doit être unique et non nulle. Deux enregistrements ne peuvent pas partager la même valeur de clé primaire.

5.3 Contrainte de référence (intégrité référentielle)

Section intitulée « 5.3 Contrainte de référence (intégrité référentielle) »

Toute valeur d'une clé étrangère doit correspondre à une valeur existante de la clé primaire référencée, ou être NULL.


Il est essentiel de bien distinguer :

Structure (schéma)Contenu (données)
Ce que c'estLes noms des relations, attributs, domaines, clésLes enregistrements effectivement stockés
Quand ça changeRarement (lors de la conception ou de l'évolution)Fréquemment (ajout, modification, suppression)
Exemple« La table Eleves a un attribut nom de type VARCHAR »« L'élève Dupont Alice est en T3 »

Une information identique est stockée à plusieurs endroits. Si elle change, il faut la modifier partout, sinon la base devient incohérente.

Exemple de mauvaise conception (tout dans une seule table) :

id_notenom_eleveprenom_eleveclassematierenote
1DupontAliceT3NSI17
2DupontAliceT3Maths16
3MartinBobT1Maths14

Le nom, le prénom et la classe de « Dupont Alice » sont répétés. Si elle change de classe, il faut modifier toutes les lignes la concernant.

On ne peut pas insérer certaines données sans en connaître d'autres. Dans la table ci-dessus, on ne peut pas ajouter un nouvel élève sans lui attribuer une note.

En supprimant une donnée, on perd involontairement d'autres informations. Si on supprime la seule note de « Martin Bob », on perd aussi toutes ses informations personnelles.

Si « Dupont Alice » change de classe, il faut mettre à jour toutes les lignes la concernant. Un oubli crée une incohérence.


ConceptDéfinition
RelationTable organisée en lignes (enregistrements) et colonnes (attributs)
AttributColonne d'une relation, avec un nom et un domaine
DomaineEnsemble des valeurs possibles d'un attribut (son type)
Clé primaireAttribut(s) identifiant de façon unique chaque enregistrement
Clé étrangèreAttribut faisant référence à la clé primaire d'une autre relation
Schéma relationnelEnsemble des schémas de toutes les relations de la base
Contraintes d'intégritéRègles de cohérence : domaine, entité, référence
AnomaliesProblèmes causés par une mauvaise conception : redondance, insertion, suppression, mise à jour