DTGFD
DTGFD
de bases de données
relationnelles
normalisées
stph.scenari-community.org/bdd
gen2.pdf
Stéphane Crozat
II - Devoir 15
Abréviations 31
Exercices
Exercices
I
Ce module propose des exercices permettant de réviser les fondamentaux de la conception des bases de
données normalisées.
Pour chaque clé, énoncer les DF qui prouvent que c'est une clé et explicitez les axiomes d'Armstrong utilisés
pour établir ces DF.
Proposez un schéma normalisé en 3NF, sans perte, en faisant apparaître les clés.
Rétro-concevez le modèle UML qui aurait permis d'arriver directement à ce résultat normalisé.
Écrivez le code SQL permettant de créer ce schéma normalisé dans une base de données standard.
3
Exercice : Agence de voyages
De nouvelles informations doivent être ajoutées à la base, afin de connaître les distances entre les villes. Ces
nouvelles spécifications sont présentées sous la forme d'un package complémentaire. Effectuez le passage au
relationnel de ce schéma (n'ajoutez que ce qui est nouveau). Expliquez ce que permet la clé locale nom de
trajet.
Puis, donnez tous les droits sur l'ensemble du schéma à un utilisateur Admin, et les droits en lecture sur
l'ensemble du schéma à tous les utilisateurs de la base.
Elle dispose par ailleurs d'un fichier client avec les prestations effectivement vendues, à des prix
éventuellement négociés en dessous du prix public. Ces données ne sont accessibles qu'à l'utilisateur "Gerant".
Le schéma UML ci-dessous représente le problème posé. On notera que Code et Numéro sont deux clés
naturelles préalablement identifiées (mais il peut y avoir d'autres clés non encore identifiées). le niveau de
prestation correspond au nombre d'étoiles de 1 à 5.
Analyser la relation d'héritage et proposer la meilleure solution pour le passage au modèle relationnel.
4
Exercice : Cuisine italienne
Écrire en algèbre relationnelle la ou les vues induites par la transformation de la relation d'héritage.
Noter que l'intitulé d'une prestation est unique et toujours renseigné d'une part ; et que le niveau de la
prestation (nombre d'étoiles), le lieu ainsi le type de logement (hôtel, location ou gîte) permettent de
déterminer le prix public d'autre part.
Préciser pourquoi le fait que les prix pratiqués peuvent être négociés en dessous du prix public permet
d'écarter la DF Prestation Prix dans la relation Achete.
Énoncer pour chaque relation du schéma la liste des clés et des DF*.
En quelle forme normale est le schéma relationnel ? Justifier avec précision. Le schéma est-il redondant ? Si
oui donner un exemple, sinon expliquer pourquoi.
Écrivez les instructions SQL LDD* permettant de créer la base de données PostgreSQL correspondant au
schéma relationnel.
Indice :
Pour la gestion des BLOB*, on s'inspirera du code ci-dessous valide sous PostgreSQL :
Afin d'assurer la confidentialité du système écrivez les instructions SQL LCD* adaptées.
5
Exercice : Le chemin à l'envers
Informations extraites du document de synthèse fourni par les étudiants : « Une table est caractérisée par un
numéro et possède toujours une capacité maximale théorique et un type. Un client, en réalité celui qui paye
l'addition, possède un nom, un prénom et une date de naissance et peut avoir en plus une adresse courriel ou un
numéro de téléphone (tous les deux facultatifs). Un ticket concerne un client, et chaque ticket possède un numéro
unique et toujours renseigné, un nombre de couvert et le montant de l'addition réglé. Nous n'avons pas utilisé la
date du ticket comme clé primaire car il est possible d'avoir la génération de deux tickets exactement au même
moment. Un met est une entrée, un plat ou un dessert ; et il possède un prix. »
« NB : Un attribut supplément dans la classe table permet de faire payer un potentiel supplément en fonction du
type de table (petite terrasse, grande terrasse, etc.). »
Proposez un modèle logique de données en relationnel à partir de l'UML, en ajoutant éventuellement des clés
artificielles lorsque c'est utile, et en explicitant la solution adoptée pour transformer l'héritage.
Écrivez en algèbre relationnelle la ou les vues induites par la transformation de la relation d'héritage.
Énoncez pour chaque relation du schéma la liste des DF sous la forme d'une fermeture transitive.
Ce MLD est-il en 3FN ? Si oui, justifiez précisément ; sinon proposez une solution pour respecter la troisième
forme normale.
Écrivez les instructions SQL LDD permettant de créer la base de données PostgreSQL correspondant au
modèle en 3NF.
6
Exercice : Le chemin à l'envers
On notera que, selon ce modèle, le conjoint d'une femme ou d'un homme est un homme ou une femme ; que
X est conjoint de Y n'implique pas que Y est conjoint de X ; et que X peut être conjoint de X.
Quel attribut est la clé primaire de t_personnes ? Comment appelle-t-on ce genre de clé ? Quel est le statut de
numss ? Quel est le statut de conjoint ?
Expliquez pourquoi si conjoint référence la table t_personnes, alors son domaine n'est pas correct.
Modifiez le domaine de conjoint, puis ajoutez une contrainte à la table t_personnes pour que conjoint
soit une clé étrangère vers t_personnes, en s'assurant que les contraintes d'intégrité référentielles seront
respectées. Vous utiliserez pour cela deux instructions ALTER.
7
Exercice : Zéro Faute
Énoncez les DF du modèle relationnel sous-jacent à cette implémentation (en se fondant sur la vraisemblance)
sous la forme d'une couverture minimale des DFE.
À partir de la couverture minimale des DFE, prouvez que ce schéma est en 2NF, mais pas en 3NF.
Proposez un programme SQL permettant de décomposer le schéma de cette BD afin qu'il soit en 3NF, sans
perdre d'information, sans perdre de DF et sans perdre les données déjà existantes dans la BD.
Pour ce faire vous utiliserez une instruction CREATE TABLE permettant de créer la nouvelle table engendrée
par la décomposition, puis une instruction INSERT permettant d'initialiser correctement cette nouvelle table
avec les valeurs existantes dans t_personnes, et enfin deux instructions ALTER pour modifier la table
t_personne de façon à en supprimer la redondance et à établir la référence à la nouvelle table.
En UML, rétro-concevez le MCD qui aurait permis d'arriver directement à votre modèle après normalisation.
Justifiez.
On notera la présence des vues dans le schéma initial de la BD et l'on ne reportera pas sur ce schéma les clés
artificielles.
Écrivez une requête qui compte le nombre de personnes qui ont le même chanteur préféré que leur conjoint.
On notera que cette requête est équivalente sur le schéma avant ou après normalisation.
- Pour chaque modèle, on veut gérer son code constitué de 8 caractères alphanumériques, son nom et la
date de mise sur le marché.
- Pour chaque produit, on veut connaître le modèle associé, le numéro de série (6 chiffres) et le numéro de
produit (max. 4 caractères) ainsi que l'année de production. Un produit est identifié par son numéro de
série et son numéro de produit.
Plusieurs produits partagent le même numéro de série (tous les produits de cette série), et deux
produits peuvent avoir (par hasard) le même numéro de produit, dans des séries différentes (qui ont
adopté le même système de codage des produits).
8
Exercice : Cars
- Une faute concerne toujours un produit. Elle possède un code unique, un titre et la date de détection. Elle
peut éventuellement avoir un commentaire et la date de réparation si le produit a été réparé.
- Les fautes sont classifiées dans des sous-catégories et chaque sous-catégorie fait partie d'une catégorie.
Une faute est toujours classifiée dans une sous-catégorie au moins (elle peut être classifiée dans
plusieurs).
- Les catégories et les sous-catégories possèdent un nom et, optionnellement, une description.
Proposez un modèle relationnel en 3NF basé sur votre modèle UML. Justifiez les choix que vous faites
(transformation des héritages, associations 1-1...).
Écrivez le code SQL LDD permettant de créer la base de données correspondant au modèle relationnel.
Écrivez une requête SQL permettant de lister le nombre de fautes par nom de modèle et par numéro de série.
6. Exercice : Cars
[45 min]
Soit la base de données définie par le code SQL LDD ci-après.
9
Exercice : Cars
Écrire une requête (en algèbre relationnel et en SQL) permettant de trouver les véhicules dont le modèle
commence par la lettre C.
Écrire une requête (en algèbre relationnel et en SQL) permettant de trouver tous les véhicules n'ayant pas de
propriétaire.
Écrire une requête (en SQL) permettant de trouver les personnes possédant au moins une voiture noire, trié par
ordre alphabétique.
10
Questions en question
Écrire une requête (en SQL) permettant de lister les personnes qui possèdent au minimum deux véhicules, par
nombre décroissant de voitures.
7. Questions en question
Schéma UML Q
Deux questions peuvent avoir un même numéro number au sein d'un même questionnaire.
Deux questions peuvent avoir un même numéro number au sein de deux questionnaires différents.
11
Exercice : Collaboration
Question 2
Énoncer la fermeture transitive des dépendances fonctionnelles. En déduire la forme normale respectée (en
justifiant). Normaliser le schéma en 3NF.
Indice :
On cherchera à implémenter toutes les contraintes spécifiées au niveau conceptuel.
Un second concepteur, identifié comme adam dans PosgreSQL, souhaite exécuter des requêtes de type SELECT
dans la base de données. Donner les droits d'interroger toutes les tables et vues à l'utilisateur adam.
GRANT ;
GRANT ;
GRANT ;
GRANT ;
12
Exercice : Questions
Créer en SQL la vue v_questionnaire permettant d'afficher tous les questionnaires avec leurs questions
sous la forme suivante.
...
Indice :
Les questions d'un même questionnaire doivent se suivre et être dans l'ordre croissant de leur numéro
number.
Écrire en algèbre relationnel et en SQL la requête permettant d'afficher toutes les questions avec les logins des
utilisateurs qui y ont répondu et leur réponse.
...
...
13
Exercice : Évolution du schéma
Écrivez en SQL la requête permettant d'obtenir la moyenne pour chaque question de la base de données. [1pt]
...
Modifier la base de données, à l'aide d'une seule instruction SQL LDD, pour ajouter la clé candidate description
de type varchar à la table questionnaire.
14
Devoir
Devoir
II
1. Exercice : La Poste
[45 min]
Des ingénieurs de La Poste ont conçu un MCD en UML dans le but de créer une base de données leur
permettant de recueillir des statistiques sur les courriers acheminés.
Pour chaque courrier, on enregistre l'adresse (rue et numéro uniquement) du destinataire (obligatoire) et de
l'émetteur (facultative) ainsi que le type (lettre ou colis). Un suivi peut être effectué pour savoir quand le
courrier a été envoyé et reçu.
Chaque adresse est gérée par un bureau de poste identifié par un code postal. Les bureaux de poste sont reliés
à des centres de tri qui jouent le rôle d'intermédiaire dans l'acheminement des courriers entre bureaux de
poste. Un acheminement entre un centre de tri et un bureau de poste est réalisé, dans les deux sens possibles,
par un ou plusieurs types de transport (voiture, train, avion...). À chaque type de transport correspond une
valeur de taxe carbone.
Question 1
Traduisez ce MCD en langage relationnel, en spécifiant les clés (candidates, primaires et étrangères) ainsi que
les contraintes (unicité, non-nullité, etc.). Il n'est pas demandé de préciser le type des attributs.
Justifiez les choix que vous faites. Faites des hypothèses si nécessaire.
15
Exercice : La Poste
Question 2
Écrivez les instructions SQL pour créer les tables des relations correspondant uniquement aux classes
BureauDePoste, CentreDeTri et Acheminement.
Question 3
Déterminez en quelle forme normale est le schéma que vous avez posé, et faites les éventuelles modifications
nécessaires pour atteindre la 3NF. Justifiez.
16
Solutions des exercices
Clé
Une clé est un groupe d'attributs minimal qui détermine tous les attributs de la relation.
La réflexivité et la transitivité sont utilisées à chaque fois de la même façon, par exemple, pour le premier :
NF
La relation est en 1NF, on a identifié une clé et les attributs sont atomiques. Elle n'est pas en 2NF car des
attributs faisant partie de la clé déterminent d'autres attributs, par exemple : numAuteur → nomAuteur.
17
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
18
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
L'héritage est complet et exclusif, la classe mère est abstraite. Les deux solutions de transformation par la classe
mère et pas les classes filles sont possibles, mais l'héritage par la classe mère est beaucoup plus simple dans ce
cas (solution à 3 tables seulement).
Si les prix sont fixes pour tous les clients, alors Prestation Prix dans la relation Achete. Mais comme
les prix peuvent être négociés pour chaque client, il faut connaître la prestation et le client pour connaître le
prix. Par exemple si le prix public est de 100 et que le client2 a eu 10% de remise alors on obtient dans la
relation Achete : (client1, prestat1, 100) ; (client2, prestat1, 90).
Le schéma est en 1NF car toutes les relations ont au moins 1 clé et tous les attributs sont atomiques.
- Pour Prestations et Clients, les clés (code), (intitule), (numero) sont composées d'un seul attribut
- Pour Achete, prix ne dépend pas de Clients ou Prestations seulement (car le prix peut être négocié par le
client pour chaque prestation donc Prestations ne détermine pas prix).
19
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
Le schéma n'est pas en 3NF car (niveau, lieu, type) prix, donc il existe une DFE* vers un
attribut n'appartenant pas à une clé qui n'est pas issue d'une clé.
1. Héritage exclusif
2. Héritage complet
3.
20
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
On choisit l'héritage par classe mère pour des raisons de simplicité : 2 tables contre 6 à cause de l'association N:
M.
Remarque
Les types non précisés sont ceux du diagramme UML.
Table
Client
Ticket
Met
Le modèle n'est pas en 3NF, car un attribut non clé (supplement) est déterminé par un autre attribut non clé (
type).
- Type_Table(#type, supplement)
- Table (#numero, nbCouvert, type=>type_table)
21
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
La clé primaire de t_personnes est pk_n, c'est une clé artificielle. numss est une clé candidate car elle est
unique pour chaque enregistrement et non nulle. conjoint n'est pas une clé, car l'attribut peut être nul.
Le domaine de conjoint doit être celui de la clé primaire de t_personne, donc INTEGER.
22
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
Complément
Sous PostgreSQL, il n'est pas possible de modifier le type d'une colonne utilisé dans une vue ou une règle, il
faut donc commencer par supprimer les vues avant d'effectuer la modification. Il suffit de recréer les vues par
la suite.
De même, le passage d'un type CHAR ou VARCHAR vers INTEGER n'est pas possible sans utiliser le
transtypage qui décrit comment devra être transformé le contenu de la colonne en cours de transformation. En
précisant que la conversion est effectuée vers un entier, la modification devient possible.
- pk_n numss
- pk_n nom
- pk_n prenom
- pk_n sexe
- pk_n conjoint
- pk_n chanteur_prefere
- numss pk_n
- chanteur_prefere nationalite_chanteur_prefere
Le schéma est en 1NF puisqu'il y a une clé et que les valeurs sont atomiques.
Le schéma est en 2NF puisqu'il n'existe pas d'attribut dépendant d'une partie seulement d'une clé. Tout schéma
dont les clés ne sont composés que d'un seul attribut est en 2NF.
23
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
Modèle UML
On notera que les vues sont le résultat d'une association d'héritage ; et que l'association conjoint est une relation
1:1 classique (grâce à la clause d'unicité sur la clé étrangère), et donc (malgré la non conformité avec la réalité) :
si A a pour conjoint B, alors B n'a pas forcément pour conjoint A et A peut être conjoint de A.
MCD
24
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
MLD
Justification de la 3NF
1. 1NF : toutes les relations ont une clé et chaque attribut est atomique.
2. 2NF :
- Modèle, SurCatégorie, SousCatégorie et Faute ont des clés constituées d'un seul
attribut ;
- ClassementFaute ne comporte pas d'attribut en dehors de la clé ;
- dans Produit, il n'existe pas de dépendance fonctionnelle de numSérie vers
annéeProduction ou modèle, ou les deux, idem pour numProduit.
3. 3NF : dans les relations Modèle, Produit et Faute, il n'existe pas de dépendance fonctionnelle
entre attributs ou groupe d'attributs en dehors de la clé.
25
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
26
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
Attention
Bien que le numéro de produit ne participe pas à la projection (SELECT) ni au regroupement (GROUP BY), il
ne faut pas oublier la jointure entre tProduit.numProduit et tFaute.produitNumero.
Exemple de données
modele → marque
27
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
pk_modele → marque
Toutes les DFE sont du type k → a (avec k clé), on est donc en BCNF.
Modèle UML
1 SELECT *
2 FROM Voiture
3 WHERE modele LIKE 'C%';
1 SELECT pk_immatriculation
2 FROM Voiture
3 WHERE V.fk_proprietaire IS NULL;
28
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
Deux questions peuvent avoir un même numéro number au sein d'un même questionnaire.
Deux questions peuvent avoir un même numéro number au sein de deux questionnaires différents.
1 Questionnaire(#name)
2 Question(#questionnaire=>Questionnaire, #number, label)
3 User(#login)
4 Answer(#questionnaire=>Questionnaire, #question=>Question, #user=>User, value,
comment)
29
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Solutions des exercices
25 );
Un second concepteur, identifié comme adam dans PosgreSQL, souhaite exécuter des requêtes de type SELECT
dans la base de données. Donner les droits d'interroger toutes les tables et vues à l'utilisateur adam.
1 Projection (
2 Jointure (answer, question, question=number AND questionnaire=questionnaire),
3 number,label,login,value)
Modifier la base de données, à l'aide d'une seule instruction SQL LDD, pour ajouter la clé candidate description
de type varchar à la table questionnaire.
30
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)
Signification des abréviations
Abréviations
BLOB : Binary Large Object
DF : Dépendance Fonctionnelle
31
Stéphane Crozat (Contributions : Antoine Vincent, Dritan Nace)