From 90c2773de171d4140518f9d989fbb55503984908 Mon Sep 17 00:00:00 2001 From: GauthierWebDev Date: Fri, 11 Apr 2025 15:39:38 +0200 Subject: [PATCH] feat: Add 'question' icon and update tags for question type --- app/components/syntax/Callout.tsx | 1 + app/components/syntax/Icon.tsx | 1 + .../modele-conceptuel-de-donnees/page.md | 118 ++++++++++++++++++ app/data/docs/merise/page.md | 18 +++ app/lib/navigation.ts | 1 + app/markdoc/tags.tsx | 2 +- app/public/merise/mcd-1.webp | Bin 0 -> 7768 bytes app/public/merise/mcd-2.webp | Bin 0 -> 10346 bytes 8 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 app/data/docs/merise/modele-conceptuel-de-donnees/page.md create mode 100644 app/public/merise/mcd-1.webp create mode 100644 app/public/merise/mcd-2.webp diff --git a/app/components/syntax/Callout.tsx b/app/components/syntax/Callout.tsx index 566b0b7..fc1e4f7 100644 --- a/app/components/syntax/Callout.tsx +++ b/app/components/syntax/Callout.tsx @@ -17,6 +17,7 @@ const styles = { const icons = { note: (props: { className?: string }) => , warning: (props: { className?: string }) => , + question: (props: { className?: string }) => , }; export function Callout({ diff --git a/app/components/syntax/Icon.tsx b/app/components/syntax/Icon.tsx index 862ce62..cbef5a9 100644 --- a/app/components/syntax/Icon.tsx +++ b/app/components/syntax/Icon.tsx @@ -14,6 +14,7 @@ const icons = { theming: ThemingIcon, lightbulb: LightbulbIcon, warning: WarningIcon, + question: WarningIcon, }; const iconStyles = { diff --git a/app/data/docs/merise/modele-conceptuel-de-donnees/page.md b/app/data/docs/merise/modele-conceptuel-de-donnees/page.md new file mode 100644 index 0000000..4fbfbcc --- /dev/null +++ b/app/data/docs/merise/modele-conceptuel-de-donnees/page.md @@ -0,0 +1,118 @@ +--- +title: Introduction à Merise +description: Parlons un peu de Merise, la fameuse méthodologie de modélisation pour la conception de bases de données. +tags: [Backend, Merise, BDD, MCD, MLD, MPD, SQL] +--- + +On va enfin pouvoir commencer à réaliser notre premier schéma : le **MCD** _(Modèle Conceptuel de Données)_ ! + +Mais déjà... qu'est-ce que c'est que ce MCD ? + +## Qu'est-ce que le MCD ? + +Le **MCD** est un schéma qui va nous permettre de représenter les données que l'on a récupérées dans le dictionnaire de données. + +Il va nous permettre de représenter les différentes données que l'on a, regroupée dans un rectangle nommé **entité**, ainsi que les relations entre elles. +On devra également indiquer les **cardinalités** de chaque relation entre les **entités**. + +Tout comme le dictionnaire de données, ce schéma doit rester compréhensible par le client. +Il doit donc être le plus simple possible, et ne pas contenir de détails techniques. + +Pour ce schéma _(ainsi que les suivants)_, on va utiliser le logiciel **Looping**. + +## Définitions + +Tu l'auras remarqué, ici on ne parle pas de "table" ou de "colonne". +On va exploiter d'autres termes comme **entité**, **attribut** ou **relation**. + +Voici un petit lexique pour t'aider à comprendre : + +| Terme | Définition | +| --------------------------------------- | ------------------------------------------------------------------------------------- | +| **Entité** | Représentation d'un regroupement de données _(rectangle)_ | +| **Attribut** | Donnée précise d'une entité | +| **Relation** | Lien entre deux entités _(bulle ovale/arrondie)_, accompagné d'un verbe à l'infinitif | +| **Cardinalité** | Nombre d'occurrences _(minimum et maximum)_ d'une entité par rapport à une autre | +| **Discriminant** _(ou **déterminant**)_ | Attribut qui permet d'identifier une entité de manière unique _(ex: matricule)_ | + +C'est tout un lexique à apprendre, mais pas de panique tu vas vite t'y habituer ! + +## Premières entités + +Commençons par créer notre MCD avec les données que l'on a récupérées dans le dictionnaire de données ! +En reprenant notre tableau précédent, on constate que l'on a : + +- **Pomme de terre** +- **Salarié** +- **Vente** + +Dans un premier temps, concentrons-nous sur les deux premières entités : **Pomme de terre** et **Salarié**. + +On va donc créer deux rectangles, un pour chaque entité. +Dans chacune d'elles, on va ajouter les attributs que l'on a récupérés dans le dictionnaire de données. + +On se retrouve donc avec un schéma similaire à celui-ci : + +![MCD - Entités (étape 1)](/merise/mcd-1.webp) + +On a donc deux entités : **Pomme de terre** et **Salarié**. +Chacune d'elles contient les attributs que l'on a récupérés dans le dictionnaire de données. + +Avant d'aller plus loin, on va analyser ce qu'on a fait. + +### Entité "Pomme de terre" + +L'entité **Pomme de terre** contient les attributs suivants : + +- **Variété** : Nom de la variété de la pomme de terre +- **Stock** : Quantité de pommes de terre en stock + +### Entité "Salarié" + +L'entité **Salarié** contient les attributs suivants : + +- **Matricule** : Numéro d'immatriculation du salarié +- **Nom** : Nom du salarié +- **Prénom** : Prénom du salarié + +## Spécificité des attributs d'entité + +C'est un bon début, mais il nous manque des choses ! +Il est essentiel de pouvoir identifier une ressource de manière unique. + +Côté base de données on parle souvent de **clé primaire** _(ou **primary key**)_, mais souvenons-nous que notre document doit rester compréhensible par le client. +On parlera donc de **discriminant** _(ou **déterminant**)_. + +Si on regarde notre entité **Pomme de terre**, on peut se rendre compte que l'on n'a pas d'attribut qui permet d'identifier une pomme de terre de manière unique. +On va donc ajouter un nouvel attribut : **Code pomme de terre**. + +Ce terme se veut simple et compréhensible par le client, mais il est important de lui expliquer que ce code est unique pour chaque pomme de terre. +On va donc ajouter cet attribut à notre entité **Pomme de terre**. + +Pour l'entité **Salarié**, on a déjà un attribut qui permet d'identifier un salarié de manière unique : **Matricule**. +On va donc le garder tel quel, en le considérant comme un **discriminant**. + +On va donc mettre à jour notre MCD avec les nouveaux attributs : + +![MCD - Entités (étape 2)](/merise/mcd-2.webp) + +Et déjà, c'est beaucoup mieux ! + +{% callout type="warning" title="Discriminant et ID" %} + +Tu l'auras remarqué, je n'ai pas utilisé le terme `ID` pour désigner le **discriminant**. +La raison est simple : le terme `ID` est souvent utilisé pour désigner un identifiant **technique**. + +Il ne s'agit pas d'une donnée réelle à proprement parler, mais d'un identifiant qui va nous permettre de retrouver une donnée dans la base de données. + +Le client n'ayant pas besoin de savoir ce qu'est un identifiant technique, on va préférer utiliser le terme **discriminant** ou **déterminant**. + +{% /callout %} + +## Ressources supplémentaires + +- [La vérité sur les id - Jean Prulière](https://jeanpruliere.medium.com/la-v%C3%A9rit%C3%A9-sur-les-id-507134adda12) + +--- + +Prochaine étape, on parle du **MLD** _(Modèle Logique de Données)_ ! diff --git a/app/data/docs/merise/page.md b/app/data/docs/merise/page.md index 341600e..90bc534 100644 --- a/app/data/docs/merise/page.md +++ b/app/data/docs/merise/page.md @@ -50,6 +50,24 @@ Merise étant français, la plupart des outils internationaux ne sont pas adapt Pour toutes les rubriques suivantes, **Looping** sera utilisé comme outil. +## Ressources + +{% callout type="warning" title="Ressources disponibles sur internet" %} + +**Attention !** + +Beaucoup de ressources sur internet parlent de Merise, mais elles ne sont pas forcément justes. + +Peu importe l'origine de la ressource, il est important de vérifier les informations et de ne pas se fier aveuglément à ce qui est écrit. +Je recommande énormément le livre [Guide pratique (4e édition)](https://www.editions-eni.fr/livre/merise-guide-pratique-4e-edition-modelisation-des-donnees-et-des-traitements-manipulations-avec-le-langage-sql-conception-d-une-application-mobile-android-ou-ios-9782409046667) de **Jean-Luc Baptiste**, aux **Éditions ENI**. + +{% /callout %} + +- [Looping](https://looping-mcd.fr/) +- [Mocodo](https://mocodo.net/) +- [La vérité sur les id - Jean Prulière](https://jeanpruliere.medium.com/la-v%C3%A9rit%C3%A9-sur-les-id-507134adda12)) +- [Merise - Wikipedia]() + --- Prochaine étape, on parle du **dictionnaire de données** ! diff --git a/app/lib/navigation.ts b/app/lib/navigation.ts index f852fb4..4d6b80e 100644 --- a/app/lib/navigation.ts +++ b/app/lib/navigation.ts @@ -15,6 +15,7 @@ export const navigation = [ links: [ { title: "Introduction", href: "/docs/merise" }, { title: "Dictionnaire de données", href: "/docs/merise/dictionnaire-de-donnees" }, + { title: "Modèle Conceptuel de Données", href: "/docs/merise/modele-conceptuel-de-donnees" }, ], }, ]; diff --git a/app/markdoc/tags.tsx b/app/markdoc/tags.tsx index 06309f9..1f08a4b 100644 --- a/app/markdoc/tags.tsx +++ b/app/markdoc/tags.tsx @@ -9,7 +9,7 @@ const tags = { type: { type: String, default: "note", - matches: ["note", "warning"], + matches: ["note", "warning", "question"], errorLevel: "critical", }, }, diff --git a/app/public/merise/mcd-1.webp b/app/public/merise/mcd-1.webp new file mode 100644 index 0000000000000000000000000000000000000000..a19b3fe77f3842e05600f3e54ad62b2fc4a32468 GIT binary patch literal 7768 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 IsK5XK0MBb8YybcN literal 0 HcmV?d00001