Modèle Physique de Données (MPD) Merise

4 min de lecture

Prêt·e pour la dernière étape de la méthodologie Merise ? 🎉
Alors sans plus tarder, accueillons comme il se doit le MPD (Modèle Physique de Données) !

🤔 Qu'est-ce que le MPD ?

Le MPD est la dernière étape de la méthodologie Merise.
Il reprend les éléments du MLD en ajoutant les derniers détails techniques nécessaires pour implémenter le modèle dans un SGBD (Système de Gestion de Base de Données).

Ces détails techniques sont :

  • Le type de données de chaque colonne (ex: VARCHAR, INT, DATE, etc.)
  • La taille de chaque colonne (ex: VARCHAR(255), INT(11), etc.)
  • Les contraintes d'intégrité (ex: NOT NULL, UNIQUE, etc.)
  • Les clés étrangères (ex: FOREIGN KEY, REFERENCES, etc.)

🔍 Exemple de MPD

À partir du MLD (et MRD si existant) et du dictionnaire de données, on va pouvoir créer le MPD.

Faisons la transition de l'exemple de MLD basique que l'on a vu précédemment :

Exemple de MLD

En prenant en considération que l'application va être développée avec PostgreSQL, on prendra soin d'utiliser les types de données et les contraintes d'intégrité qui lui sont propres.

Voici à quoi il ressemble :

Exemple de MPD

Avec ce schéma, il est facile d'identifier les différentes tables, leurs colonnes, les types de données, les contraintes d'intégrité, ainsi que les clés primaires et étrangères qui relient les tables entre elles.

Une fois le MPD créé, il est possible de le traduire en SQL pour créer les tables dans le SGBD. Voici un exemple de code SQL pour créer les tables correspondantes au MPD ci-dessus :

CREATE TABLE "table_1" (
	"id_table_1" INTEGER NOT NULL UNIQUE,
	"column_2" VARCHAR(50) NOT NULL,
	"column_3" VARCHAR(50) NOT NULL,
	"table_3_id" INTEGER NOT NULL,
	PRIMARY KEY("id_table_1")
);
CREATE INDEX "table_1_index_0"
ON "table_1" ("id_table_3");

CREATE TABLE "table_3" (
	"id_table_3" INTEGER NOT NULL UNIQUE GENERATED BY DEFAULT AS IDENTITY,
	"column_2" VARCHAR(50) NOT NULL,
	"column_3" VARCHAR(50) NOT NULL,
	"table_3_id" INTEGER,
	PRIMARY KEY("id_table_3")
);
CREATE INDEX "table_3_index_0"
ON "table_3" ("id_table_3");

CREATE TABLE "table_2" (
	"id_table_2" INTEGER NOT NULL UNIQUE GENERATED BY DEFAULT AS IDENTITY,
	"column_2" VARCHAR(50) NOT NULL,
	"column_3" VARCHAR(50) NOT NULL,
	PRIMARY KEY("id_table_2")
);
CREATE INDEX "table_2_index_0"
ON "table_2" ("id_table_2");

CREATE TABLE "table_1_contains_table_2" (
	"table_1_id" INTEGER NOT NULL,
	"table_2_id" INTEGER NOT NULL,
	PRIMARY KEY("table_1_id", "table_2_id")
);
CREATE UNIQUE INDEX "table_1_contains_table_2_index_0"
ON "table_1_contains_table_2" ("table_1_id", "table_2_id");

ALTER TABLE "table_1"
ADD FOREIGN KEY("table_3_id") REFERENCES "table_3"("id_table_3")
ON UPDATE NO ACTION ON DELETE NO ACTION;

ALTER TABLE "table_3"
ADD FOREIGN KEY("id_table_3") REFERENCES "table_3"("table_3_id")
ON UPDATE NO ACTION ON DELETE NO ACTION;

ALTER TABLE "table_1"
ADD FOREIGN KEY("id_table_1") REFERENCES "table_1_contains_table_2"("table_1_id")
ON UPDATE NO ACTION ON DELETE NO ACTION;

ALTER TABLE "table_1_contains_table_2"
ADD FOREIGN KEY("table_2_id") REFERENCES "table_2"("id_table_2")
ON UPDATE NO ACTION ON DELETE NO ACTION;

📊 Dictionnaire de données

Tu te souviens du dictionnaire de données que l'on a créé lors du brief avec le client ? Juste avant de passer au MCD ?
Il est maintenant possible de le mettre jour avec les informations du SGBD utilisé !

