Le modèle relationnel

Objectifs et prérequis

Prérequis : introduction aux bases de données (SGBD, quatre services)

À l’issue de ce chapitre, vous saurez :

  • expliquer pourquoi une table unique pose des problèmes de redondance et d’incohérence ;
  • définir les termes du modèle relationnel : relation, attribut, domaine, tuple, schéma ;
  • identifier la clé primaire d’une table et justifier son rôle ;
  • identifier les clés étrangères et expliquer comment elles relient les tables ;
  • lire et écrire un schéma relationnel en notation compacte.

D’un tableur à une base relationnelle

Le problème de départ

Imaginons un opérateur de téléphonie qui souhaite gérer ses clients. Pour chaque appel, il enregistre le nom du client, son adresse, le numéro de téléphone utilisé, le numéro appelé, la date, la durée et le tarif appliqué.

Une première idée consiste à tout mettre dans un seul tableau :

NomPrénomAdresseNuméro de tél.No appeléDate et heureDurée (s)Tarif (€/min)
DupontLéon3 rue du marché 69007 Lyon0612345678068765432110.02.2020 14:324550.70
DupontLéon3 rue du marché 69007 Lyon0612345678061111111117.02.2020 18:37620.20
DupontLéon3 rue du marché 69007 Lyon0633333333061111111123.02.2020 9:211450.20
DupontLéon22 rue de la gare 69003 Lyon0644444444065555555512.02.2020 19:013020.10

Les anomalies d’une table unique

Cette table unique présente trois types d’anomalies.

Anomalie de mise à jour. L’adresse de Léon Dupont apparaît dans chaque ligne qui le concerne. S’il déménage, il faut modifier toutes les lignes, sous peine d’incohérence (lignes 1 à 3 : ancienne adresse, ligne 4 : nouvelle adresse).

Anomalie de suppression. Si l’on supprime toutes les lignes d’un client qui n’a passé qu’un seul appel, on perd à la fois l’appel et les coordonnées du client.

Anomalie d’insertion. On ne peut pas enregistrer un nouveau client tant qu’il n’a pas passé d’appel, puisque toutes les colonnes sont dans la même table.

La solution : découper en plusieurs tables

Pour résoudre ces anomalies, on décompose les informations en plusieurs tables, chacune décrivant un type d’objet :

Table Clients :

Id_clientNomPrénomAdresse
156DupontLéon3 rue du marché 69007 Lyon
10234DupontLéon22 rue de la gare 69003 Lyon

Table Telephones :

NuméroId_client
0612345678156
0633333333156
064444444410234

Table Appels :

Id_appelNuméro_appelantNuméro_appeléDate et heureDurée (s)Tarif (€/min)
10612345678068765432110.02.2020 14:324550.70
20612345678061111111117.02.2020 18:37620.20
30633333333061111111123.02.2020 9:211450.20
40644444444065555555512.02.2020 19:013020.10

Chaque information est stockée une seule fois : l’adresse d’un client n’apparaît que dans la table Clients. Les tables sont reliées entre elles par des identifiants communs (Id_client dans Clients et Telephones, Numéro dans Telephones et Appels).

Le vocabulaire du modèle relationnel

Le modèle relationnel a été inventé par Edgar Frank Codd (chercheur chez IBM) en 1970. Il formalise cette organisation en tables reliées.

Relation (table)

Une relation (ou table) est un ensemble de données organisé en lignes et en colonnes. Chaque relation porte un nom (Clients, Telephones, Appels).

Attribut (colonne)

Un attribut est une colonne de la table. Il porte un nom et possède un domaine qui définit le type de valeurs autorisées : entiers (INT), texte (TEXT), nombres réels (REAL), dates (DATE), etc.

Par exemple, dans la table Clients, l’attribut Nom a pour domaine TEXT et l’attribut Id_client a pour domaine INT.

Tuple (ligne, enregistrement)

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

Dans la table Clients, le tuple (156, 'Dupont', 'Léon', '3 rue du marché 69007 Lyon') est un enregistrement.

Schéma d’une relation

Le schéma d’une relation est la description de sa structure : son nom et la liste de ses attributs avec leurs domaines. On l’écrit ainsi :

