© Éditions Eyrolles
197
chapitre n° 3
Le niveau physique : de SQL2 à SQL3
Solution universelle
Il est possible de modéliser toute association par une table supplémentaire, qui contiendra
autant de clés étrangères qu’il y a de tables à relier, et sur lesquelles existera ou non une
contrainte de type UNIQUE. Ce principe s’apparente à la règle R3.
Cette solution présente l’avantage de pouvoir faire évoluer le schéma plus facilement si les cardinalités viennent à changer dans le temps. En effet, il n’y a besoin de modifier la structure
d’aucune table, seules des contraintes UNIQUE devront être désactivées.
Considérons à nouveau l’exemple des stages des étudiants. La table supplémentaire (Effectuer) contient deux colonnes réalisant l’association. Sur chaque colonne, il sera impératif de
définir une contrainte UNIQUE qui garantira les cardinalités maximales de l’association (ici
un-à-un).
Ce schéma est évolutif. En effet, si un stage peut être effectué par plusieurs étudiants, il faudra
simplement désactiver la contrainte (ALTER TABLE Effectuer DISABLE CONSTRAINT
unique_Effectuer_nstage). On retrouvera une association un-à-plusieurs. Si un étudiant
peut effectuer plusieurs stages, il faudra désactiver l’autre contrainte. On se retrouvera alors
avec une association plusieurs-à-plusieurs.
Tableau 3.11 Solution universelle pour une association un-à-un
Schéma logique
Script SQL2
Stage[nstage, entreprise]
Effectuer[netu#, nstage#]
Etudiant[netu, nometu]
CREATE TABLE Stage
(nstage
VARCHAR(4), entreprise VARCHAR(30),
CONSTRAINT pk_stage PRIMARY KEY(nstage))
CREATE TABLE Etudiant
(netu VARCHAR(2), nometu VARCHAR(30),
CONSTRAINT pk_etudiant PRIMARY KEY(netu))
CREATE TABLE Effectuer
(netu VARCHAR(2), nstage VARCHAR(4),
CONSTRAINT pk_Effectuer PRIMARY KEY(netu,nstage),
CONSTRAINT fk_Effectuer_nstage_Stage
FOREIGN KEY(nstage) REFERENCES Stage(nstage),
CONSTRAINT fk_Effectuer_netu_Etudiant
FOREIGN KEY(netu) REFERENCES Etudiant(netu),
CONSTRAINT unique_Effectuer_netu UNIQUE (netu),
CONSTRAINT unique_Effectuer_nstage UNIQUE (nstage))
197
chapitre n° 3
Le niveau physique : de SQL2 à SQL3
Solution universelle
Il est possible de modéliser toute association par une table supplémentaire, qui contiendra
autant de clés étrangères qu’il y a de tables à relier, et sur lesquelles existera ou non une
contrainte de type UNIQUE. Ce principe s’apparente à la règle R3.
Cette solution présente l’avantage de pouvoir faire évoluer le schéma plus facilement si les cardinalités viennent à changer dans le temps. En effet, il n’y a besoin de modifier la structure
d’aucune table, seules des contraintes UNIQUE devront être désactivées.
Considérons à nouveau l’exemple des stages des étudiants. La table supplémentaire (Effectuer) contient deux colonnes réalisant l’association. Sur chaque colonne, il sera impératif de
définir une contrainte UNIQUE qui garantira les cardinalités maximales de l’association (ici
un-à-un).
Ce schéma est évolutif. En effet, si un stage peut être effectué par plusieurs étudiants, il faudra
simplement désactiver la contrainte (ALTER TABLE Effectuer DISABLE CONSTRAINT
unique_Effectuer_nstage). On retrouvera une association un-à-plusieurs. Si un étudiant
peut effectuer plusieurs stages, il faudra désactiver l’autre contrainte. On se retrouvera alors
avec une association plusieurs-à-plusieurs.
Tableau 3.11 Solution universelle pour une association un-à-un
Schéma logique
Script SQL2
Stage[nstage, entreprise]
Effectuer[netu#, nstage#]
Etudiant[netu, nometu]
CREATE TABLE Stage
(nstage
VARCHAR(4), entreprise VARCHAR(30),
CONSTRAINT pk_stage PRIMARY KEY(nstage))
CREATE TABLE Etudiant
(netu VARCHAR(2), nometu VARCHAR(30),
CONSTRAINT pk_etudiant PRIMARY KEY(netu))
CREATE TABLE Effectuer
(netu VARCHAR(2), nstage VARCHAR(4),
CONSTRAINT pk_Effectuer PRIMARY KEY(netu,nstage),
CONSTRAINT fk_Effectuer_nstage_Stage
FOREIGN KEY(nstage) REFERENCES Stage(nstage),
CONSTRAINT fk_Effectuer_netu_Etudiant
FOREIGN KEY(netu) REFERENCES Etudiant(netu),
CONSTRAINT unique_Effectuer_netu UNIQUE (netu),
CONSTRAINT unique_Effectuer_nstage UNIQUE (nstage))