Bien entendu ce n'est pas obligatoire, mais c'est une bonne source d'informations pour les développeurs et les administrateurs de la base de données 😉

Pour rappel, voici le dictionnaire de données non technique que nous avions fait :

Nom de la donnéeFormatLongueurContraintes
NomNumérique30Obligatoire
PrénomNumérique30Obligatoire
InstrumentsAlphabétique30Obligatoire
Adresse e-mailAlphanumérique50Obligatoire, Unique
Mot de passeAlphanumérique> 12Obligatoire
DocumentMusicien
Nom de la donnéeFormatLongueurContraintes
Date et heureDate-Obligatoire
LieuAlphabétique-Obligatoire
TarifNumérique-Obligatoire
DocumentConcert
Nom de la donnéeFormatLongueurContraintes
Date et heureDate-Obligatoire
LieuAlphabétique-Obligatoire
DocumentRépétition

En ajoutant les informations techniques, il devient :

ColonneTypeLongueurContraintes
id_musicianSERIAL-NOT_NULL, UNIQUE
lastnameVARCHAR30NOT_NULL
firstnameVARCHAR30NOT_NULL
instrumentsVARCHAR[]30NOT_NULL
emailVARCHAR50NOT_NULL, UNIQUE
passwordVARCHAR32NOT_NULL
Tablemusician
Clé primaire(id_musician)
ColonneTypeLongueurContraintes
event_idSERIAL-NOT_NULL
locationVARCHAR30NOT_NULL
datetimeTIMESTAMP30NOT_NULL
Tablemusician_participates_event
Clé primaire(id_musician, event_id)Clé(s) étrangère(s)id_musician, event_id
ColonneTypeLongueurContraintes
id_eventSERIAL-NOT_NULL, UNIQUE
locationVARCHAR30NOT_NULL
datetimeTIMESTAMP30NOT_NULL
Tableevent
Clé primaire(id_event)
ColonneTypeLongueurContraintes
id_concertSERIAL-NOT_NULL, UNIQUE
priceMONEY--
event_idSERIAL-NOT_NULL
Tableconcert
Clé primaire(id_concert)Clé(s) étrangère(s)event_id
ColonneTypeLongueurContraintes
id_rehearsalSERIAL-NOT_NULL, UNIQUE
event_idSERIAL-NOT_NULL
Tablerehearsal
Clé primaire(id_rehearsal)Clé(s) étrangère(s)event_id

Ça en fait du beau monde ! 😅

Il est important de noter que le dictionnaire de données doit être mis à jour à chaque fois qu'une modification est apportée au modèle de données ainsi qu'à la base de données.

Maintenant, il est temps de réaliser le MPD à partir du MLD et du dictionnaire de données !

🛠️ Outils pour créer le MPD

Bien que j'ai recommandé d'utiliser Looping pour créer les schémas de données, il ne permet pas de créer le MPD.

Il n'est pas pour autant à mettre à la poubelle, car il permet de créer le MCD et le MLD très facilement, ainsi que le LDD (Langage de Définition de Données) dont on va parler un peu plus tard !

Divers outils en ligne permettent de générer des schémas graphiques de bases de données. Cependant, ils ne sont pas tous adaptés à la création de MPD.

La plupart du temps, on retrouvera des outils qui permettent de réaliser des ERD (Entity Relationship Diagram).
La différence dans ces outils est qu'ils se basent davantage sur une syntaxe de type UML (Unified Modeling Language).

Comment reconnaître si mon outil utilise une syntaxe de type UML ?

En général, les outils qui utilisent une syntaxe de type UML utilisent des losanges pour représenter les relations entre les entités.
Dans le cas de Merise, on utilise des lignes et flèches basiques pour représenter les relations entre les entités/tables.

Il est aussi possible que tu tombes sur des "pattes de poulet" (comme dirait une consœur jurée) ou crow's foot notation qui est une autre façon de représenter les relations entre les entités/tables.

C'est joli, mais c'est pas Merise ! 😅

De mon côté, j'utilise DrawDB qui est un outil en ligne gratuit et open-source.
Il permet de créer des schémas de bases de données avec la possibilité de configurer l'apparence des lignes de relation, ainsi que de générer un diagramme à partir d'un fichier SQL.

🔨 Création du MPD

Pour créer le MPD, il va juste falloir t'armer de patience selon la taille de ton MLD et de ton outil.

