Aller au contenu

Le modèle relationnel et les bases de données

Terminale · NSI · Bases de données

Bases de données

Relations, clés et contraintes d'intégrité

Un fichier CSV suffit pour quelques dizaines de lignes. Mais dès qu'il faut gérer des millions d'enregistrements, plusieurs utilisateurs simultanés et des données liées entre elles, il faut une base de données relationnelle. Le modèle relationnel, inventé par Edgar Codd en 1970, organise l'information en tables reliées par des clés, et confie à un logiciel spécialisé — le SGBD — le soin d'en garantir la cohérence.

La base de référence : une médiathèque

On utilisera partout la même base, composée de quatre relations. La clé primaire est soulignée par convention (ici mise en gras) et le symbole # signale une clé étrangère :
Auteur(id_auteur, nom, prenom, nationalite)
Livre(id_livre, titre, annee, id_auteur#)
Adherent(id_adherent, nom, prenom, ville, annee_naissance)
Emprunt(id_emprunt, id_livre#, id_adherent#, date_emprunt, date_retour)

ContrainteCe qu'elle imposeExemple de violation refusée par le SGBD
Intégrité d'entitéLa clé primaire est unique et jamais NULLInsérer un deuxième livre portant l'id_livre 12
Intégrité référentielleToute clé étrangère renvoie à une clé primaire qui existe vraimentInsérer un livre avec id_auteur = 99 alors qu'aucun auteur ne porte ce numéro
Intégrité de domaineChaque valeur appartient au domaine de son attributÉcrire « mille neuf cent quatre-vingt-quatre » dans annee, qui est un entier
Contrainte utilisateurUne règle métier ajoutée explicitementEnregistrer une date_retour antérieure à la date_emprunt

Bases de données

Modéliser sans redondance, et le rôle du SGBD

Concevoir une base, c'est décider combien de tables créer et où placer les clés étrangères. Une mauvaise décomposition produit de la redondance, et la redondance produit inévitablement des incohérences. La règle est simple : chaque information n'est stockée qu'à un seul endroit.

Pourquoi une seule grosse table est une mauvaise idée. Imaginons qu'au lieu de deux tables on stocke tout dans une seule relation Livre(id_livre, titre, annee, nom_auteur, nationalite_auteur). Chaque roman d'Orwell répète alors « Orwell » et « britannique ». Trois catégories de problèmes apparaissent, qu'on appelle les anomalies :

AnomalieCe qui se passeExemple concret
De mise à jourCorriger une information oblige à modifier plusieurs lignes ; en oublier une rend la base incohérenteCorriger l'orthographe d'un nom d'auteur dans 12 lignes, et en oublier une
D'insertionOn ne peut pas enregistrer une information tant qu'une autre n'existe pasImpossible d'enregistrer un auteur dont on n'a encore aucun livre
De suppressionSupprimer une ligne détruit au passage une information sans rapportSupprimer le dernier livre d'un auteur efface toute trace de cet auteur

La solution est la décomposition : on sort l'auteur dans sa propre table, où son nom n'apparaît qu'une seule fois, et on le référence depuis Livre par une clé étrangère. Corriger l'orthographe se fait alors en un seul endroit, et l'incohérence devient structurellement impossible.

Exercices corrigés

  1. Qu'est-ce qu'une clé étrangère ?

    • A.Une clé primaire écrite dans une langue étrangère
    • B.Un attribut dont les valeurs sont toutes différentes
    • C.Un attribut d'une relation qui référence la clé primaire d'une autre relationBonne réponse
    • D.Un attribut facultatif que l'on peut supprimer sans conséquence

    Réponse : C — Un attribut d'une relation qui référence la clé primaire d'une autre relation

    La clé étrangère est le mécanisme qui relie les tables entre elles. Dans Livre(id_livre, titre, annee, id_auteur), l'attribut id_auteur est une clé étrangère : chacune de ses valeurs doit correspondre à un id_auteur existant réellement dans la table Auteur, sans quoi le SGBD refuse l'opération. Attention à la deuxième option, très tentante : une clé étrangère n'est justement pas unique, puisque plusieurs livres peuvent partager le même auteur. C'est la clé primaire pointée qui, elle, est unique.

  2. Dans le schéma Adherent(id_adherent, nom, prenom, ville, annee_naissance), que désigne le mot « attribut » ?

    • A.Une ligne de la table, c'est-à-dire un adhérent
    • B.Une colonne de la table, comme ville ou annee_naissanceBonne réponse
    • C.L'ensemble des valeurs autorisées pour une colonne
    • D.Le nombre total d'adhérents enregistrés

    Réponse : B — Une colonne de la table, comme ville ou annee_naissance

    Un attribut est une colonne de la relation : id_adherent, nom, prenom, ville et annee_naissance sont les cinq attributs de cette table. Une ligne s'appelle un enregistrement ou un n-uplet, et correspond ici à un adhérent précis. L'ensemble des valeurs autorisées pour une colonne porte encore un autre nom : c'est le domaine de l'attribut — par exemple les entiers pour annee_naissance.

  3. Une clé primaire peut-elle valoir NULL ?

    • A.Oui, à condition qu'une seule ligne soit dans ce cas
    • B.Oui, NULL est une valeur comme une autre
    • C.Oui, mais uniquement pour la première ligne insérée
    • D.Non, jamais : c'est la contrainte d'intégrité d'entitéBonne réponse

    Réponse : D — Non, jamais : c'est la contrainte d'intégrité d'entité

    La clé primaire sert à identifier une ligne sans ambiguïté. Or NULL ne signifie pas « zéro » ni « vide » : il signifie « valeur inconnue ». Une ligne dont l'identifiant serait inconnu ne pourrait par définition pas être identifiée, ce qui viderait la clé primaire de son sens. Le SGBD interdit donc toute valeur NULL dans une clé primaire, en plus d'y interdire les doublons : c'est ce qu'on appelle la contrainte d'intégrité d'entité. En revanche, une colonne ordinaire comme date_retour peut parfaitement valoir NULL, ce qui signifie ici « pas encore rendu ».

  4. Dans la relation Emprunt(id_emprunt, id_livre, id_adherent, date_emprunt, date_retour), un même livre peut être emprunté plusieurs fois et un même adhérent peut emprunter plusieurs livres. Quel attribut peut servir de clé primaire ?

    • A.id_empruntBonne réponse
    • B.id_livre
    • C.id_adherent
    • D.date_emprunt

    Réponse : A — id_emprunt

    Une clé primaire doit prendre une valeur différente sur chaque ligne. Or id_livre se répète, puisqu'un même livre peut être emprunté à plusieurs reprises ; id_adherent se répète également, puisqu'un adhérent emprunte plusieurs ouvrages ; et date_emprunt se répète aussi, car plusieurs emprunts ont lieu le même jour. Seul id_emprunt, créé exprès pour numéroter chaque emprunt, est unique. C'est d'ailleurs le rôle typique d'un identifiant artificiel : garantir l'unicité là où aucune donnée métier ne le fait.

  5. La table Auteur contient les auteurs numérotés 1, 2 et 3. Que se passe-t-il si l'on tente d'insérer dans Livre une ligne avec id_auteur = 7 ?

    • A.L'insertion réussit et l'auteur 7 est créé automatiquement
    • B.L'insertion réussit, mais la valeur 7 est remplacée par NULL
    • C.L'insertion est refusée : elle violerait la contrainte d'intégrité référentielleBonne réponse
    • D.L'insertion réussit sans aucune conséquence, les clés étrangères n'étant pas vérifiées

    Réponse : C — L'insertion est refusée : elle violerait la contrainte d'intégrité référentielle

    La contrainte d'intégrité référentielle exige que toute valeur d'une clé étrangère corresponde à une clé primaire existant réellement dans la table pointée. Comme aucun auteur ne porte le numéro 7, cette ligne créerait un enregistrement orphelin, pointant vers le vide. Le SGBD rejette donc l'insertion et signale l'erreur. Il ne crée jamais d'auteur fantôme à la volée et ne remplace pas silencieusement la valeur : le principe est de refuser l'opération plutôt que de laisser la base devenir incohérente.

  6. Un auteur peut écrire plusieurs livres, mais dans ce modèle un livre n'a qu'un seul auteur. Comment traduire ce lien ?

    • A.En plaçant une clé étrangère id_auteur dans la table LivreBonne réponse
    • B.En plaçant une clé étrangère id_livre dans la table Auteur
    • C.En créant une table d'association entre Livre et Auteur
    • D.En fusionnant Livre et Auteur dans une seule table

    Réponse : A — En plaçant une clé étrangère id_auteur dans la table Livre

    Dans un lien un-à-plusieurs, la clé étrangère se place toujours du côté « plusieurs ». Ici, chaque livre a exactement un auteur : une seule case id_auteur suffit donc dans Livre, et plusieurs livres pourront y inscrire la même valeur. L'inverse ne marcherait pas : mettre un id_livre dans Auteur imposerait une ligne par livre et donc de répéter l'auteur autant de fois. La table d'association ne se justifie que pour un lien plusieurs-à-plusieurs, et la fusion ramènerait précisément la redondance qu'on cherche à éliminer.

  7. Une relation Note(id_eleve, id_matiere, trimestre, valeur) enregistre une note par élève, par matière et par trimestre. Que peut-on dire de sa clé primaire ?

    • A.C'est id_eleve, puisqu'il identifie l'élève
    • B.Cette relation ne peut pas avoir de clé primaire
    • C.C'est une clé composée du triplet (id_eleve, id_matiere, trimestre)Bonne réponse
    • D.C'est valeur, puisque deux notes sont rarement identiques

    Réponse : C — C'est une clé composée du triplet (id_eleve, id_matiere, trimestre)

    Aucun attribut ne suffit à lui seul : un même élève a plusieurs notes, une même matière concerne plusieurs élèves, et un trimestre en rassemble des milliers. En revanche, le triplet (id_eleve, id_matiere, trimestre) désigne bien une note et une seule, d'après l'énoncé. Une clé primaire peut donc parfaitement être composée de plusieurs attributs. Quant à valeur, c'est le pire choix possible : deux élèves qui obtiennent 14 rendraient la clé non unique, et « rarement identique » n'est jamais une garantie en base de données.

  8. L'attribut annee de la table Livre a pour domaine les entiers. Que se passe-t-il si l'on essaie d'y écrire la chaîne « mille neuf cent quarante-neuf » ?

    • A.Le SGBD convertit automatiquement le texte en nombre
    • B.L'opération est refusée : elle violerait la contrainte d'intégrité de domaineBonne réponse
    • C.La valeur est enregistrée puis tronquée aux dix premiers caractères
    • D.La valeur est acceptée, le domaine n'étant qu'une indication

    Réponse : B — L'opération est refusée : elle violerait la contrainte d'intégrité de domaine

    Le domaine d'un attribut définit l'ensemble des valeurs qu'il a le droit de prendre, et il est réellement contrôlé par le SGBD, pas seulement documenté. Une chaîne de caractères n'appartient pas au domaine des entiers : l'opération est donc rejetée. Cette contrainte est précieuse, car elle empêche d'entrée de jeu des données absurdes de contaminer la base. Le SGBD ne devine pas ce que tu voulais dire et ne tronque rien : il refuse, tout simplement.

  9. Deux livres de la table Livre référencent l'auteur numéro 3. Que se passe-t-il si l'on tente de supprimer cet auteur de la table Auteur ?

    • A.La suppression est refusée, car elle laisserait deux livres pointant vers un auteur inexistantBonne réponse
    • B.La suppression réussit et les deux livres sont supprimés en silence
    • C.La suppression réussit, les deux livres conservant la valeur 3 dans id_auteur
    • D.La suppression réussit, car l'intégrité référentielle ne concerne que les insertions

    Réponse : A — La suppression est refusée, car elle laisserait deux livres pointant vers un auteur inexistant

    L'intégrité référentielle doit être vraie en permanence, pas seulement au moment des insertions : elle est donc vérifiée aussi lors des suppressions et des modifications. Supprimer l'auteur 3 laisserait deux livres avec une clé étrangère pointant vers rien, c'est-à-dire deux enregistrements orphelins. Par défaut, le SGBD refuse donc l'opération. Pour aboutir, il faut d'abord traiter les livres concernés — les supprimer ou les rattacher à un autre auteur —, à moins d'avoir explicitement configuré un comportement en cascade au moment de la création de la table.

  10. Deux bibliothécaires enregistrent au même instant un emprunt du dernier exemplaire disponible d'un livre. Quelle propriété ACID empêche que les deux opérations se mélangent et corrompent les données ?

    • A.L'atomicité
    • B.L'isolationBonne réponse
    • C.La durabilité
    • D.La cohérence

    Réponse : B — L'isolation

    L'isolation garantit que deux transactions simultanées ne se marchent pas dessus : tout se passe comme si elles s'exécutaient l'une après l'autre, même quand le SGBD les traite en parallèle. Sans elle, les deux bibliothécaires pourraient lire « 1 exemplaire disponible » en même temps et valider chacun leur emprunt. L'atomicité concerne le caractère tout-ou-rien d'une transaction prise isolément ; la durabilité assure que le travail validé survit à une panne ; la cohérence garantit le respect des contraintes avant et après. Chacune répond à un risque différent.

  11. Qu'est-ce qu'une clé primaire dans une relation ?

    • A.Le premier attribut déclaré dans le schéma de la relation
    • B.Un attribut, ou groupe d'attributs, qui identifie de façon unique chaque enregistrementBonne réponse
    • C.Un attribut qui référence une autre table
    • D.Le mot de passe protégeant l'accès à la table

    Réponse : B — Un attribut, ou groupe d'attributs, qui identifie de façon unique chaque enregistrement

    La clé primaire est ce qui permet de désigner un enregistrement sans ambiguïté : deux lignes ne peuvent jamais partager la même valeur de clé primaire, et celle-ci ne vaut jamais NULL. Sa position dans le schéma n'a aucune importance, même si on la place traditionnellement en premier. L'attribut qui référence une autre table, c'est la clé étrangère. Et malgré son nom, une clé primaire n'a évidemment rien à voir avec la sécurité ou un mot de passe.

  12. Dans le modèle relationnel, que désigne le mot « relation » ?

    • A.Le lien entre deux tables
    • B.La clé étrangère qui relie deux enregistrements
    • C.Un couple formé par une ligne et une colonne
    • D.Une table, c'est-à-dire un ensemble d'enregistrements décrits par les mêmes attributsBonne réponse

    Réponse : D — Une table, c'est-à-dire un ensemble d'enregistrements décrits par les mêmes attributs

    C'est le faux ami numéro un du chapitre. Dans le vocabulaire de Codd, une « relation » désigne une table elle-même : Livre est une relation, Auteur en est une autre. Le lien entre deux tables, lui, se nomme une association, et il est concrètement réalisé par une clé étrangère. Retiens la correspondance complète : relation = table, attribut = colonne, n-uplet ou enregistrement = ligne.

S'entraîner sur ce chapitre

Ce chapitre compte 37 exercices corrigés dans l'application, avec le suivi de ta progression.

Commencer les exercices