From 702b9da3415676314a4d3c36db62cada20e7c722 Mon Sep 17 00:00:00 2001 From: GauthierWebDev Date: Tue, 22 Apr 2025 18:32:57 +0200 Subject: [PATCH] feat: Add data structure for DictionnaryTable and DataTable --- .../DictionnaryTable.tsx | 418 ++++++++++++++---- app/pages/docs/merise/mld/+Page.mdx | 4 +- app/pages/docs/merise/mpd/+Page.mdx | 66 ++- app/pages/docs/merise/mpd/tabs.tsx | 65 +++ app/public/downloads/merise/example.lo1 | Bin 56090 -> 56090 bytes app/public/downloads/merise/example.loo | Bin 56090 -> 56090 bytes app/public/images/merise/mpd-basic.webp | Bin 0 -> 29788 bytes 7 files changed, 466 insertions(+), 87 deletions(-) create mode 100644 app/pages/docs/merise/mpd/tabs.tsx create mode 100644 app/public/images/merise/mpd-basic.webp diff --git a/app/pages/docs/merise/dictionnaire-de-donnees/DictionnaryTable.tsx b/app/pages/docs/merise/dictionnaire-de-donnees/DictionnaryTable.tsx index 76041ce..57addd5 100644 --- a/app/pages/docs/merise/dictionnaire-de-donnees/DictionnaryTable.tsx +++ b/app/pages/docs/merise/dictionnaire-de-donnees/DictionnaryTable.tsx @@ -1,87 +1,337 @@ -export default function DictionnaryTable() { +import { For } from "solid-js"; + +type DataTable = { + tableName: string; + hiddenInBasic?: boolean; + documentName: string; + columns: DataColumn[]; + primaryKeys?: string[]; + foreignKeys?: string[]; +}; + +type DataColumnType = + | "Alphanumérique" + | "Alphabétique" + | "Numérique" + | "Date" + | "Logique"; + +type DataColumn = { + name: string; + logical: string; + dbmsType: string; + dbmsLength?: number; + length?: string | number; + type: DataColumnType; + hiddenInTechnical?: boolean; + hiddenInBasic?: boolean; + dbmsConstraints: string[]; + constraints?: string[]; +}; + +const data: DataTable[] = [ + { + tableName: "musician", + documentName: "Musicien", + primaryKeys: ["id_musician"], + columns: [ + { + name: "code musicien", + logical: "id_musician", + dbmsType: "INTEGER", + type: "Numérique", + hiddenInBasic: true, + dbmsConstraints: ["AUTO_INCREMENT", "NOT_NULL", "UNIQUE"], + }, + { + name: "Nom", + logical: "lastname", + dbmsType: "VARCHAR", + type: "Numérique", + length: 30, + dbmsLength: 30, + dbmsConstraints: ["NOT_NULL"], + constraints: ["Obligatoire"], + }, + { + name: "Prénom", + logical: "firstname", + dbmsType: "VARCHAR", + type: "Numérique", + length: 30, + dbmsLength: 30, + dbmsConstraints: ["NOT_NULL"], + constraints: ["Obligatoire"], + }, + { + name: "Instruments", + logical: "instruments", + dbmsType: "VARCHAR[]", + type: "Alphabétique", + length: 30, + dbmsLength: 30, + dbmsConstraints: ["NOT_NULL"], + constraints: ["Obligatoire"], + }, + { + name: "Adresse e-mail", + logical: "email", + dbmsType: "VARCHAR[]", + type: "Alphanumérique", + length: 50, + dbmsLength: 50, + dbmsConstraints: ["NOT_NULL", "UNIQUE"], + constraints: ["Obligatoire", "Unique"], + }, + { + name: "Mot de passe", + logical: "password", + dbmsType: "VARCHAR", + type: "Alphanumérique", + length: "> 12", + dbmsLength: 32, + dbmsConstraints: ["NOT_NULL"], + constraints: ["Obligatoire"], + }, + ], + }, + { + tableName: "musician_participates_event", + documentName: "", + hiddenInBasic: true, + primaryKeys: ["id_musician", "event_id"], + foreignKeys: ["id_musician", "event_id"], + columns: [ + { + name: "", + logical: "event_id", + dbmsType: "INTEGER", + type: "Numérique", + dbmsConstraints: ["NOT_NULL"], + }, + { + name: "Lieu", + logical: "location", + dbmsType: "VARCHAR", + type: "Alphabétique", + dbmsLength: 30, + dbmsConstraints: ["NOT_NULL"], + }, + { + name: "Date et heure", + logical: "datetime", + dbmsType: "TIMESTAMPZ", + type: "Alphabétique", + dbmsLength: 30, + dbmsConstraints: ["NOT_NULL"], + }, + ], + }, + { + tableName: "event", + documentName: "", + hiddenInBasic: true, + primaryKeys: ["id_event"], + columns: [ + { + name: "", + logical: "id_event", + dbmsType: "INTEGER", + type: "Numérique", + dbmsConstraints: ["AUTO_INCREMENT", "NOT_NULL", "UNIQUE"], + }, + { + name: "Lieu", + logical: "location", + dbmsType: "VARCHAR", + type: "Alphabétique", + dbmsLength: 30, + dbmsConstraints: ["NOT_NULL"], + }, + { + name: "Date et heure", + logical: "datetime", + dbmsType: "TIMESTAMPZ", + type: "Alphabétique", + dbmsLength: 30, + dbmsConstraints: ["NOT_NULL"], + }, + ], + }, + { + tableName: "concert", + documentName: "Concert", + primaryKeys: ["id_concert"], + foreignKeys: ["event_id"], + columns: [ + { + name: "code concert", + logical: "id_concert", + dbmsType: "INTEGER", + type: "Numérique", + hiddenInBasic: true, + dbmsConstraints: ["AUTO_INCREMENT", "NOT_NULL", "UNIQUE"], + }, + { + name: "Date et heure", + logical: "datetime", + dbmsType: "TIMESTAMPZ", + type: "Date", + hiddenInTechnical: true, + dbmsConstraints: ["NOT_NULL"], + constraints: ["Obligatoire"], + }, + { + name: "Lieu", + logical: "location", + dbmsType: "VARCHAR", + type: "Alphabétique", + hiddenInTechnical: true, + dbmsConstraints: ["NOT_NULL"], + constraints: ["Obligatoire"], + }, + { + name: "Tarif", + logical: "price", + dbmsType: "CURRENCY", + type: "Numérique", + dbmsConstraints: ["NOT_NULL"], + constraints: ["Obligatoire"], + }, + { + name: "", + logical: "event_id", + dbmsType: "INTEGER", + type: "Numérique", + hiddenInBasic: true, + dbmsConstraints: ["NOT_NULL"], + }, + ], + }, + { + tableName: "rehearsal", + documentName: "Répétition", + primaryKeys: ["id_rehearsal"], + foreignKeys: ["event_id"], + columns: [ + { + name: "code répétition", + logical: "id_rehearsal", + dbmsType: "INTEGER", + type: "Numérique", + hiddenInBasic: true, + dbmsConstraints: ["AUTO_INCREMENT", "NOT_NULL", "UNIQUE"], + }, + { + name: "Date et heure", + logical: "datetime", + dbmsType: "TIMESTAMPZ", + type: "Date", + hiddenInTechnical: true, + dbmsConstraints: ["NOT_NULL"], + constraints: ["Obligatoire"], + }, + { + name: "Lieu", + logical: "location", + dbmsType: "VARCHAR", + type: "Alphabétique", + hiddenInTechnical: true, + dbmsConstraints: ["NOT_NULL"], + constraints: ["Obligatoire"], + }, + { + name: "", + logical: "event_id", + dbmsType: "INTEGER", + type: "Numérique", + hiddenInBasic: true, + dbmsConstraints: ["NOT_NULL"], + }, + ], + }, +]; + +type DictionnaryTableProps = { + isTechnical?: boolean; +}; + +export default function DictionnaryTable(props: DictionnaryTableProps) { return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Nom de la donnéeFormatLongueurContraintesDocument
NomAlphabétique30ObligatoireMusicien
PrénomAlphabétique30ObligatoireMusicien
InstrumentsAlphabétique30ObligatoireMusicien
Adresse e-mailAlphanumérique50Obligatoire, uniqueMusicien
Mot de passeAlphanumérique> 12ObligatoireMusicien
Date et heure de concertDate-ObligatoireConcert
Lieu de concertAlphabétique50ObligatoireConcert
TarifNumérique--Concert
Date et heure de répétitionDate-ObligatoireRépétition
Lieu de répétitionAlphabétique50ObligatoireRépétition
+ props.isTechnical || !table.hiddenInBasic)} + > + {(table) => ( + + + + + + + + + + + props.isTechnical || !column.hiddenInBasic, + )} + > + {(column) => ( + + + + + + + )} + + + + {props.isTechnical && ( + <> + {table.primaryKeys && table.primaryKeys.length > 0 && ( + + + + + )} + {table.foreignKeys && table.foreignKeys.length > 0 && ( + + + + + )} + + )} + + + + +
+ {props.isTechnical ? "Colonne" : "Nom de la donnée"} + {props.isTechnical ? "Type" : "Format"}LongueurContraintes
{props.isTechnical ? column.logical : column.name}{props.isTechnical ? column.dbmsType : column.type} + {props.isTechnical + ? column.dbmsLength || "-" + : column.length || "-"} + + {props.isTechnical + ? column.dbmsConstraints?.join(", ") || "-" + : column.constraints?.join(", ") || "-"} +
+ Clé primaire + + ({table.primaryKeys.join(", ")}) +
+ Clé(s) étrangère(s) + + {table.foreignKeys.join(", ")} +
+ {props.isTechnical + ? `Table : ${table.tableName}` + : `Document : ${table.documentName}`} +
+ )} +
); } diff --git a/app/pages/docs/merise/mld/+Page.mdx b/app/pages/docs/merise/mld/+Page.mdx index d9d6b93..a4a6c36 100644 --- a/app/pages/docs/merise/mld/+Page.mdx +++ b/app/pages/docs/merise/mld/+Page.mdx @@ -12,7 +12,7 @@ Le MLD est la suite normale et directe du MCD dans le processus Merise. Son but On parlera plus tard du MRD, mais globalement : c'est la même chose que le MLD ! -## Qu'est-ce que le MLD ? +## 🤔 Qu'est-ce que le MLD ? Le **MLD** est un schéma qui va nous permettre de représenter les données que l'on a récupérées dans le MCD, mais en ajoutant des détails techniques. @@ -20,7 +20,7 @@ Il va nous permettre de représenter les différentes données que l'on a, regro Contrairement au MCD, le MLD n'est pas destiné à être compris par le client. -## Exemple de MLD +## 🔍 Exemple de MLD Reprenons le premier exemple de MCD, dans l'article précédent : diff --git a/app/pages/docs/merise/mpd/+Page.mdx b/app/pages/docs/merise/mpd/+Page.mdx index a8e6ce7..13565f0 100644 --- a/app/pages/docs/merise/mpd/+Page.mdx +++ b/app/pages/docs/merise/mpd/+Page.mdx @@ -4,4 +4,68 @@ description: Apprenez à créer le MPD dans Merise, la dernière étape pour con tags: [Backend, Merise, BDD, MCD, MLD, MPD, SQL] --- -En cours de rédaction... +import DictionnaryTable from "../mcd/DictionnaryTable"; +import tabs from "./tabs"; + +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](/images/merise/mld-basic.webp) + +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](/images/merise/mpd-basic.webp) + +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 : + + + +## 📊 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 : + + + +En ajoutant les informations techniques, il devient : + + + +## 📜 Préparation du LDD + +Le **MPD** est la dernière étape avant de passer à la phase de **LDD** _(Langage de Définition de Données)_. +Il est donc important de bien le préparer pour éviter les erreurs lors de la création des tables. + +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. \ No newline at end of file diff --git a/app/pages/docs/merise/mpd/tabs.tsx b/app/pages/docs/merise/mpd/tabs.tsx new file mode 100644 index 0000000..9e16921 --- /dev/null +++ b/app/pages/docs/merise/mpd/tabs.tsx @@ -0,0 +1,65 @@ +import { Snippet } from "@/components/Snippet"; + +const sqlExampleSnippets = [ + { + name: "Exemple de LDD", + codeLanguage: "sql", + withLineNumbers: true, + code: `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;`, + }, +]; + +export default { + sqlExample: () => , +}; diff --git a/app/public/downloads/merise/example.lo1 b/app/public/downloads/merise/example.lo1 index a3bf20501aabb4da67b7d975e651ce1e3a50a45a..cf3ba859b34f8283f79b52140b9857eed7af1679 100644 GIT binary patch delta 659 zcmXYtZAepb6vp}AJA-13z-vy~z=$Zy)uLUZ7YS<8TC0|gl4UfsZf_7Fghhsl1huT# z4!x6M=pn>kT5 zDQH;JxV~_Y#3cn)5`_xQ6th>bE#D+@t;J{JV)IWyMFEYM+D;1&EHhfBm!Rd|;wp)~ ziz+3SN<1=m*rx=$OIHg%q*|otpvFTh+w!>1F)>TXt^r~07K6ZU5cX~YA-Azw;z#Q- zY}Z;0JKL?%fvx@Qs6gM$dJ!KecCSUET${!Xftbv{&KQ)=I#9|_f%3f;(e0CPWhan+ zJ&q`H6iz*i^wU8^m#X0$A*Ap3V`NhhOE0f9?%Q5JDREw_!R@()(%m;u`j-%OMc}qw zLz-(w)EvE zawp%AFXbYCN+DayDGK;pN)^t+KG8OXy{E2_Y~h)A-0-uZ6Pnth}VqC-KvQ7K!)Tph~P+L75JX7dYDms};WlO&-;T=BqMC zTul;t%i;W92IsZXtl;`ex8UQ|AM?-;RhMS)!NoR-iW@aHmVz*AjX7|1h1bH(%Xdor zyAFt3wLolI21HJE37)eVhcJlSyg-z$1#tQj!NviZza26Ww-4YJ>-Gcjc^?oL+kjZP z2PxBvvUfLBt%fuiKzU*ZlzSUex&>vYA8Jt(=4Cp3GRyrYbL2d(wdEX`xn9`9r(s)v z3h7G-Wq&u+s$)p+yHHXmR9(>A(ALX%UvMD5A$CUqdVK>c3Wi}_cpcWn6Z3#69BMH2a5mz delta 40 jcmbQWjd|8K<_$L(B^iJ~4v1}_7{q4;5t~0UYTg6@uk8ni diff --git a/app/public/images/merise/mpd-basic.webp b/app/public/images/merise/mpd-basic.webp new file mode 100644 index 0000000000000000000000000000000000000000..917ae753f923b86e71319876cd883d7e70831537 GIT binary patch literal 29788 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 literal 0 HcmV?d00001