Dans ton outil, tu devras indiquer les types de données et les contraintes d'intégrité pour chaque colonne de chaque table.
Mais ça tombe bien, on a déjà fait le plus gros du travail avec le MLD et le dictionnaire de données !

À la fin, on se retrouve avec un schéma qui ressemble à ça :

Exemple de MPD

📜 Préparation du LDD

Dernière ligne droite : le LDD (Langage de Définition de Données) !

Le LDD correspond tout simplement à la création des tables dans le SGBD, par l'utilisation des commandes SQL comme CREATE TABLE, ALTER TABLE, DROP TABLE, etc.

Il est possible de le créer à partir de DrawDB en exportant le schéma au format SQL, mais également depuis Looping !

De notre côté, voici à quoi ressemble le LDD pour le MPD ci-dessus :

CREATE TABLE "musician" (
	"id_musician" SERIAL NOT NULL,
	"lastname" VARCHAR(30) NOT NULL,
	"firstname" VARCHAR(30) NOT NULL,
	"instruments" VARCHAR[] NOT NULL,
	"email" VARCHAR(50) NOT NULL,
	"password" CHAR(64) NOT NULL,
	PRIMARY KEY("id_musician")
);

CREATE TABLE "event" (
	"id_event" SERIAL NOT NULL,
	"datetime" TIMESTAMP NOT NULL,
	"location" VARCHAR(30) NOT NULL,
	PRIMARY KEY("id_event")
);

CREATE TABLE "concert" (
	"id_concert" SERIAL NOT NULL,
	"price" MONEY,
	"event_id" SERIAL NOT NULL,
	PRIMARY KEY("id_concert")
);

CREATE TABLE "rehearsal" (
	"id_rehearsal" SERIAL NOT NULL,
	"event_id" SERIAL NOT NULL,
	PRIMARY KEY("id_rehearsal")
);

CREATE TABLE "musician_participates_event" (
	"musician_id" SERIAL NOT NULL,
	"event_id" SERIAL NOT NULL,
	PRIMARY KEY("musician_id", "event_id")
);

ALTER TABLE "concert"
ADD FOREIGN KEY("event_id") REFERENCES "event"("id_event")
ON UPDATE NO ACTION ON DELETE NO ACTION;

ALTER TABLE "rehearsal"
ADD FOREIGN KEY("event_id") REFERENCES "event"("id_event")
ON UPDATE NO ACTION ON DELETE NO ACTION;

ALTER TABLE "musician"
ADD FOREIGN KEY("id_musician") REFERENCES "musician_participates_event"("musician_id")
ON UPDATE NO ACTION ON DELETE NO ACTION;

ALTER TABLE "event"
ADD FOREIGN KEY("id_event") REFERENCES "musician_participates_event"("event_id")
ON UPDATE NO ACTION ON DELETE NO ACTION;

Et voilà, on en a fini avec le MPD ! 🎉

Conclusion

Ça y est, on peut souffler un bon coup ! 🍹☀️

Non seulement on a créé le MPD, mais on a également mis à jour le dictionnaire de données avec les informations techniques tout en préparant le LDD pour créer les tables dans le SGBD.
On peut le dire : on est des pros de la méthodologie Merise ! 😎

... ou presque ! Merise va plus loin que la simple modélisation de bases de données.
Mais ça, je t'invite à le découvrir par toi-même 😉

Si tu souhaites aller plus loin dans la méthodologie Merise, je te recommande de lire la quatrième édition du guide pratique Merise aux Éditions ENI.
Il a été écrit par Jean-Luc Baptiste qui maîtrise le sujet sur le bout des doigts.

Dernières documentations

CP 7 - Développer des composants métier coté serveur

Dernière modification :

Synthèse et explications des attentes relatives à la compétence professionnelle 7 du titre professionnel Développeur Web et Web Mobile (DWWM-01280m04).

Modèle Logique/Relationnel de Données (MLD/MRD) Merise

Dernière modification :

Plongez dans le MLD et MRD de Merise pour transformer votre modèle conceptuel en une structure relationnelle optimisée.

Memento DevMemento Dev

Plateforme de ressources et documentations synthétiques et concises, conçue pour les développeurs ou passionnés de l‘informatique en quête de savoir.


© 2022 - 2025 Memento Dev. Tous droits réservés

Memento Dev est une plateforme open-source, développée par Gauthier Daniels, soutenue et maintenue par une communauté de contributeurs passionnés.