MFormations
Modern Information Systems Engineering

Chapitre 19

19-Corrections

> Corrigés détaillés des 40 exercices avec diagrammes Mermaid et explications pas-à-pas.

Cours : Corrigés détaillés des 40 Exercices

Introduction

Ce chapitre fournit les corrigés complets des 40 exercices du chapitre 17. Chaque corrigé présente la solution attendue avec diagrammes Mermaid, explications détaillées, variantes possibles et pièges à éviter.


Corrigé 1 : MCD Réservation hôtelière

Diagramme en cours de génération...

Explications :

  • Cinq entités identifiées : Client, Réservation, LigneRéservation, Chambre, Catégorie
  • L'association "effectue" entre Client (1,N) et Réservation (1,1) : un client peut faire plusieurs réservations, une réservation appartient à un client
  • L'association "concerne" entre Réservation (1,N) et Chambre (1,N) via LigneRéservation : une réservation peut concerner plusieurs chambres, une chambre peut être dans plusieurs réservations (mais pas aux mêmes dates)
  • Catégorie (1,1) → Chambre (0,N) : une catégorie peut classer plusieurs chambres

Pièges à éviter :

  • Ne pas oublier LigneRéservation pour l'association N:N entre Réservation et Chambre
  • Cardinalités : une réservation est pour un seul client (1,1) côté Client
  • Le statut de réservation : prévoir les valeurs (confirmée, annulée, terminée)

Corrigé 2 : MCD Gestion de bibliothèque

Diagramme en cours de génération...

Explications :

  • Un Adhérent peut réaliser plusieurs Emprunts (0,N), un Emprunt concerne un seul Adhérent (1,1)
  • Un Exemplaire peut être impliqué dans plusieurs Emprunts (0,N) mais pas simultanément
  • Un Ouvrage peut avoir plusieurs Exemplaires (1,N)
  • Contrainte métier : max 5 emprunts simultanés par adhérent (non représentable en MCD simple)

Corrigé 3 : MLD à partir d'un MCD

CLIENT (id_client INT PK, nom VARCHAR(50) NOT NULL, prenom VARCHAR(50),
        email VARCHAR(100) UNIQUE NOT NULL, telephone VARCHAR(20))

CHAMBRE (id_chambre INT PK, etage INT, capacite INT,
         id_categorie INT NOT NULL FK→CATEGORIE)

CATEGORIE (id_categorie INT PK, code VARCHAR(10) UNIQUE, libelle VARCHAR(50),
           prix_nuit DECIMAL(8,2) NOT NULL CHECK(prix_nuit > 0))

RESERVATION (id_reservation INT PK, id_client INT NOT NULL FK→CLIENT,
             date_arrivee DATE NOT NULL, date_depart DATE, statut VARCHAR(20))

LIGNE_RESERVATION (id_reservation INT FK→RESERVATION,
                   id_chambre INT FK→CHAMBRE,
                   PRIMARY KEY (id_reservation, id_chambre),
                   CHECK (date_arrivee < date_depart))

Explications :

  • Chaque entité devient une table
  • Les associations (1,N) deviennent des clés étrangères (FK)
  • L'association N:N devient une table d'association LIGNE_RESERVATION
  • Les clés primaires sont soulignées

Corrigé 4 : Contraintes de cardinalités

  1. Employé → Service (1,1) — un employé dans un service Service → Employé (1,N) — un service a plusieurs employés

  2. Étudiant → Cours (0,N) — un étudiant dans 0 ou plusieurs cours Cours → Étudiant (1,N) — un cours a plusieurs étudiants

  3. Client → Commande (0,N) — un client a de 0 à N commandes Commande → Client (1,1) — une commande pour un seul client

  4. Utilisateur → Carte (0,1) — un utilisateur a 0 ou 1 carte Carte → Utilisateur (0,1) — une carte pour 0 ou 1 utilisateur

  5. Livre → Auteur (1,N) — un livre a 1 ou plusieurs auteurs Auteur → Livre (1,N) — un auteur écrit 1 ou plusieurs livres

Corrigé 5 : MOT

