Modèle relationnel

Le modèle relationnel est un modèle de traitement des données qui organise les informations en tables (ou relations) afin de faciliter leur stockage, leur manipulation, et leur extraction. Il a été créé dans les années 1970 par le mathématicien anglais Edgar F. « Ted » Codd qui travaillait au centre de recherche d'IBM aux États Unis.
Ce modèle constitue le fondement des bases de données relationnelles (BDR). Il est implémenté via des SGBDR (Systèmes de Gestion de Bases de Données Relationnelles) et est largement utilisé grâce à sa simplicité et sa puissance, notamment avec l'utilisation du langage SQL.
L'exemple de la gestion des prêts de livres dans une bibliothèque d'un lycée vu sous l'angle d'une BDR.

Table (relation) Eleve
id_eleve nom email classe
1 Martine Durand martine.durand@mail.com T07
2 Hermine Nyaleu hermine.nyaleu@mail.com T08
3 Léon Leroy leon.leroy@mail.com T03
4 Aïcha Djérouni aicha.djerouni@mail.com T07
5 Philippe Gaspar philippe.gaspar@mail.com T05
Table (relation) Auteur
id_auteur nom
1 John Grisham
2 René Descartes
3 Victor Hugo
4 Alexandra Lapierre
5 Gaël Faye
Table (relation) Livre
id_livre titre id_auteur genre éditeur année_publication
1 La chance d'une vie 1 roman JCLattès 2022
2 Méditations métaphysiques 2 essai Flammarion 2011
3 Les Misérables 3 roman Larousse 2007
4 Belle Greene 4 roman Flammarion 2021
5 Son nom sur la liste 1 roman JCLattès 2023
6 Le réseau 1 roman JCLattès 2024
7 Jacaranda 5 roman Grasset 2024
Table (relation) Emprunt
id_emprunt id_eleve id_livre date_emprunt date_retour
1 1 1 2024-09-15 2024-09-25
2 2 2 2024-09-20 2024-09-30
3 2 7 2024-09-20 2024-09-30
4 4 3 2024-09-18 2024-09-28
5 4 4 2024-10-01 2024-10-10
6 1 5 2024-09-25 2024-10-05
7 4 1 2024-10-01 2024-10-10
8 1 6 2024-09-25 2024-10-05

Définitions

1. Relation

Dans une BDR, une entité est modélisée par une relation.
Une relation est un ensemble d'attributs (colonnes) et de tuples (lignes). Elle est implémentée à l'aide d'une table.

    Propriétés d'une relation
  • Ordre des lignes : Dans le modèle relationnel, l'ordre des lignes n'a pas d'importance.
  • Ordre des colonnes : L'ordre des colonnes n'est pas significatif non plus, mais chaque colonne doit avoir un nom unique dans la relation.
  • Unicité des tuples : Chaque tuple doit être unique, ce qui est souvent assuré par l'utilisation d'une clé primaire.

Une BDR est définie comme une collection de relations (on dit aussi entités) qui sont implémentées à l'aide de tables (tableaux).

Dans l'exemple de la bibliothèque, on a quatre relations (tables) : Eleve, Auteur, Livre et Emprunt.

2. Tuple (ligne), clé primaire, clé candidate, contrainte d'intégrité d'entité

Un tuple est un ensemble ordonné de valeurs, chacune associée à un attribut (ou colonne) spécifique de la table.
Chaque tuple représente une ligne (on dit aussi une instance individuelle ou un enregistrement de données) dans la relation (table).

Exemples de tuple :
(1, "Martine Durand", "martine.durand@mail.com", "T07")
(3, "Les Misérables", 3, "roman", "Larousse", 2007)

    Caractéristiques d'un Tuple
  • Ensemble de valeurs : Chaque tuple contient un ensemble de valeurs pour les attributs définis dans la relation. Chaque valeur correspond à un attribut (colonne) de la table.
  • Correspondance avec les attributs : Chaque valeur dans un tuple correspond à une colonne (ou attribut) spécifique de la relation.
  • Unicité :
    • Clé : Une clé est un ou plusieurs attributs (colonnes) d’une table utilisés pour identifier de manière unique chaque tuple (ou ligne) de cette table.
      La clé permet de garantir qu'il n'existe pas deux enregistrements identiques en termes de valeurs dans les attributs qui composent cette clé.
    • Clé candidate : Une clé candidate est un ensemble minimal d'attributs qui peut identifier de manière unique chaque enregistrement dans une table.
      Une table peut avoir plusieurs clés candidates, mais une seule de ces clés est choisie comme clé primaire pour l'identification principale des enregistrements dans la table.
      Dans l'exemple de la bibliothèque, Si la table n’a pas de doublon sur l'id_eleve ou email, les deux attributs sont candidats pour devenir la clé primaire.
    • La contrainte d'intégrité d'entité impose que chaque ligne d'une table puisse être identifiée de manière unique, généralement par une clé primaire.
      La clé primaire doit être unique et ne doit jamais contenir de valeurs NULL.

