Chapitre 1316 minIntermédiaire
Merise à l'examen : E6 et E7 SLAM
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- repérer où la modélisation tombe à l'E6 et à l'E7 ;
- lire un schéma relationnel d'annale comme un MCD ;
- faire évoluer un schéma avec une méthode en cinq temps ;
- rédiger une réponse claire et justifiée sur papier.
3 exercices corrigés
Au BTS SIO SLAM, la modélisation des données est évaluée dans deux épreuves : l'E6, où tu présentes et fais évoluer la base de tes propres réalisations, et l'E7, l'écrit de cybersécurité, où le sujet te fournit un schéma relationnel à lire, à compléter ou à faire évoluer. Les deux épreuves demandent rarement un MCD complet à partir de rien ; elles demandent surtout de comprendre un schéma existant et de le faire évoluer juste. Ce chapitre donne la méthode pour chaque situation, les pièges qui coûtent des points et une checklist finale.
Où la modélisation tombe
À l'E6 SLAM (oral, bloc 2), la modélisation apparaît à trois moments. Dans ton dossier, les éléments techniques de chaque réalisation montrent son MCD ou son MLD. Pendant l'heure de réalisation, l'expression des besoins te demande presque toujours de toucher aux données : une table à ajouter, une association à transformer, une contrainte à poser. Pendant la recette, la commission vérifie que la modélisation est mise à jour et te demande de justifier tes choix. Le déroulement complet et les évolutions types sont dans le cours Épreuve E6 SLAM.
À l'E7 SLAM (écrit de 4 heures, bloc 3), le dossier documentaire contient presque toujours un schéma relationnel. La plupart des questions s'en servent pour écrire du SQL (requêtes, vues, droits, triggers), et une question au moins demande en général de faire évoluer le schéma. Dans les sujets récents :
| Session | Cas | Question de modélisation |
|---|---|---|
| 2023 (E6, U6) | Lama Zoo, un parc zoologique | Un modèle d'habilitations (A.4) |
| 2024 (E6, U6) | GSIC, un service d'incendie et de secours | Les rôles des comptes à ajouter au modèle de l'inventaire des habilitations (A2.2) |
| 2025 | Casterman, l'éditeur d'un progiciel | Une évolution de la base (B3.1) |
| 2025 (Nouvelle-Calédonie) | Kirassur | Un modèle de profils et d'alertes (C2.1) |
| 2026 | NDV | L'organisation « miroir » des rôles sur un contrat (A3.1) |
Ces questions portent souvent sur la sécurité : des rôles et des droits, un historique, des alertes. Jusqu'à la session 2024, cet écrit s'appelait E6 (U6) : les sujets 2022 à 2024 restent de bons entraînements. Le classement complet des questions par thème est dans le cours Épreuve E7 SLAM.
Lire un schéma relationnel d'annale
Les sujets écrivent le schéma en texte, avec les clés en toutes lettres :
Utilisateur (id, identifiant, empreinteMdp, dateCreation, idProfil)
Clé primaire : id
Clé étrangère : idProfil en référence à id de Profil
Profil (id, libelle)
Clé primaire : id
Permission (id, ressource, action)
Clé primaire : id
Accorder (idProfil, idPermission)
Clé primaire : (idProfil, idPermission)
Clé étrangère : idProfil en référence à id de Profil
Clé étrangère : idPermission en référence à id de Permission
Avant de répondre à quoi que ce soit, prends deux minutes pour le lire comme un MCD :
- Repère les tables d'association : celles dont la clé primaire est composée de clés étrangères. Ici,
Accorder, qui traduit une association plusieurs à plusieurs entre Profil et Permission. - Traduis chaque autre clé étrangère en phrase :
idProfildansUtilisateursignifie « un utilisateur a un seul profil ; un profil est attribué à plusieurs utilisateurs ». - Dessine les flèches en marge du sujet, de chaque clé étrangère vers sa table. C'est la carte des jointures dont tu auras besoin pour les requêtes.
- Note ce que le schéma interdit : un utilisateur ne peut pas avoir deux profils, un profil ne peut pas recevoir deux fois la même permission.
C'est la rétro-conception du chapitre 11, faite de tête. Elle évite la moitié des erreurs de jointure et prépare les questions d'évolution.
Faire évoluer un schéma : la méthode en cinq temps
Une question d'évolution donne un besoin nouveau, en français, et demande le schéma modifié, parfois le script SQL. Applique toujours les mêmes cinq temps.
- Souligne la règle nouvelle et reformule-la dans les deux sens, avec des quantités : « un utilisateur peut avoir plusieurs profils ; un profil est attribué à plusieurs utilisateurs ».
- Décide de la nature de l'évolution : une propriété de plus (une colonne), une entité de plus (une table), une association de plus ou modifiée (une clé étrangère ou une table), une historisation.
- Pose les cardinalités, comme dans un MCD.
- Traduis avec les règles de passage, en ne réécrivant que les tables créées ou modifiées, et en disant ce qui disparaît.
- Vérifie : les données existantes peuvent-elles être reprises ? Les requêtes existantes marchent-elles encore ? Une contrainte du sujet reste-t-elle à garantir par un trigger ?
Exemple 1 : interdire la réutilisation des anciens mots de passe. « L'application doit refuser un nouveau mot de passe identique à l'un des cinq précédents de l'utilisateur. »
- Règle : un utilisateur a plusieurs anciens mots de passe ; un ancien mot de passe appartient à un seul utilisateur.
- Nature : une nouvelle entité, l'ancien mot de passe, qui n'existe pas sans son utilisateur : une entité faible, historisée par la date de changement.
- Cardinalités :
ANCIEN_MDP (1,1) ── APPARTENIR ── 0,n UTILISATEUR. - Traduction :
HistoriqueMdp (idUtilisateur, dateChangement, empreinte)
Clé primaire : (idUtilisateur, dateChangement)
Clé étrangère : idUtilisateur en référence à id de Utilisateur
- Vérification : on stocke l'empreinte, jamais le mot de passe en clair ; la limite de cinq se gère dans le code ou par un trigger qui supprime les plus anciennes lignes.
dateChangementdoit être une date et une heure, pour qu'un utilisateur puisse changer deux fois de mot de passe dans la journée.
Exemple 2 : plusieurs profils par utilisateur, sur une période. « Un utilisateur peut désormais cumuler plusieurs profils, chacun attribué pour une période, avec une date de début et une date de fin facultative. »
- Règle : un utilisateur a zéro, un ou plusieurs profils au fil du temps ; un profil est attribué à zéro ou plusieurs utilisateurs ; un même profil peut être réattribué au même utilisateur plus tard.
- Nature : l'association un à plusieurs devient plusieurs à plusieurs, et historisée.
- Cardinalités :
UTILISATEUR 0,n ── ATTRIBUER (date_fin) ── 0,n PROFIL, avec une date de début dans l'identification. - Traduction :
Attribution (idUtilisateur, idProfil, dateDebut, dateFin)
Clé primaire : (idUtilisateur, idProfil, dateDebut)
Clé étrangère : idUtilisateur en référence à id de Utilisateur
Clé étrangère : idProfil en référence à id de Profil
Utilisateur : suppression de la colonne idProfil
- Vérification : les attributions actuelles doivent être reprises avant de supprimer la colonne. En SQL, l'ordre compte :
CREATE TABLE Attribution (
idUtilisateur INT NOT NULL,
idProfil INT NOT NULL,
dateDebut DATE NOT NULL,
dateFin DATE,
PRIMARY KEY (idUtilisateur, idProfil, dateDebut),
FOREIGN KEY (idUtilisateur) REFERENCES Utilisateur (id),
FOREIGN KEY (idProfil) REFERENCES Profil (id)
);
-- Reprendre le profil actuel de chaque utilisateur
INSERT INTO Attribution (idUtilisateur, idProfil, dateDebut)
SELECT id, idProfil, DATE(dateCreation) FROM Utilisateur;
-- Supprimer l'ancienne clé étrangère, puis la colonne (nom de contrainte donné par SHOW CREATE TABLE)
ALTER TABLE Utilisateur DROP FOREIGN KEY fk_utilisateur_profil;
ALTER TABLE Utilisateur DROP COLUMN idProfil;
DATE() garde la date seule si dateCreation contient aussi une heure. Toutes les requêtes qui joignaient Utilisateur et Profil par idProfil doivent maintenant passer par Attribution, en filtrant les attributions en cours (dateFin IS NULL OR dateFin >= CURRENT_DATE). C'est le genre de conséquence qu'une commission d'E6 aime te voir anticiper.
Rédiger la réponse sur papier
- Écris le schéma en texte, au format du sujet, avec les clés primaires et étrangères en toutes lettres. Si le sujet dit « dans le formalisme de votre choix », c'est la forme la plus sûre.
- Ne réécris que ce qui change : les tables créées, les tables modifiées (avec les colonnes ajoutées ou supprimées), comme le demandent les énoncés.
- Justifie chaque choix en une phrase, en citant la règle de gestion : « la clé primaire inclut
dateDebutparce qu'un même profil peut être réattribué au même utilisateur ». - Garde les noms du sujet : sa casse (
idProfil, pasid_profil), ses noms de tables. Un correcteur doit pouvoir comparer ta réponse au schéma d'origine sans effort. - Signale ce que le schéma ne garantit pas (« la limite de cinq mots de passe sera vérifiée par l'application »). C'est une remarque que les correcteurs valorisent.
Présenter ta modélisation à l'E6
- Mets dans ton dossier un MCD ou un MLD lisible (exporté d'un logiciel, pas une photo), et le dictionnaire des données s'il est utile.
- Prépare la justification de chaque cardinalité et de chaque table d'association. La question « pourquoi une table plutôt qu'une colonne ? » revient souvent : la réponse est presque toujours une cardinalité (« une note de frais peut être renvoyée plusieurs fois, il faut une ligne par renvoi ») ou un besoin d'historique.
- Pendant l'heure de réalisation, modifie d'abord le modèle, puis le script, puis le code. Cinq minutes de MCD évitent trente minutes de code à refaire.
- Garde un script de migration (le
CREATE TABLE, la reprise des données, l'ALTER TABLE) plutôt que des clics dans phpMyAdmin : il se montre, se rejoue et se versionne avec Git.
Les pièges qui coûtent des points
- La clé étrangère du mauvais côté d'une association un à plusieurs.
- Une association plusieurs à plusieurs traduite par une simple clé étrangère, qui ne permet qu'un seul lien.
- Une clé primaire de table d'association trop courte, qui interdit l'historique (oublier
dateDebut), ou trop longue, qui autorise des doublons absurdes. - Des cardinalités inversées, ou lues à l'envers à partir d'un diagramme UML.
- Une donnée calculée stockée (un total, un âge, un compteur) sans justification.
- Une propriété rangée au mauvais endroit : le libellé du genre dans le document, la quantité dans le produit.
- Un mot de passe stocké en clair, ou chiffré de façon réversible, dans une table d'authentification : à l'E7, une telle réponse ne peut pas rapporter les points de la question.
- Un schéma réécrit entièrement alors que seules deux tables changeaient : du temps perdu et des risques d'erreurs de recopie.
- Une évolution qui ignore les données existantes : une colonne
NOT NULLajoutée à une table pleine, sans valeur par défaut, échoue. - Des noms qui changent entre le schéma, le SQL et le code.
La checklist finale
Pour un MCD : chaque entité a un identifiant souligné ; chaque propriété est élémentaire, atomique, unique dans le schéma ; chaque association a un verbe et deux cardinalités justifiées par une phrase ; les associations porteuses relient des entités par des maximums n ; les réflexives ont des rôles ; aucune clé étrangère n'apparaît.
Pour un MLD : une table par entité ; une clé étrangère du côté du maximum 1 de chaque association un à plusieurs ; une table par association plusieurs à plusieurs ou ternaire, avec une clé primaire composée ; des noms de rôle pour les clés étrangères multiples vers une même table ; les tables en 3FN.
Pour le SQL : les tables référencées créées en premier ; des types cohérents (DECIMAL pour les montants, CHAR pour les codes, DATE pour les dates) ; NOT NULL pour chaque cardinalité 1,1 et chaque propriété obligatoire ; UNIQUE pour les identifiants naturels et les associations un à un ; les CHECK des listes de valeurs ; les actions ON DELETE choisies d'après les règles de gestion.
Exercices
Exercice 1 sur 3 Évolution type E7 : les alertes de sécurité Réussi À revoir
Une application de gestion de rendez-vous médicaux a ce schéma (extrait) :
Compte (id, identifiant, empreinteMdp, actif)
Clé primaire : id
Connexion (id, dateHeure, adresseIp, reussie, idCompte)
Clé primaire : id
Clé étrangère : idCompte en référence à id de Compte
Le responsable de la sécurité veut que l'application génère des alertes : chaque alerte a une date, un niveau (information, avertissement, critique) et un message ; elle concerne un seul compte ; elle peut être liée à une ou plusieurs connexions suspectes, et une connexion peut déclencher plusieurs alertes. Un administrateur (lui-même un compte) peut prendre en charge l'alerte ; on note alors la date de prise en charge.
- Écris les tables créées ou modifiées.
- Quelle contrainte poses-tu sur le niveau ?
Voir la réponseMasquer la réponse de l'exercice 1
-
Une entité ALERTE, une association plusieurs à plusieurs avec CONNEXION, et deux associations un à plusieurs vers COMPTE (le compte concerné, l'administrateur), avec deux rôles :
Alerte (id, dateHeure, niveau, message, idCompteConcerne, idAdministrateur, datePriseEnCharge) Clé primaire : id Clé étrangère : idCompteConcerne en référence à id de Compte Clé étrangère : idAdministrateur en référence à id de Compte Declencher (idAlerte, idConnexion) Clé primaire : (idAlerte, idConnexion) Clé étrangère : idAlerte en référence à id de Alerte Clé étrangère : idConnexion en référence à id de ConnexionidCompteConcerneest obligatoire (une alerte concerne toujours un compte) ;idAdministrateuretdatePriseEnChargesont facultatifs tant que personne n'a pris l'alerte en charge. La date de prise en charge reste dansAlerte: une alerte n'est prise en charge qu'une fois, la date dépend donc de l'alerte seule. Les tablesCompteetConnexionne changent pas. -
Une contrainte
CHECK (niveau IN ('information', 'avertissement', 'critique')). On peut ajouter une contrainte de cohérence :idAdministrateuretdatePriseEnChargesont tous les deux renseignés ou tous les deux vides (une contrainte de simultanéité, chapitre 7). Le fait que l'administrateur soit bien un compte administrateur ne se garantit pas par la structure : il faudra un contrôle dans l'application ou un trigger.
Tu avais trouvé ?
Exercice 2 sur 3 Évolution type E6 : prêter du matériel Réussi À revoir
Ton application de gestion de parc contient les tables employe (id_employe, nom, prenom, …) et poste (id_poste, num_inventaire, type_poste, …, #id_employe). L'expression des besoins demande : « Le service informatique prête des ordinateurs portables de dépannage. Il faut savoir qui a emprunté quel portable, à quelle date, pour quelle date de retour, et s'il a été rendu. Un employé peut emprunter plusieurs fois le même portable. »
- Faut-il une association ou une entité ? Justifie.
- Écris la table et son
CREATE TABLE. - Que faut-il mettre à jour en plus du script ?
Voir la réponseMasquer la réponse de l'exercice 2
-
Une entité PRET, avec son propre identifiant : un employé peut emprunter plusieurs fois le même portable, donc le couple (employé, poste) ne suffit pas à identifier un prêt. Deux associations :
PRET 1,1 ── EMPRUNTER ── 0,n EMPLOYEetPRET 1,1 ── CONCERNER ── 0,n POSTE. -
pret (id_pret, date_pret, date_retour_prevue, date_retour, #id_employe, #id_poste)
CREATE TABLE pret ( id_pret INT AUTO_INCREMENT PRIMARY KEY, date_pret DATE NOT NULL, date_retour_prevue DATE NOT NULL, date_retour DATE, id_employe INT NOT NULL, id_poste INT NOT NULL, CONSTRAINT chk_dates_pret CHECK (date_retour_prevue >= date_pret), CONSTRAINT fk_pret_employe FOREIGN KEY (id_employe) REFERENCES employe (id_employe), CONSTRAINT fk_pret_poste FOREIGN KEY (id_poste) REFERENCES poste (id_poste) );« A-t-il été rendu ? » n'est pas une colonne : c'est
date_retour IS NOT NULL. Une colonne booléennerenduserait une donnée redondante, qui pourrait contredire la date. -
Le MCD ou le MLD du dossier, le dictionnaire des données, et le code (DAO, écrans). À la recette, montre le modèle à jour avant l'application : c'est un indicateur de la compétence « Assurer la maintenance corrective ou évolutive ».
Tu avais trouvé ?
Exercice 3 sur 3 Lire un schéma avant d'écrire des requêtes Réussi À revoir
Avec le schéma Utilisateur, Profil, Permission, Accorder de ce chapitre (avant l'exemple 2) :
- Un utilisateur peut-il avoir deux profils ?
- Par quelles tables passe une requête qui liste les permissions d'un utilisateur ?
- Que se passe-t-il si l'on tente d'ajouter deux fois la même permission au même profil ?
Voir la réponseMasquer la réponse de l'exercice 3
- Non :
idProfilest une colonne simple deUtilisateur, elle contient une seule valeur. Utilisateur→Profil(paridProfil) →Accorder(paridProfil) →Permission(paridPermission). En pratique, on peut joindreUtilisateurdirectement àAccordersuridProfil, puisPermission: trois tables suffisent si l'on n'affiche pas le libellé du profil.- L'insertion est refusée : le couple (
idProfil,idPermission) est la clé primaire d'Accorder, il ne peut pas apparaître deux fois (erreur 1062, Duplicate entry, sous MySQL).
Tu avais trouvé ?