Conception de bases de données relationelles - Examen (2h)
Cet examen est à faire seul·e. Copier le travail d’un·e autre étudiant·e entraînera des sanctions pour tous les étudiants impliqués.
Notez uniquement votre n° d’étudiant sur ces feuilles et insérez-les dans la copie anonymée, n’oubliez pas de compléter les informations de la copie anonymée.
Le barème est donné à titre indicatif.
1 - Questions générales - 4 points - 20 min
1.1 - Quelles sont les étapes de construction d’un schéma conceptuel ?
Listez brièvement les étapes, ne donnez pas de détails.
Solution
- Principe de décomposition d’un énoncé en propositions élémentaires
- Traduction de ces propositions en structures Entité-Association
- Intégration de ces structures dans le schéma en cours de construction
- Normalisation
- Validation
- Finalisation du schéma
- Contraintes d’intégrité
1.2 - Quels sont les 4 niveaux de conception d’une base de données ? Expliquer très brièvement chacun d’entre eux.
Solution
- Niveau Réel : Le monde réel
- Niveau Conceptuel : Schéma Entités-Associations. C’est le niveau réel représenté en associations, types d’entités, cardinalités (et potentiellement annotations, attributs et identifiants)
- Niveau Logique : Le niveau conceptuel détaillé, avec tous ses attributs et relations définis pour le niveau physique
- Niveau physique : La base de données dans le logiciel, physiquement sur le disque dur
1.3 - À quoi sert l’instruction SQL “GROUP BY” ? Comment peut-on poser des conditions sur un “GROUP BY” ?
Solution
Group by permet l’extraction de données groupées. On peut poser des conditions
sur un group by avec l’instruction HAVING
2 - Modélisation - 10 points - 1h
Énoncé :
Une société de commerce électronique souhaite mettre en place une base de données pour gérer ses opérations.
La société vend divers produits en ligne et souhaite suivre les informations concernant ses clients, commandes, produits, catégories de produits, fournisseurs, employés et avis clients.
La société doit pouvoir suivre les stocks de ses produits. Les commandes peuvent comporter plusieurs produits et sont gérées par des employés. Les avis sont effectués par client et par produit et sont composés d’un commentaire et d’une note allant de 1 à 5. Les fournisseurs fournissent des produits et un produit peut être fourni par plusieurs fournisseurs, avec des prix unitaires différents par fournisseur.
Vous êtes chargé de concevoir la base de données relationnelle pour cette société, en proposant des types d’entités, attributs, associations et cardinalités pertinents, présentant clairement le fonctionnement de la base de données.
2.1 - Décomposez cet énoncé. Précisez les cardinalités.
Vous pouvez, en plus de rédiger ci-dessous, souligner, surligner, entourer, etc. directement le texte de la page précédente.
Solution possible
Propositions élémentaires
- Un client peut passer plusieurs commandes.
- Une commande peut contenir plusieurs produits.
- Un produit peut apparaître dans plusieurs commandes.
- Un produit peut appartenir à plusieurs catégories.
- Un produit peut être fourni par plusieurs fournisseurs.
- Un fournisseur peut fournir plusieurs produits.
- Un client peut laisser plusieurs avis sur différents produits.
- Un produit peut avoir plusieurs avis.
- Un employé peut gérer plusieurs commandes.
- Un produit peut être fourni par plusieurs fournisseurs.
- Un fournisseur peut fournir plusieurs produits.
- Un produit peut avoir plusieurs prix unitaires différents selon le fournisseur.
Entités retenues
- Client
- Commande
- Produit
- Catégorie
- Fournisseur
- Employé
- Avis
- DétailCommande (table de jointure entre Commande et Produit)
- FournisseurProduit (table de jointure entre Produit et Fournisseur)
Cardinalités
- Un client peut passer plusieurs commandes (1,N).
- Une commande peut contenir plusieurs produits, et un produit peut apparaître dans plusieurs commandes (N,N via la table CommandeDetails).
- Un produit peut appartenir à plusieurs catégories (1,N).
- Un produit peut être fourni par plusieurs fournisseurs, et un fournisseur peut fournir plusieurs produits (N,N via une table FournisseurProduit).
- Un client peut laisser plusieurs avis sur différents produits, et chaque produit peut avoir plusieurs avis (N,N).
- Un employé peut gérer plusieurs commandes (1,N) (optionnel).
2.2 - Proposez un schéma EA de votre analyse
Prenez un moment pour étudier les requêtes et contraintes des parties 3 et 4 avant de finaliser votre conception. Vous pouvez utilisez votre notation préférée pour les cardinalités (1-N, 0-*, CrowFoot, etc.)
Solution possible