3. Attribut (colonne), domaine de valeurs, clé étrangère, contrainte d'intégrité référentielle

Un attribut est une caractéristique ou une propriété d'une relation (table). Chaque attribut représente une colonne dans une table.

Exemples d'attribut :
id_eleve, nom, auteur, date_emprunt
.

    Caractéristiques d'un attribut
  • Nom de l'attribut : Chaque attribut a un nom unique dans une table.
  • Domaine de valeurs : C'est l'ensemble des valeurs qu'un attribut peut avoir.
    Il peut être vu comme un type de données (entiers, les chaînes de caractères, les dates, etc.) ou une plage spécifique de valeurs.
  • Valeur de l'attribut : Chaque ligne dans la table contient une valeur spécifique pour chaque attribut.
  • Une clé étrangère est un attribut ou un ensemble d'attributs d'une table qui établit une relation entre cette table et une autre table dans une BDR.
    Elle sert de lien entre deux tables en référant la clé primaire d'une autre table, garantissant la cohérence des données entre les deux tables.
    • La table contenant la clé étrangère est appelée table enfant.
    • La table référencée (celle avec la clé primaire) est appelée table parent.
  • La contrainte d'intégrité référentielle impose que lorsque des tables sont liées par des clés étrangères, les valeurs de clé étrangère doivent correspondre à des valeurs valides de la clé primaire dans la table référencée.

4. Schéma relationnel d'une relation, schéma relationnel d'une BDR

Si une relation est définie par les attributs A1, A2, ..., An, son schéma relationnel est le suivant :
R(A1, A2, ..., An)

Dans l'exemple de la gestion des prêts de livres dans une bibliothèque :

  • Clés primaires :
    • id_eleve dans la table Élève
    • id_livre dans la table Livre
    • id_auteur dans la table Auteur
    • id_emprunt dans la table Emprunt
    • Clés étrangères :
    • id_auteur dans la table Livre qui référence id_auteur dans Auteur
    • id_eleve dans la table Emprunt qui référence id_eleve dans Élève
    • id_livre dans la table Emprunt qui référence id_livre dans Livre

Ce schéma relationnel permet de lier les informations entre les élèves, les livres, les auteurs et les emprunts tout en assurant la cohérence des données.
Sachant que les clés primaires sont soulignées et les clés secondaires sont précédées d'un astérisque, il peut être représenté comme suit :

Eleve(id_eleve, nom, email, classe)
Auteur(id_auteur, nom)
Livre(id_livre, titre, *id_auteur, genre, éditeur, année_publication)
Emprunt(id_emprunt, *id_eleve, titre, *id_livre, date_emprunt, date_retour)

Une relation peut être également représentée à l'aide d'un diagramme (modèle UML ou IE).

table Eleve

Très souvent les attributs sont accompagnés de leur domaine de valeurs.
Eleve(id_eleve: INT, nom: VARCHAR(100), email: VARCHAR, classe VARCHAR)

table Livre

Dans notre exemple :

  • Lien Livre – Auteur : chaque livre est écrit par un seul auteur. Cela signifie qu’un auteur peut avoir écrit plusieurs livres, mais chaque livre est associé à un auteur unique.
  • Lien Eleve - Emprunt : Chaque élève peut avoir effectué plusieurs emprunts, mais chaque emprunt est associé à un seul élève. Un élève peut également ne pas avoir d’emprunt.
  • Lien Emprunt - Livre : Chaque emprunt correspond à un seul livre, mais un livre peut être emprunté plusieurs fois par différents élèves.

Ainsi, le schéma relationnel de la BDR bibliothèque est, par exemple, le suivant :

Modèle de l'Ingénierie de l'Information (IE, ou "pieds d'oie")
modèle ie
Langage de Modélisation Unifié (UML)
modèle ie

Algèbre relationnelle et SQL

L'algèbre relationnelle est un ensemble d'opérations formelles utilisées pour manipuler et interroger des relations dans une BDR.
Les opérations de base de l'algèbre relationnelle permettent de créer de nouvelles relations à partir de relations existantes.

1. Opérations sur une seule table