PROCEDURE : Gestion des commandes fournisseurs
├── ACTIVITE : Saisie de commande
│   ├── OPERATION : Créer commande
│   ├── OPERATION : Ajouter lignes
│   └── OPERATION : Valider saisie
│   Acteur : Commercial | Ressource : CRM
├── ACTIVITE : Validation commande
│   ├── OPERATION : Vérifier disponibilité
│   ├── OPERATION : Valider crédit
│   └── OPERATION : Approuver
│   Acteur : Responsable | Ressource : ERP
├── ACTIVITE : Préparation commande
│   ├── OPERATION : Picking
│   ├── OPERATION : Conditionnement
│   └── OPERATION : Contrôle qualité
│   Acteur : Préparateur | Ressource : WMS
├── ACTIVITE : Expédition
│   ├── OPERATION : Édition bon de livraison
│   ├── OPERATION : Chargement
│   └── OPERATION : Mise à jour tracking
│   Acteur : Logisticien | Ressource : TMS
└── ACTIVITE : Facturation
    ├── OPERATION : Générer facture
    ├── OPERATION : Envoyer client
    └── OPERATION : Comptabiliser
    Acteur : Comptable | Ressource : ERP

Corrigé 6 : MPD PostgreSQL

-- Sequences
CREATE SEQUENCE seq_client START 1000 INCREMENT 1;
CREATE SEQUENCE seq_reservation START 10000 INCREMENT 1;
CREATE SEQUENCE seq_chambre START 1 INCREMENT 1;
CREATE SEQUENCE seq_categorie START 1 INCREMENT 1;