Clients(Id_client : INT, Nom : TEXT, Prénom : TEXT, Adresse : TEXT)

En pratique, on omet souvent les domaines pour alléger la notation :

Clients(Id_client, Nom, Prénom, Adresse)

Les clés

Clé primaire

La clé primaire est un attribut (ou un ensemble d’attributs) qui identifie de manière unique chaque tuple d’une relation. Deux propriétés fondamentales :

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

Dans la table Clients, Id_client est la clé primaire : chaque client a un identifiant unique. On la souligne dans le schéma :

Clients(Id_client, Nom, Prénom, Adresse)

Pourquoi ne pas utiliser le nom comme clé ? Parce que deux clients peuvent s’appeler « Dupont Léon » (c’est d’ailleurs le cas dans notre exemple). Un identifiant numérique garantit l’unicité.

Clé étrangère

Une clé étrangère est un attribut d’une table qui fait référence à la clé primaire d’une autre table. C’est le mécanisme qui relie les tables entre elles.

Dans la table Telephones, l’attribut Id_client est une clé étrangère qui référence Clients.Id_client. Cela signifie que chaque valeur de Id_client dans Telephones doit correspondre à un Id_client existant dans Clients.

On note la clé étrangère avec le symbole # :

Telephones(Numéro, #Id_client)

Le schéma relationnel

Le schéma relationnel est l’ensemble des schémas de toutes les relations d’une base de données. Pour notre exemple :

  • Clients(Id_client, Nom, Prénom, Adresse)
  • Telephones(Numéro, #Id_client)
  • Appels(Id_appel, #Numéro_appelant, Numéro_appelé, Date_heure, Durée, Tarif)

Conventions :

  • l’attribut souligné est la clé primaire ;
  • l’attribut précédé de # est une clé étrangère.

Lire un schéma relationnel

Pour lire un schéma, on se pose trois questions :

  1. Quelles sont les tables ? Ici : Clients, Telephones, Appels.
  2. Quels sont les attributs de chaque table ? Par exemple, Clients a quatre attributs.
  3. Quels sont les liens entre les tables ? Les clés étrangères (#) indiquent les liens : Telephones est relié à Clients par Id_client, Appels est relié à Telephones par Numéro_appelant.
Vérifiez votre compréhension
  1. Dans le schéma Livres(isbn, titre, auteur, annee), quel est l’attribut qui sert de clé primaire ? Pourquoi a-t-on choisi cet attribut plutôt que le titre ?
    RéponseLa clé primaire est isbn. On ne peut pas utiliser le titre car deux livres différents peuvent avoir le même titre (par exemple, plusieurs éditions ou des livres d'auteurs différents portant le même nom). L'ISBN est un identifiant unique attribué à chaque édition d'un livre.
  2. On dispose du schéma Emprunts(id_emprunt, #isbn, #id_adherent, date_emprunt). Quelles sont les clés étrangères ? Vers quelles tables pointent-elles ?
    RéponseLes clés étrangères sont #isbn (qui pointe vers la table Livres) et #id_adherent (qui pointe vers une table Adherents). Chaque emprunt est ainsi relié à un livre et à un adhérent.
  3. Quelle est la différence entre un attribut, un tuple et une relation ?
    RéponseUn attribut est une colonne (par exemple Nom). Un tuple est une ligne (un enregistrement complet). Une relation est la table entière (l'ensemble de tous les tuples avec tous les attributs).
L'essentiel à retenir
  • Une table unique contenant toutes les informations provoque des anomalies (mise à jour, suppression, insertion) dues à la redondance des données.
  • Le modèle relationnel (Codd, 1970) décompose les données en plusieurs relations (tables), chacune décrivant un type d’objet.
  • Le vocabulaire clé : relation (table), attribut (colonne), domaine (type), tuple (ligne), schéma (structure).
  • La clé primaire identifie chaque tuple de manière unique (unicité + non-nullité).
  • La clé étrangère relie deux tables en référençant la clé primaire d’une autre table.
  • Le schéma relationnel décrit l’ensemble des tables, leurs attributs, leurs clés primaires (soulignées) et leurs clés étrangères (précédées de #).