1.1. Projection (SELECT en SQL)
  • La projection permet de sélectionner certaines colonnes (attributs) d'une relation. Elle réduit donc le nombre de colonnes pour ne conserver que les informations pertinentes.
  • Par exemple,,
    Écrire une requête qui récupère les noms et les adresses email des élèves inscrits à la bibliothèque.
    Traduction en requête SQL :

    SELECT nom, email
    FROM Eleve
    Le résultat de cette requête serait :
    nom email
    Martine Durand martine.durand@mail.com
    Hermine Nyaleu hermine.nyaleu@mail.com
    Léon Leroy leon.leroy@mail.com
    Aïcha Djérouni aicha.djerouni@mail.com
    Philippe Gaspar philippe.gaspar@mail.com
1.2. Sélection (WHERE en SQL)
  • L'opération de sélection demande à un SGBDR de choisir des lignes (tuples) qui répondent à certains critères logiques.
  • Par exemple,,
    Écrire une requête qui récupère les coordonnées des élèves de la T07 inscrits à la bibliothèque.
    Traduction en requête SQL :

    SELECT *
    FROM Eleve
    WHERE classe = "T07";
    Le résultat serait
    id_eleve nom email classe
    1 Martine Durand martine.durand@mail.com T07
    4 Aïcha Djérouni aicha.djerouni@mail.com T07
1.3. Projection puis sélection (SELECT puis WHERE en SQL)
  • L'opération sélectionne certaines colonnes puis choisit des lignes (tuples) qui répondent à certains critères logiques.
  • Par exemple,,
    Écrire une requête qui récupère les titre et les éditeurs des livres publiés avant 2020 ?
    Traduction en requête SQL :

    SELECT titre, éditeur, année_publication
    FROM Livre
    WHERE année_publication < 2020;
    Le résultat serait
    titre éditeur année_publication
    Méditations métaphysiques Flammarion 2011
    Les Misérables Larousse 2007

2. Opérations sur plus d'une table

2.1. Produit cartésien (CROSS JOIN en SQL)

Le produit cartésien est une opération qui permet de combiner les lignes (tuples) de deux tables en une seule, où chaque ligne (tuple) de la première table est associée à chaque ligne (tuple) de la seconde.
Il génère toutes les paires de lignes possibles à partir de deux tables.
Un exemple avec deux tables dans une BDR :

Pays
id_pays nom_pays
1 France
2 USA
3 Cameroun
Devise
id_devise nom_devise
1 Euro
2 Dollar
3 FCFA

Le produit cartésien de Pays et Devise va créer une nouvelle table où chaque pays est associé à chaque devise :

Pays × Devise
id_pays nom_pays id_devise nom_devise
1 France 1 Euro
1 France 2 Dollar
1 France 3 FCFA
2 USA 1 Euro
2 USA 2 Dollar
2 USA 3 FCFA
3 Cameroun 1 Euro
3 Cameroun 2 Dollar
3 Cameroun 3 FCFA

Dans ce cas, le produit cartésien génère une table de 3 × 3 lignes ; soit 9 lignes.
Dans la pratique, le produit cartésien est toujours accompagné d'une condition : jointure.

2.2. θ-jointure (JOIN en SQL)

Une θ-jointure est une opération qui permet de combiner les données de plusieurs tables en une seule, en associant les lignes en fonction de conditions spécifiques, généralement basées sur une ou plusieurs colonnes communes.

Syntaxe
SELECT liste d'attributs
FROM table1
JOIN table2 ON table1.colonne_commune = table2.colonne_commune
JOIN table3 ON table2.colonne_commune = table3.colonne_commune
...

Exemple 1 : Écrire une requête qui récupère les titres, les éditeurs et l'année de publication des livres écrits par John Grisham.

SELECT auteur.nom, livre.titre, livre.éditeur, livre.année_publication
FROM Auteur
JOIN Livre ON auteur.id_auteur = livre.id_auteur;
Le résultat serait
nom titre éditeur année_publication
John Grisham La chance d'une vie JCLattès 2022
John Grisham Son nom sur la liste JCLattès 2023
John Grisham Le réseau JCLattès 2024
Exemple 2 : Écrire une requête qui récupère les noms et classes des élèves, ainsi que les titres des livres, dates de leurs emprunts et de leurs retours pour les livres qu’ils ont empruntés.
SELECT Eleve.nom, Eleve.classe, Livre.titre, Emprunt.date_emprunt, Emprunt.date_retour
FROM Eleve
JOIN Emprunt ON Eleve.id_eleve = Emprunt.id_eleve
JOIN Livre ON Emprunt.id_livre = Livre.id_livre;
Le résultat serait
nom classe titre date_emprunt date_retour
Martine Durand La chance d'une vie T07 2024-09-15 2024-09-25
Hermine Nyaleu Méditations métaphysiques T08 2024-09-20 2024-09-30
Hermine Nyaleu Jacaranda T08 2024-09-20 2024-09-30
Aïcha Djérouni Les Misérables T07 2024-09-18 2024-09-28
Aïcha Djérouni Belle Greene T07 2024-10-01 2024-10-10
Martine Durand Son nom sur la liste T07 2024-09-25 2024-10-05
Aïcha Djérouni La chance d'une vie T07 2024-10-01 2024-10-10
Martine Durand Le réseau T07 2024-09-25 2024-10-05
Une 2e syntaxe possible
SELECT liste d'attributs
FROM liste_de_tables
WHERE condition