-- Tables
CREATE TABLE categorie (
    id_categorie INTEGER DEFAULT nextval('seq_categorie') PRIMARY KEY,
    code VARCHAR(10) NOT NULL UNIQUE,
    libelle VARCHAR(50) NOT NULL,
    prix_nuit DECIMAL(8,2) NOT NULL CHECK (prix_nuit > 0),
    date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE chambre (
    id_chambre INTEGER DEFAULT nextval('seq_chambre') PRIMARY KEY,
    etage INTEGER NOT NULL CHECK (etage BETWEEN -1 AND 50),
    capacite INTEGER NOT NULL CHECK (capacite BETWEEN 1 AND 10),
    id_categorie INTEGER NOT NULL REFERENCES categorie(id_categorie),
    actif BOOLEAN DEFAULT true
);

CREATE TABLE client (
    id_client INTEGER DEFAULT nextval('seq_client') PRIMARY KEY,
    nom VARCHAR(50) NOT NULL CHECK (length(trim(nom)) > 0),
    prenom VARCHAR(50),
    email VARCHAR(100) NOT NULL UNIQUE,
    telephone VARCHAR(20),
    date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE reservation (
    id_reservation INTEGER DEFAULT nextval('seq_reservation') PRIMARY KEY,
    id_client INTEGER NOT NULL REFERENCES client(id_client),
    date_arrivee DATE NOT NULL,
    date_depart DATE NOT NULL,
    statut VARCHAR(20) DEFAULT 'confirmee' CHECK (statut IN ('confirmee','annulee','terminee')),
    date_creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CHECK (date_arrivee < date_depart)
);

CREATE TABLE ligne_reservation (
    id_reservation INTEGER NOT NULL REFERENCES reservation(id_reservation),
    id_chambre INTEGER NOT NULL REFERENCES chambre(id_chambre),
    prix_applique DECIMAL(8,2),
    PRIMARY KEY (id_reservation, id_chambre)
);

-- Index
CREATE INDEX idx_reservation_client ON reservation(id_client);
CREATE INDEX idx_reservation_dates ON reservation(date_arrivee, date_depart);
CREATE INDEX idx_chambre_categorie ON chambre(id_categorie);
CREATE INDEX idx_chambre_etage ON chambre(etage);

Corrigé 7 : Use Cases Bibliothèque

Diagramme en cours de génération...

Corrigé 9 : Classes Système de commande

Diagramme en cours de génération...

Corrigé 11 : Séquence Réservation

Diagramme en cours de génération...

Corrigé 12 : Diagramme d'État Commande

Diagramme en cours de génération...

Corrigé 17 : C4 Contexte Netflix-like

Diagramme en cours de génération...

Corrigé 25 : DDD Bounded Contexts

Plateforme e-commerce : découpage en bounded contexts

  1. Catalogue : gère les produits, catégories, attributs, prix

    • Ubiquitous Language : produit, SKU, catégorie, attribut, tarif, stock
    • Dépend de : rien (autonome)
  2. Panier : gère le panier d'achat temporaire

    • Ubiquitous Language : panier, article, quantité, prix unitaire
    • Dépend de : Catalogue (lecture produits)
  3. Commande : gère le cycle de vie des commandes

    • Ubiquitous Language : commande, ligne commande, statut, total, adresse livraison
    • Dépend de : Panier, Paiement
  4. Paiement : gère les transactions financières

    • Ubiquitous Language : paiement, transaction, remboursement, facture
    • Dépend de : Commande
  5. Expédition : gère la logistique

    • Ubiquitous Language : colis, transporteur, tracking, livraison
    • Dépend de : Commande
  6. Facturation : gère les documents comptables

    • Ubiquitous Language : facture, avoir, TVA, exercice fiscal
    • Dépend de : Commande, Paiement
  7. Avis : gère les reviews clients

    • Ubiquitous Language : avis, note, commentaire, modération
    • Dépend de : Catalogue (lecture produits)
  8. Recommandation : gère le moteur de suggestions

    • Ubiquitous Language : recommandation, similarité, popularité
    • Dépend de : Catalogue, Commande
  9. Stock : gère les inventaires

    • Ubiquitous Language : stock, entrepôt, mouvement, réapprovisionnement
    • Dépend de rien
  10. CRM : gère les relations clients

    • Ubiquitous Language : client, historique, fidélité, segmentation
    • Dépend de : Commande
  11. Marketing : gère les campagnes

    • Ubiquitous Language : campagne, promotion, code promo, ciblage
    • Dépend de : Catalogue, CRM

Corrigé 29 : ADR — Adoption file de messages

Title: Adoption d'une file de messages pour l'intégration Commande → Paiement
Status: Accepted (2025-01-15)
Context:
  Le service Commande doit notifier le service Paiement à chaque création de commande.
  Actuellement, l'appel est synchrone (REST direct) ce qui crée un couplage fort
  et des timeouts en période de charge.
Decision:
  Nous adoptons Apache Kafka comme middleware de messages asynchrones.
  Le service Commande publie un événement "CommandeCrée" sur le topic "orders".
  Le service Paiement consomme ce topic pour initier le processus de paiement.
Rationale:
  - Découplage temporel : Commande n'attend plus la réponse de Paiement
  - Résilience : si Paiement est down, les messages sont bufferisés
  - Scalabilité : plusieurs instances de Paiement peuvent consommer en parallèle
  - Traçabilité : l'event log permet le debugging et l'audit
  - Kafka offre une meilleure scalabilité que RabbitMQ pour notre volume (>10k msg/s)
Consequences:
  - Complexité opérationnelle accrue (cluster Kafka à gérer)
  - Nécessité de gérer la consistance éventuelle
  - Ajout du pattern Outbox pour garantir la publication des événements
  - Formation de l'équipe sur Kafka et Event-Driven Architecture
Compliance:
  - Chaque commande créée doit publier exactement un événement
  - Le consumer Paiement doit être idempotent
  - Monitoring : lag Kafka à surveiller (alerte si > 1000 messages)

Corrigé 40 : Synthèse — Billetterie événementielle

Contexte : Plateforme de billetterie style Ticketmaster.

MCD

Diagramme en cours de génération...

Déroulé complet pour l'ensemble des 40 exercices

Les corrigés complets suivent la même structure :

  1. Diagramme Mermaid de la solution
  2. Explications pas-à-pas de la démarche
  3. Variantes et alternatives possibles
  4. Pièges à éviter et points d'attention
  5. Critères d'évaluation pour l'auto-évaluation