2.3 - Après passage de votre schéma EA en production, combien de tables contiendrait votre base de données ?
Solution
11 tables avec les tables de jointure créées pour les relations N-N.
3 - SQL - 3 points - 20 min
En fonction de votre modélisation de la partie 2, rédigez les requêtes SQL suivantes.
Pour les entités en relation N-N qui nécessite une table de jointure, on considérera que ces tables sont nommées de la sorte : table1_table2 ( table1_id, table2_id )
3.1 - Une requête qui affiche les informations des commandes, ainsi que les clients qui y sont rattachés et les produits commandés
Solution
SELECT * FROM Commande cINNER JOIN Client cl ON c.clientId = cl.clientIdINNER JOIN DetailCommande dc ON c.commandeId = dc.commandeIdINNER JOIN Produit p ON dc.produitId = p.produitId;
3.2 - La liste des clients ainsi que le nombre de commandes qu’ils ont effectuées et le total qu’ils ont dépensé.
Si un client n’a pas effectué de commande, on affiche 0
dans le nombre de commandes et le total dépensé.
Vous pouvez utiliser la fonction IFNULL(expression, alt_value), où alt_value sera affichée si expression renvoie null.
Solution
SELECT cl.clientId, cl.nom AS clientNom, cl.email AS clientEmail, cl.adresse AS clientAdresse, cl.telephone AS clientTelephone, COUNT(c.commandeId) AS nombreCommandes, IFNULL(SUM(dc.quantite * dc.prixUnitaire), 0) AS totalDepenseFROM Client clLEFT JOIN Commande c ON cl.clientId = c.clientIdLEFT JOIN DetailCommande dc ON c.commandeId = dc.commandeIdGROUP BY cl.clientId, cl.nom, cl.email, cl.adresse, cl.telephoneORDER BY cl.clientId;
3.3 - Une requête qui affiche les 10 produits les mieux notés
Solution
SELECT p.produitId, p.nomProduit, p.description, p.prix, AVG(a.note) AS noteMoyenneFROM Produit pINNER JOIN Avis a ON p.produitId = a.produitIdGROUP BY p.produitId, p.nomProduit, p.description, p.prixORDER BY noteMoyenne DESCLIMIT 10;
4 - Contrainte - 3 points - 20 min
4.1 - Un client ne peut pas laisser d’avis sur un produit qu’il n’a pas commandé.
En fonction de votre modélisation de la partie 2, rédigez un trigger qui permet de vérifier cette contrainte.
Solution possible
DELIMITER //
CREATE TRIGGER before_insert_avisBEFORE INSERT ON AvisFOR EACH ROWBEGIN DECLARE num_orders INT;
-- Compter le nombre de commandes du produit par le client SELECT COUNT(*) INTO num_orders FROM Commande c INNER JOIN DetailCommande dc ON c.commandeId = dc.commandeId WHERE c.clientId = NEW.clientId AND dc.produitId = NEW.produitId;
-- Si le client n'a pas commandé le produit, lever une erreur IF num_orders = 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Le client ne peut pas laisser un avis sur un produit qu''il n''a pas commandé.'; END IF;END;
//
DELIMITER ;