Exemple 1, s'écrit alors :

SELECT auteur.nom, livre.titre, livre.éditeur, livre.année_publication
FROM auteur, livre
WHERE auteur.id_auteur = livre.id_auteur;

Et l'exemple 2, s'écrit :

SELECT eleve.nom, eleve.classe, livre.titre, emprunt.date_emprunt, emprunt.date_retour
FROM eleve, livre, emprunt
WHERE eleve.id_eleve = emprunt.id_eleve AND emprunt.id_livre = livre.id_livre;

2.3. Fonctions d'agrégation (COUNT, SUM, MAX, MIN, AVG en SQL)

Exemple 1 : Écrire une requête qui récupère le nombre total d'inscrits à la bibliothèque (avec renommage).

SELECT COUNT(*) AS total_inscrits
FROM Eleve

Exemple 2 : Écrire une requête qui renvoie le nombre moyen de prêts (avec renommage).

SELECT AVG(id_emprunt) AS nombre_moyen_emprunt
FROM Emprunt

Commandes de modification de la BDR

1. Insertion d'un nouvel enregistrement

SELECT INTO nom_table(colonne1, colonne2, colonne3, ...)
VALUES(valeur1, valeur2, valeur3, ...);

2. Suppression d'un enregistrement

DELETE FROM nom_table
WHERE condition;

3. Modification d'un enregistrement existant

UPDATE nom_table
SET colonne1 = nouvelle_valeur;
WHERE condition;

Faites-vous plaisir :

  1. Quelle est la différence entre une base de données et une table ?
  2. Un utilisateur de la BDR note manuellement que « le fichier contient deux cents enregistrements, chaque enregistrement contenant neuf champs ».
    Utiliser le vocabulaire approprié des BDR pour « traduire » cette phrase.
  3. Dans une BD relationnelle, qu'est-ce qu'une entité de la BD ?
  4. Dans une BD relationnelle, que représente une instance d'une table ?
  5. Pourquoi désigner l'une des clés candidates d'une relation comme clé primaire ?
  6. Définir clé étrangère dans une BDR. À quoi sert-elle ?
  7. Considérons la BDR bibliothèque ci-dessus en l'état.
      Que se passerait-il dans les cas suivants ?
    • INSERT (10, "Waël Louise", ""wael.louise@mail.com", "T01") INTO Eleve;
    • INSERT INTO Auteur
      VALUES(3, "Kamel Daoud");
    • DELETE FROM Eleve
      WHERE id_eleve = 1;
    • UPDATE Emprunt
      SET id_eleve = 100
      WHERE id_livre = 6;
    • INSERT INTO Auteur
      VALUES(6, "Kamel Daoud");
    • INSERT INTO Livre
      VALUES(8, "Houris", 6, "roman", "Gallimard","2072999995", 2024);
  8. Écrire les requêtes suivantes :
    • Récupérer tous les éditeurs des livres de la bibliothèque.
    • Récupérer les noms et adresses email des élèves de la T07 et T08, ordonnés suivant le nom.
    • Récupérer les titres des livres et années de publication des différents éditeurs.
    • Récupérer le nombre livre à la bibliothèque
    • Pour chaque classe, récupérer la classe et le nombre d'élève dans la classe.
    • Récupérer les titres des livres, auteurs, éditeurs et années de publication des livres empruntés après le mois de septembre.
    • Pour chaque élève ayant au moins deux emprunts, récupérer les noms et nombre de livres empruntés.
    • Récupérer l'auteur le plus lu.
  9. Insérer ce nouvel élève dont l'id_eleve est 9 dans la table Eleve : Yaël Duclair dont l'adresse email est yael.duclair@mail.com et fréquentant la T01.
  10. L'élève Philippe Gaspar passe de la T05 à la T02.
  11. Supprimer