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 0000000..a19b3fe Binary files /dev/null and b/app/public/merise/mcd-1.webp differ diff --git a/app/public/merise/mcd-2.webp b/app/public/merise/mcd-2.webp new file mode 100644 index 0000000..47b6cb3 Binary files /dev/null and b/app/public/merise/mcd-2.webp differ