Chapitre 1417 minIntermédiaire
Exercices Merise corrigés : MCD et MLD de cas complets
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- construire le MCD complet d'un cas réaliste ;
- en déduire le MLD et compter ses tables ;
- partir d'un document pour modéliser ;
- repérer les contraintes que le schéma ne garantit pas.
4 exercices corrigés
Ce chapitre rassemble quatre cas complets, du niveau d'un devoir de BTS ou d'une question d'examen : une société de services informatiques, une salle de sport, des notes de frais et une agence de location. Chacun part de règles de gestion et demande le MCD, puis le MLD, avec les questions de réflexion qui font la différence. Les corrigés donnent le MCD sous forme de listes (entités, puis associations avec leurs cardinalités), le MLD au format des sujets et les justifications des choix délicats.
Comment travailler. Pour chaque cas, prends 30 à 45 minutes. Dessine le MCD sur papier, écris le MLD, puis compare avec le corrigé en vérifiant d'abord les cardinalités et l'emplacement des clés étrangères : ce sont les points qui rapportent ou coûtent le plus. Une variante défendable de ta part n'est pas une erreur, si tu peux la justifier par une règle de gestion.
Cas 1 : l'assistance d'une société de services informatiques
Exercice 1 sur 4 Le centre d'assistance d'une ESN Réussi À revoir
Une entreprise de services du numérique (ESN) assure l'assistance informatique de PME. Elle veut une base pour son centre d'assistance.
-
RG1. L'ESN gère des clients : numéro, raison sociale, ville.
-
RG2. Chaque client a un ou plusieurs contacts (numéro, nom, prénom, téléphone, adresse électronique) ; un contact travaille pour un seul client.
-
RG3. L'ESN suit le matériel de ses clients : numéro de série, type, modèle, date de mise en service. Un matériel appartient à un seul client ; un client peut n'avoir aucun matériel suivi.
-
RG4. Un ticket (numéro, date et heure d'ouverture, titre, description, priorité, statut) est ouvert par un seul contact. Il peut concerner un matériel, au plus un.
-
RG5. Un ticket est affecté à un technicien au plus ; tant qu'il ne l'est pas, il est en attente. Un technicien traite plusieurs tickets.
-
RG6. Les interventions sur un ticket sont numérotées 1, 2, 3… dans le ticket. Chacune a une date, une durée en minutes et un compte rendu, et elle est réalisée par un seul technicien, pas forcément celui à qui le ticket est affecté.
-
RG7. Un technicien (matricule, nom, prénom) possède des compétences (code, libellé : Windows Server, réseau, Microsoft 365…), chacune avec un niveau de 1 à 3.
-
RG8. Chaque technicien débutant est suivi par un technicien référent. Un référent suit plusieurs débutants.
- Construis le MCD.
- Écris le MLD et compte ses tables et ses clés étrangères.
- Rien dans le schéma n'empêche d'associer à un ticket un matériel qui appartient à un autre client que celui du contact. Comment le garantir ?
Voir la réponseMasquer la réponse de l'exercice 1
1. Le MCD. Sept entités :
- CLIENT (num_client, raison_sociale, ville)
- CONTACT (num_contact, nom_contact, prenom_contact, tel_contact, email_contact)
- MATERIEL (num_serie, type_materiel, modele, date_mise_service)
- TICKET (num_ticket, date_ouverture, titre, description, priorite, statut)
- INTERVENTION (num_intervention, date_intervention, duree_min, compte_rendu), identifiée relativement à TICKET
- TECHNICIEN (matricule, nom_tech, prenom_tech)
- COMPETENCE (code_competence, libelle_competence)
Neuf associations :
CONTACT 1,1 ── TRAVAILLER_POUR ── 1,n CLIENT(RG2 : un client a au moins un contact)MATERIEL 1,1 ── APPARTENIR ── 0,n CLIENT(RG3)TICKET 1,1 ── OUVRIR ── 0,n CONTACT(RG4)TICKET 0,1 ── CONCERNER ── 0,n MATERIEL(RG4 : « au plus un »)TICKET 0,1 ── ETRE_AFFECTE ── 0,n TECHNICIEN(RG5 : 0 tant qu'il est en attente)INTERVENTION (1,1) ── COMPOSER ── 0,n TICKET(RG6 : identifiant relatif, un ticket neuf n'a aucune intervention)INTERVENTION 1,1 ── REALISER ── 0,n TECHNICIEN(RG6)TECHNICIEN 0,n ── POSSEDER (niveau) ── 0,n COMPETENCE(RG7 : le niveau dépend du couple)TECHNICIEN (débutant) 0,1 ── SUIVRE ── 0,n TECHNICIEN (référent)(RG8, réflexive)
Deux associations relient TICKET et TECHNICIEN, directement (l'affectation) et par INTERVENTION (qui a vraiment travaillé) : elles n'ont pas le même sens, il faut les garder toutes les deux.
2. Le MLD.
- client (num_client, raison_sociale, ville)
- contact (num_contact, nom_contact, prenom_contact, tel_contact, email_contact, #num_client)
- materiel (num_serie, type_materiel, modele, date_mise_service, #num_client)
- technicien (matricule, nom_tech, prenom_tech, #matricule_referent)
- competence (code_competence, libelle_competence)
- posseder (#matricule, #code_competence, niveau)
- ticket (num_ticket, date_ouverture, titre, description, priorite, statut, #num_contact, #num_serie, #matricule_affecte)
- intervention (#num_ticket, num_intervention, date_intervention, duree_min, compte_rendu, #matricule)
8 tables (7 entités et l'association POSSEDER) et 10 clés étrangères : 1 dans contact, 1 dans materiel, 1 dans technicien (la réflexive), 2 dans posseder, 3 dans ticket, 2 dans intervention. num_serie et matricule_affecte sont facultatives dans ticket (cardinalités 0,1), comme matricule_referent dans technicien. Le niveau de compétence se contrôle par CHECK (niveau BETWEEN 1 AND 3).
3. La cohérence client. C'est une contrainte qui suit deux chemins (ticket → contact → client et ticket → matériel → client) : aucune clé étrangère ne l'exprime. On la garantit par un trigger BEFORE INSERT et BEFORE UPDATE sur ticket, qui compare les deux clients et refuse l'opération s'ils diffèrent, ou par un contrôle dans l'application. Dans une copie, nommer la contrainte et le moyen de la faire respecter rapporte des points ; c'est le genre de remarque que l'E7 attend.
Tu avais trouvé ?
Cas 2 : la salle de sport
Exercice 2 sur 4 Les cours collectifs d'une salle de sport Réussi À revoir
Une salle de sport veut gérer ses abonnements et ses cours collectifs.
-
RG1. Un adhérent a un numéro, un nom, un prénom, une date de naissance et une adresse électronique.
-
RG2. La salle propose des formules (code, libellé : mensuelle, annuelle, étudiante). Le prix mensuel d'une formule change dans le temps ; on garde chaque tarif avec sa date d'entrée en vigueur, pour facturer chaque mois au bon prix.
-
RG3. Un abonnement (numéro, date de début, date de fin) est souscrit par un adhérent, pour une formule. Un adhérent peut souscrire plusieurs abonnements successifs, éventuellement à la même formule.
-
RG4. Les cours sont de différents types (code, libellé, durée en minutes) : yoga, cross-training, cycling…
-
RG5. Une séance (numéro, date et heure, nombre de places) est d'un seul type, a lieu dans une seule salle (code, nom, capacité) et est animée par un seul coach (matricule, nom, prénom).
-
RG6. Un coach n'anime que les types de cours pour lesquels il est habilité, au moins un ; on note la date de chaque habilitation.
-
RG7. Un adhérent réserve des séances ; on note la date de la réservation et, après la séance, s'il était présent.
-
RG8. Le nombre de places d'une séance ne dépasse pas la capacité de sa salle, et le nombre de réservations ne dépasse pas le nombre de places.
- Construis le MCD.
- Écris le MLD.
- Comment la base peut-elle garantir la RG6 ? Et la RG8 ?
- Écris la requête qui donne le prix mensuel de la formule
MENSapplicable au 15 novembre 2026.
Voir la réponseMasquer la réponse de l'exercice 2
1. Le MCD. Huit entités :
- ADHERENT (num_adherent, nom, prenom, date_naissance, email)
- FORMULE (code_formule, libelle_formule)
- TARIF (date_debut_tarif, prix_mensuel), identifiée relativement à FORMULE
- ABONNEMENT (num_abonnement, date_debut, date_fin)
- TYPE_COURS (code_type, libelle_type, duree_min)
- SALLE (code_salle, nom_salle, capacite)
- COACH (matricule, nom_coach, prenom_coach)
- SEANCE (num_seance, date_heure, nb_places)
Les associations :
TARIF (1,1) ── FIXER ── 1,n FORMULE: historisation du prix (RG2) ; une formule a au moins un tarifABONNEMENT 1,1 ── SOUSCRIRE ── 0,n ADHERENTetABONNEMENT 1,1 ── PORTER_SUR ── 0,n FORMULE: ABONNEMENT est une entité, car un adhérent peut reprendre la même formule (RG3)SEANCE 1,1 ── ETRE_DE_TYPE ── 0,n TYPE_COURS,SEANCE 1,1 ── SE_DEROULER ── 0,n SALLE,SEANCE 1,1 ── ANIMER ── 0,n COACH(RG5)COACH 1,n ── ETRE_HABILITE (date_habilitation) ── 0,n TYPE_COURS(RG6)ADHERENT 0,n ── RESERVER (date_reservation, present) ── 0,n SEANCE(RG7)
Il existe aussi une contrainte d'inclusion : le couple (coach, type) d'une séance doit figurer dans ETRE_HABILITE.
2. Le MLD.
- adherent (num_adherent, nom, prenom, date_naissance, email)
- formule (code_formule, libelle_formule)
- tarif (#code_formule, date_debut_tarif, prix_mensuel)
- abonnement (num_abonnement, date_debut, date_fin, #num_adherent, #code_formule)
- type_cours (code_type, libelle_type, duree_min)
- salle (code_salle, nom_salle, capacite)
- coach (matricule, nom_coach, prenom_coach)
- etre_habilite (#matricule, #code_type, date_habilitation)
- seance (num_seance, date_heure, nb_places, #code_type, #code_salle, #matricule)
- reserver (#num_adherent, #num_seance, date_reservation, present)
Dix tables. present reste vide (NULL) tant que la séance n'a pas eu lieu.
3. Les contraintes. La RG6 se garantit par une clé étrangère composée : dans seance, le couple (matricule, code_type) référence la clé primaire d'etre_habilite. Une séance ne peut alors être confiée qu'à un coach habilité pour son type, sans aucun trigger. La RG8 compare des valeurs de plusieurs tables (nb_places et capacite) et compte des lignes (les réservations) : aucune contrainte CHECK ne le permet, il faut des triggers sur seance et sur reserver, ou un contrôle dans l'application.
4. Le tarif applicable. C'est la ligne de la formule dont la date d'entrée en vigueur est la plus récente sans dépasser la date voulue :
SELECT prix_mensuel
FROM tarif
WHERE code_formule = 'MENS'
AND date_debut_tarif <= '2026-11-15'
ORDER BY date_debut_tarif DESC
LIMIT 1;
Tu avais trouvé ?
Cas 3 : des notes de frais, à partir d'un document
Exercice 3 sur 4 La fiche de frais d'un laboratoire Réussi À revoir
Les visiteurs médicaux d'un laboratoire pharmaceutique déclarent leurs frais chaque mois sur une fiche. Voici une fiche remplie :
FICHE DE FRAIS - octobre 2026
Visiteur : v042 - MOREAU Camille
État : clôturée (CL) Dernière modification : 02/11/2026
Frais forfaitisés
ETP Forfait étape 110,00 € x 3
KM Frais kilométriques 0,62 € x 420
NUI Nuitée hôtel 80,00 € x 2
REP Repas restaurant 25,00 € x 5
Frais hors forfait
12/10/2026 Achat de fleurs pour un salon 45,00 €
21/10/2026 Location de salle 210,00 €
Justificatifs fournis : 2 Total déclaré : 1 130,40 €
Montant validé : (en attente)
Règles : un visiteur a une seule fiche par mois ; les quatre frais forfaitisés et leur montant unitaire sont les mêmes pour tous les visiteurs ; une fiche peut comporter zéro, une ou plusieurs lignes hors forfait ; l'état d'une fiche fait partie d'une liste (créée, clôturée, validée, remboursée).
- Quelles données sont calculées ? Vérifie le total déclaré.
- Écris les dépendances fonctionnelles.
- Construis le MCD, puis le MLD.
Voir la réponseMasquer la réponse de l'exercice 3
1. Les données calculées. Le montant de chaque ligne forfaitisée (quantité × montant unitaire) et le total déclaré. Vérification : 3 × 110,00 = 330,00 ; 420 × 0,62 = 260,40 ; 2 × 80,00 = 160,00 ; 5 × 25,00 = 125,00 ; soit 875,40 € de frais forfaitisés, plus 45,00 + 210,00 = 255,00 € hors forfait : 1 130,40 €. On ne le stocke pas. Le montant validé, lui, est saisi par le comptable (il peut différer du total déclaré) : c'est une donnée élémentaire.
2. Les DF.
id_visiteur → nom_visiteur, prenom_visiteur
id_etat → libelle_etat
id_frais → libelle_frais, montant_unitaire
(id_visiteur, mois) → nb_justificatifs, montant_valide, date_modif, id_etat
(id_visiteur, mois, id_frais) → quantite
num_ligne → date_frais, libelle_hf, montant_hf, id_visiteur, mois
La fiche est déterminée par le couple (visiteur, mois) : c'est la règle « une seule fiche par mois ».
3. Le MCD.
-
VISITEUR (id_visiteur, nom_visiteur, prenom_visiteur)
-
FICHE_FRAIS (mois, nb_justificatifs, montant_valide, date_modif), identifiée relativement à VISITEUR
-
ETAT (id_etat, libelle_etat)
-
FRAIS_FORFAIT (id_frais, libelle_frais, montant_unitaire)
-
LIGNE_HORS_FORFAIT (num_ligne, date_frais, libelle_hf, montant_hf)
-
FICHE_FRAIS (1,1) ── DECLARER ── 0,n VISITEUR -
FICHE_FRAIS 1,1 ── ETRE_DANS ── 0,n ETAT -
FICHE_FRAIS 0,n ── COMPORTER (quantite) ── 0,n FRAIS_FORFAIT -
LIGNE_HORS_FORFAIT 1,1 ── FIGURER ── 0,n FICHE_FRAIS
Le MLD.
- visiteur (id_visiteur, nom_visiteur, prenom_visiteur)
- etat (id_etat, libelle_etat)
- fiche_frais (#id_visiteur, mois, nb_justificatifs, montant_valide, date_modif, #id_etat)
- frais_forfait (id_frais, libelle_frais, montant_unitaire)
- ligne_frais_forfait (#id_visiteur, #mois, #id_frais, quantite)
- ligne_hors_forfait (num_ligne, date_frais, libelle_hf, montant_hf, #id_visiteur, #mois)
Point délicat : dans ligne_frais_forfait et ligne_hors_forfait, le couple (id_visiteur, mois) forme une seule clé étrangère composée, qui référence la clé primaire de fiche_frais. En SQL : FOREIGN KEY (id_visiteur, mois) REFERENCES fiche_frais (id_visiteur, mois). Deux clés étrangères séparées ne garantiraient pas que la fiche existe.
Remarque : le montant unitaire des frais forfaitisés change parfois (le barème kilométrique, par exemple). Pour qu'une ancienne fiche garde son montant, il faudrait historiser ce montant ou le recopier dans ligne_frais_forfait au moment de la clôture (chapitre 7).
Tu avais trouvé ?
Cas 4 : l'agence de location de véhicules
Exercice 4 sur 4 Une agence de location Réussi À revoir
Une enseigne de location de véhicules veut une base commune à ses agences.
-
RG1. Un véhicule (immatriculation, date de mise en circulation, kilométrage actuel) est d'un seul modèle (code, marque, désignation, nombre de places). L'enseigne possède plusieurs véhicules de chaque modèle.
-
RG2. Chaque véhicule est rattaché à une agence (code, ville).
-
RG3. Un client a un numéro, une adresse et un téléphone. C'est soit un particulier (nom, prénom, numéro de permis), soit une entreprise (SIRET, raison sociale), jamais les deux.
-
RG4. Une location (numéro, date de départ, date de retour prévue, date de retour effective, kilométrage au départ, kilométrage au retour) concerne un seul véhicule et un seul client. Elle part d'une agence et peut être rendue dans une autre ; l'agence de retour n'est connue qu'au retour.
-
RG5. Une location peut inclure des options (code, libellé, prix par jour : GPS, siège enfant, conducteur supplémentaire), en une certaine quantité.
- Construis le MCD. Où places-tu le nombre de places ?
- Écris le MLD.
- Écris le
CREATE TABLEde la tablelocation, avec ses contraintes.
Voir la réponseMasquer la réponse de l'exercice 4
1. Le MCD.
-
MODELE (code_modele, marque, designation, nb_places)
-
VEHICULE (immatriculation, date_mise_circulation, kilometrage)
-
AGENCE (code_agence, ville)
-
CLIENT (num_client, adresse, telephone), spécialisée en PARTICULIER (nom, prenom, num_permis) et ENTREPRISE (siret, raison_sociale), avec une contrainte de partition (XT)
-
LOCATION (num_location, date_depart, date_retour_prevue, date_retour, km_depart, km_retour)
-
OPTION_LOCATION (code_option, libelle_option, prix_jour)
-
VEHICULE 1,1 ── ETRE_DU_MODELE ── 0,n MODELE -
VEHICULE 1,1 ── RATTACHER ── 0,n AGENCE -
LOCATION 1,1 ── CONCERNER ── 0,n VEHICULE -
LOCATION 1,1 ── SOUSCRIRE ── 0,n CLIENT -
LOCATION 1,1 ── PARTIR_DE ── 0,n AGENCE -
LOCATION 0,1 ── ETRE_RENDUE_A ── 0,n AGENCE -
LOCATION 0,n ── INCLURE (quantite) ── 0,n OPTION_LOCATION
Le nombre de places dépend du modèle, pas du véhicule : il va dans MODELE. C'est le piège « modèle et exemplaire » de ce cas, le même que le document et l'exemplaire de Rivelire. Le kilométrage actuel, lui, est propre à chaque véhicule.
2. Le MLD, avec l'héritage traduit par une table par entité :
- modele (code_modele, marque, designation, nb_places)
- agence (code_agence, ville)
- vehicule (immatriculation, date_mise_circulation, kilometrage, #code_modele, #code_agence)
- client (num_client, adresse, telephone)
- particulier (#num_client, nom, prenom, num_permis)
- entreprise (#num_client, siret, raison_sociale)
- location (num_location, date_depart, date_retour_prevue, date_retour, km_depart, km_retour, #immatriculation, #num_client, #code_agence_depart, #code_agence_retour)
- option_location (code_option, libelle_option, prix_jour)
- inclure (#num_location, #code_option, quantite)
Neuf tables et dix clés étrangères. Les deux associations entre LOCATION et AGENCE donnent deux clés étrangères de noms différents. La table s'appelle option_location et non option : OPTION est un mot réservé de MySQL.
3. La table location.
CREATE TABLE location (
num_location INT AUTO_INCREMENT PRIMARY KEY,
date_depart DATE NOT NULL,
date_retour_prevue DATE NOT NULL,
date_retour DATE,
km_depart INT NOT NULL,
km_retour INT,
immatriculation CHAR(9) NOT NULL,
num_client INT NOT NULL,
code_agence_depart CHAR(4) NOT NULL,
code_agence_retour CHAR(4),
CONSTRAINT chk_dates_location CHECK (date_retour_prevue >= date_depart
AND (date_retour IS NULL OR date_retour >= date_depart)),
CONSTRAINT chk_km CHECK (km_retour IS NULL OR km_retour >= km_depart),
CONSTRAINT chk_retour_complet CHECK ((date_retour IS NULL) = (km_retour IS NULL)
AND (km_retour IS NULL) = (code_agence_retour IS NULL)),
CONSTRAINT fk_location_vehicule FOREIGN KEY (immatriculation)
REFERENCES vehicule (immatriculation),
CONSTRAINT fk_location_client FOREIGN KEY (num_client)
REFERENCES client (num_client),
CONSTRAINT fk_location_agence_depart FOREIGN KEY (code_agence_depart)
REFERENCES agence (code_agence),
CONSTRAINT fk_location_agence_retour FOREIGN KEY (code_agence_retour)
REFERENCES agence (code_agence)
);
Une immatriculation au format actuel (AB-123-CD) compte 9 caractères. La contrainte chk_retour_complet est une simultanéité : la date, le kilométrage et l'agence de retour sont renseignés ensemble, au retour du véhicule. La partition des clients (particulier ou entreprise, jamais les deux) ne s'exprime pas dans cette table : elle demande un trigger sur particulier et entreprise, ou une colonne de type dans client.
Tu avais trouvé ?