Chapitre1 LDD 2024 - 240306 - 104310
Chapitre1 LDD 2024 - 240306 - 104310
Chapitre1 LDD 2024 - 240306 - 104310
(LDD)
Introduction
Ce chapitre présente le langage de définition de données (LDD) qui permet de spécifier le schéma
d’une base de données relationnelle. Ce langage correspond à une partie de la norme SQL (structured
query language), l’autre partie étant relative à la manipulation des données (LMD).
La définition d’un schéma logique comprend essentiellement deux parties : d’une part la description
des tables et de leur contenu, d’autre part les contraintes qui portent sur les données de la base. La
spécification des contraintes est souvent placée au second plan bien qu’elle soit en fait très importante
: elle permet d’assurer, au niveau de la base des contrôles sur l’intégrité des données qui s’imposent à
toutes les applications accédant à cette base. Un dernier aspect de la définition d’un schéma,
rapidement survolé ici, est la description de la représentation physique.
Il existe plusieurs versions de SQL. Le plus ancien standard date de 1989. Il a été révisé de manière
importante en 1992 : la norme résultant de cette révision est SQL-92 ou SQL2. Une extension (SQL3)
comprenant l’introduction de caractéristiques orientées-objet est en cours de discussion depuis très
longtemps, et certains systèmes ont déjà anticipé en proposant de nouvelles fonctionnalités. Le matériel
présenté dans ce cours est essentiellement SQL2, sauf pour quelques nouveautés explicitement
indiquées.
1- Types SQL
La norme SQL ANSI propose un ensemble de types qui sont donnés dans le tableau 4.1. Ce tableau
présente également la taille, en octets, des instances de chaque type, cette taille n’étant ici qu’à titre
indicatif car elle peut varier selon les systèmes.
Tous les attributs figurant dans une clé doivent être déclarés NOT NULL. Cela n’a pas
vraiment de sens en effet d’identifier des lignes par des valeurs absentes. On peut
également spécifier que la valeur d’un attribut est unique pour l’ensemble de la
colonne. Cela permet d’indiquer des clés secondaires. On peut par exemple indiquer
que deux artistes ne peuvent avoir les mêmes nom et prénom avec l’option UNIQUE.
CREATE TABLE Artiste(id INTEGER NOT NULL, nom VARCHAR (30) NOT NULL,
prenom VARCHAR (30) NOT NULL, anneeNaiss INTEGER, PRIMARY KEY (id),
UNIQUE (nom, prenom));
Il est facile de supprimer cette contrainte de clé secondaire par la suite. Ce serait
beaucoup plus difficile si on avait utilisé la paire (nom, prenom) comme clé primaire
puisqu’elle serait alors utilisée pour référencer un artiste dans d’autres tables. Voici
un autre exemple d’utilisation d’une clé secondaire : on indique ci-dessous qu’on ne
peut pas trouver deux cinémas à la même adresse. Ce deuxième exemple montre
que l’on peut placer une contrainte comme UNIQUE sur la ligne de l’attribut auquel
elle se rapporte. Ce n’est bien entendu possible que quand cette contrainte ne
concerne qu’un seul attribut.
CREATE TABLE Cinema
VARCHAR (30) NOT
(nom
NULL,VARCHAR(50)
adresse
UNIQUE,
PRIMARY KEY (nomCinema))
La clause UNIQUE ne s’applique pas aux valeurs NULL : il peut y avoir plusieurs
cinémas d’adresse inconnue. En revanche le nom du cinéma est obligatoire (clause
NOT NULL) et il est unique (clause PRIMARY KEY).
Clés étrangères
La norme SQL ANSI permet d’indiquer quelles sont les clés étrangères dans une
table, autrement dit, quels sont les attributs qui font référence à une ligne dans une
autre table. On peut spécifier les clés étrangères avec l’option FOREIGN KEY.
CREATE TABLE Film (idFilm INTEGER NOT NULL,
titre VARCHAR (50) NOT NULL, annee INTEGER NOT NULL, idMES INTEGER,
codePays INTEGER, PRIMARY KEY (idFilm), FOREIGN KEY (idMES)
REFERENCES Artiste, FOREIGN KEY (codePays) REFERENCES Pays);
La commande
FOREIGN KEY (idMES) REFERENCES Artiste indique que idMES référence la clé
primaire de la table Artiste. Le SGBD vérifiera alors, pour toute modification pouvant
affecter le lien entre les deux tables, que la valeur de idMES correspond bien à une
ligne de Artiste. Ces modifications sont :
1. l’insertion dans Film avec une valeur inconnue pour idMES ;
2. la destruction d’un artiste ;
3. la modification de id dans Artiste ou de idMES dans Film.
En d’autres termes le lien entre Film et Artiste est toujours valide. Cette contrainte est
importante pour garantir qu’il n’y a pas de fausse référence dans la base, par exemple
qu’un film ne fait pas référence à un artiste qui n’existe pas. Il est beaucoup plus
confortable d’écrire une application par la suite quand on sait que les informations sont
bien là où elles doivent être.
Il faut noter que l’attribut idMES n’est pas déclaré NOT NULL, ce qui signifie que l’on
s’autorise à ne pas connaître le metteur en scène d’un film. Quand un attribut est à
NULL, la contrainte d’intégrité référentielle ne s’applique pas.
Que se passe-t-il quand la violation d’une contrainte d’intégrité est détectée par le
système ? Par défaut, la mise à jour est rejetée, mais il est possible de demander la
répercussion de cette mise à jour de manière à ce que la contrainte soit respectée.
Les événements que l’on peut répercuter sont la modification ou la destruction de la
ligne référencée, et on les désigne par ON UPDATE et ON DELETE respectivement.
La répercussion elle-même consiste soit à mettre la clé étrangère à NULL (option SET
NULL), soit à appliquer la même opération aux lignes de l’entité composante (option
CASCADE).
Voici comment on indique que la destruction d’un metteur en scène déclenche la mise
à NULL de la clé étrangère idMES pour tous les films qu’il a réalisés.
CREATE TABLE Film (titre VARCHAR (50) NOT NULL,
annee INTEGER NOT NULL, idMES INTEGER, codePays INTEGER, PRIMARY KEY
(titre),
FOREIGN KEY (idMES) REFERENCES Artiste ON DELETE SET NULL,
FOREIGN KEY (codePays) REFERENCES Pays);
Dans le cas d’une entité faible, on décide en général de détruire le composant quand
on détruit le composé. Par exemple, quand on détruit un cinéma, on veut également
détruire les salles ; quand on modifie la clé d’un cinéma, on veut répercuter la
modification sur ses salles.
CREATE TABLE Salle (nomCinema VARCHAR (30) NOT NULL,
no INTEGER NOT NULL,
capacite INTEGER, PRIMAR KEY (nomCinema, no), FOREIGN KEY (nomCinema)
REFERENCES Cinema
ON DELETE CASCADE ON UPDATE CASCADE )
Il est important de noter que nomCinema fait partie de la clé et ne peut donc pas être
NULL. On ne pourrait donc pas spécifier ici ON DELETE SET NULL.
La spécification des actions ON DELETE et ON UPDATE simplifie considérablement
la gestion de la base par la suite : on n’a plus par exemple à se soucier de détruire les
salles quand on détruit un cinéma.