diff --git a/.crossnote/config.js b/.crossnote/config.js new file mode 100644 index 0000000..80613c4 --- /dev/null +++ b/.crossnote/config.js @@ -0,0 +1,15 @@ +({ + katexConfig: { + "macros": {} +}, + + mathjaxConfig: { + "tex": {}, + "options": {}, + "loader": {} +}, + + mermaidConfig: { + "startOnLoad": false +}, +}) \ No newline at end of file diff --git a/.crossnote/head.html b/.crossnote/head.html new file mode 100644 index 0000000..079058b --- /dev/null +++ b/.crossnote/head.html @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/.crossnote/parser.js b/.crossnote/parser.js new file mode 100644 index 0000000..0f6b5a9 --- /dev/null +++ b/.crossnote/parser.js @@ -0,0 +1,12 @@ +({ + // Please visit the URL below for more information: + // https://shd101wyy.github.io/markdown-preview-enhanced/#/extend-parser + + onWillParseMarkdown: async function(markdown) { + return markdown; + }, + + onDidParseMarkdown: async function(html) { + return html; + }, +}) \ No newline at end of file diff --git a/.vscode/ltex.dictionary.fr.txt b/.vscode/ltex.dictionary.fr.txt new file mode 100644 index 0000000..d2e75cf --- /dev/null +++ b/.vscode/ltex.dictionary.fr.txt @@ -0,0 +1 @@ +SGBD diff --git a/src/cours/CIEL1/00-ap/questions_entretiens.md b/src/cours/CIEL1/00-ap/questions_entretiens.md new file mode 100644 index 0000000..38272b4 --- /dev/null +++ b/src/cours/CIEL1/00-ap/questions_entretiens.md @@ -0,0 +1,39 @@ +# Entretiens de stage - Questions courantes + +#### Pouvez-vous vous présenter ? + +- Présentation personnelle +- Présentation du parcours : études et expériences (pro, associatives, personnelles...) + +#### Que savez-vous de nous ? + +- Activité de l'entreprise +- Quelques chiffres +- Quelques actualités si elles sont publiques +- Principaux concurrents + +#### Qu'est-ce qui a suscité votre intérêt pour cette offre ? + +Montrer que votre candidature est cohérente avec vos motivations, votre parcours ou vos objectifs + +#### Pourquoi souhaitez-vous venir chez nous ? + +Ici il s'agit de savoir ce qui vous intéresse chez cette entreprise : sa culture, sa notoriété, son activité, ses engagements... + +#### Pourquoi êtes vous le / la candidat.e idéal.e ? + +Montrer que vous savez où vous allez, et que vos expériences sont en adéquation avec l'offre. +C'est le moment de rentrer dans les détails d'un ou plusieurs projets pour montrer les compétences techniques ou humaines que vous avez. + +#### Parlez d'une situation dont vous êtes fier / avez réussi à mener un projet / résolu un problème + +Montrer que vous avez déjà réussi des choses, et montrer comment vous avez réagi dans ces circonstances. +Pas besoin d'un projet énorme : même une petite réalisation est déjà importante : il faut savoir vous valoriser, et mettre en avant vos compétences. + +#### Comment gérez-vous les remarques / critiques ? + +Montrer que vous avez conscience que les critiques et remarques sont nécessaires, et une occasion de s'améliorer. + +#### Où vous voyez vous dans 2 ans / 3 ans / 5 ans ? Quel est votre projet professionnel ? + +Montrer que vous avez un projet d'avenir, construit. Que vous savez où vous allez. Parlez objectifs professionnels ou poursuites d'études. Essayez de proposer quelque chose de réfléchi et ambitieux diff --git a/src/cours/CIEL1/07-bases-de-donnees/bases-de-donnees.md b/src/cours/CIEL1/07-bases-de-donnees/bases-de-donnees.md index f210215..b286880 100644 --- a/src/cours/CIEL1/07-bases-de-donnees/bases-de-donnees.md +++ b/src/cours/CIEL1/07-bases-de-donnees/bases-de-donnees.md @@ -47,4 +47,8 @@ ## TD - Requêtes (2 séances) -- Analyse de schéma, amélioration de schéma, création de petits schémas \ No newline at end of file +- Analyse de schéma, amélioration de schéma, création de petits schémas + + +# Ressources +[Merise](https://memento-dev.fr/docs/merise/mld) \ No newline at end of file diff --git a/src/cours/CIEL1/07-bases-de-donnees/fiche-sequence.md b/src/cours/CIEL1/07-bases-de-donnees/fiche-sequence.md new file mode 100644 index 0000000..8333be4 --- /dev/null +++ b/src/cours/CIEL1/07-bases-de-donnees/fiche-sequence.md @@ -0,0 +1,46 @@ +# Séquence 07 - Bases de données + +## Objectif +Découvrir la conception et le requêtage de bases de données. + +## Pré-requis +Ligne de commande sous Linux + +## Scénario pédagogique +### Démarche + +Modélisation d'une base de données de bout en bout + +### Organisation +#### S1 - +- **Apport de connaissances** : Dictionnaire de données + MCD + MLD +- **Activité** : Modélisation d'une base de données (MCD et MPD) +- **Structuration de connaissances** : MPD et Langage + création +- **Évaluation** + - C04 : + - Les spécifications du cahier des charges sont extraites + - C08 : + - Le travail est effectué selon les attentes exprimées de temps, de quantité ou de qualité + +#### S2 - +- **Apport de connaissances** : Droits et création +- **Activité** : Création + droits + requêtes +- **Structuration de connaissances** : Requêtage simple +- **Évaluation** + - C0 + - C0 + +#### S3 - +- **Apport de connaissances** : - +- **Activité** : Remédiation +- **Structuration de connaissances** : Requêtage avancé (jointures) +- **Évaluation** + - C0 + - C0 + +### Évaluation + +| Description | Formative | Sommative | Semaine | +| ----------- | --------- | --------- | ------- | +| Compétences | x | | 1 2 3 | +| Devoir | | x | 4 | \ No newline at end of file diff --git a/src/cours/CIEL1/07-bases-de-donnees/loueur_mcd.loo b/src/cours/CIEL1/07-bases-de-donnees/loueur_mcd.loo new file mode 100644 index 0000000..d45a909 Binary files /dev/null and b/src/cours/CIEL1/07-bases-de-donnees/loueur_mcd.loo differ diff --git a/src/cours/CIEL2/02-python-flask/python-flask.md b/src/cours/CIEL2/02-python-flask/python-flask.md index be2ad42..a3a947f 100644 --- a/src/cours/CIEL2/02-python-flask/python-flask.md +++ b/src/cours/CIEL2/02-python-flask/python-flask.md @@ -85,10 +85,10 @@ Séquence intervenant en fin de deuxième année, peu avant les projets et néce ### C01 - COMMUNIQUER EN SITUATION PROFESSIONNELLE FRANÇAIS/ANGLAIS -| Compétence | Connaissance | Niveau taxonomique | -| ---------- | ------------------------------------------------------------------------------------------------ | ------------------ | -| C01 | Communication écrite : cahiers des charges, dossiers de présentation | 3 | -| C01 | Règles de présentation et typographie | 3 | +| Compétence | Connaissance | Niveau taxonomique | +| ---------- | -------------------------------------------------------------------- | ------------------ | +| C01 | Communication écrite : cahiers des charges, dossiers de présentation | 3 | +| C01 | Règles de présentation et typographie | 3 | ### C02 - ORGANISER UNE INTERVENTION @@ -130,17 +130,17 @@ Séquence intervenant en fin de deuxième année, peu avant les projets et néce ### C08 - CODER -| Compétence | Connaissance | Niveau taxonomique | -| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | -| C08 | Langages de développement, description, création d’API et IDE associés | 4 | -| C08 | Spécificités des environnements de développement, test, production | 2 | -| C08 | Chaînes d’intégration et de déploiement | 2 | -| C08 | Bases de données et environnements de traitement de données | 4 | -| C08 | Programmation multitâche | 3 | -| C08 | Outils de documentation | 3 | +| Compétence | Connaissance | Niveau taxonomique | +| ---------- | ---------------------------------------------------------------------- | ------------------ | +| C08 | Langages de développement, description, création d’API et IDE associés | 4 | +| C08 | Spécificités des environnements de développement, test, production | 2 | +| C08 | Chaînes d’intégration et de déploiement | 2 | +| C08 | Bases de données et environnements de traitement de données | 4 | +| C08 | Programmation multitâche | 3 | +| C08 | Outils de documentation | 3 | ### C09 - INSTALLER UN RÉSEAU INFORMATIQUE -| Compétence | Connaissance | Niveau taxonomique | -| ---------- | ----------------------------------------------------------------------------- | ------------------ | -| C09 | Systèmes d’exploitation Windows, UNIX, virtualisation | 3 | \ No newline at end of file +| Compétence | Connaissance | Niveau taxonomique | +| ---------- | ----------------------------------------------------- | ------------------ | +| C09 | Systèmes d’exploitation Windows, UNIX, virtualisation | 3 | \ No newline at end of file diff --git a/src/cours/CIEL2/02-python-flask/tp/1_base_de_donnees.md b/src/cours/CIEL2/02-python-flask/tp/1_base_de_donnees.md index 42be204..5db0cda 100644 --- a/src/cours/CIEL2/02-python-flask/tp/1_base_de_donnees.md +++ b/src/cours/CIEL2/02-python-flask/tp/1_base_de_donnees.md @@ -123,7 +123,7 @@ Ou si Gitlab est prêt, sous forme de dépôt git. ```admonish travail - A l'aide du cahier des charges, définir le format qu'aura votre base de données. - A l'aide du cahier des charges, définir les utilisateurs et leurs droits. Utilisez la [documentation](https://www.postgresql.org/docs/current/index.html) si nécessaire. -- Écrire le script SQL permettant de créer votre base +- Écrire le **script SQL** (à versionner) permettant de créer votre base (schéma + droits) - L'appliquer pour le tester et le valider - Compléter le document et faire un nouveau commit. Vous pouvez en faire plusieurs si vous le jugez nécessaire. ``` diff --git a/src/cours/CIEL2/02-python-flask/tp/2_monitoring_app.md b/src/cours/CIEL2/02-python-flask/tp/2_monitoring_app.md new file mode 100644 index 0000000..f18c709 --- /dev/null +++ b/src/cours/CIEL2/02-python-flask/tp/2_monitoring_app.md @@ -0,0 +1,155 @@ +--- +puppeteer: + format: A4 + margin: + top: "0.5cm" + left: "0.5cm" + right: "0.5cm" + bottom: "0.5cm" +--- + +# Application Web - Activité 2 - Service d'observation des données d'utilisation de la machine + +## Objectifs + +- Développement d'une application Python qui collecte les métriques système +- Communication entre une application Python et une base PostgreSQL +- Développement d'une image Docker pour intégrer votre application dans le système + +## Évaluation + +- L'évaluation aura lieu + - au cours de l'activité sous forme orale + - à la fin de l'activité grâce aux livrables rendus + +### Compétences évaluées + + +## Validation +### Livrables + +Livrer le code et le dossier de conception à l'issue des 3 activités. + +### Résultats attendus + +- [ ] Un programme python qui observe les données du système et les enregistre en base de données +- [ ] Une image docker contenant le programme : le service de monitoring +- [ ] Une mise à jour du fichier docker-compose pour intégrer le service avec la base de données dans les bonnes pratiques de sécurité + +## Étapes + +### Étape 0 – Démarrage et configuration de l’environnement + +**Objectif :** Créer un environnement pour le développement de l'application de monitoring, et installation des dépendances. + +!!! example À faire + Nous repartons de l'environnement créé lors de l'activité précédente + - Créez un nouveau répertoire `monitoring` dans votre dépôt. + - Ajoutez-y un fichier [`requirements.txt`](https://pip.pypa.io/en/stable/reference/requirements-file-format/) listant les dépendances : `psutil==7.1.3` et `psycopg[binary]==3.2.12`. + - Créez un environnement virtuel Python (`venv`) et installez ces dépendances. (voir aide) + - Installer dépendances d'un `requirements.txt` : (dans un environnement virtuel activé) `pip install -r requirements.txt` + - À l’intérieur de `monitoring`, créez un sous-dossier `src` pour les sources Python, et dedans un fichier `app.py` + +!!! question Aide + - Un environnement virtuel Python (venv) est un espace isolé qui contient une installation indépendante de Python ainsi que ses propres bibliothèques, ce qui évite les conflits entre projets. + - Pour créer un venv, on utilise la commande : `python -m venv .venv`. + - Ensuite, on active cet environnement avec la commande `source .venv/bin/activate` + - Enfin, on peut installer des dépendances spécifiques au projet sans impacter l’installation globale de Python ni d’autres projets + +### Étape 1 – Script de collecte des données + +**Objectif :** Écrire la fonction qui collectera les données de fonctionnement du système + +!!! example À faire + - Écrivez une fonction `collect_metrics()` qui récupère les données de monitoring système. + - Cette fonction doit retourner un dictionnaire Python contenant les métriques nécessaires + - Utilisez la bibliothèque `psutil` et sa [documentation](https://psutil.readthedocs.io/en/latest/#) pour récupérer ces données + - Les données dont vous avez besoin sont celles demandées par le cahier des charges et pour lesquelles vous avez conçu votre base lors de l'activité précédente + - Écrivez une fonction main et appelez-la dans votre script. Elle devra appeler votre fonction `collect_metrics()`. + - Testez et validez votre code (en affichant, par exemple, le résultat obtenu) + - Complétez votre document de conception et faites un nouveau commit + +!!! note Dans le document de conception + Expliquez ce que vous avez réalisé dans cette partie + +### Étape 2 - Écriture en base de données + +**Objectif:** Écrire la fonction pour insérer les données récoltées en base de données + +!!! example À faire + - Récupérez les informations de connexion (hôte, base, utilisateur, mot de passe, port) [depuis les variables d’environnement](https://docs.python.org/3/library/os.html#os.environ) Python suivantes : `DB_HOST`, `DB_NAME`, `DB_USER`, `DB_PASSWORD`, `DB_PORT`. + - Utilisez `psycopg3.connect()` pour établir la connexion. + ```python + conn = psycopg3.connect( + host=DB_HOST, + dbname=DB_NAME, + user=DB_USER, + password=DB_PASSWORD, + port=DB_PORT + ) + ``` + - Écrire la fonction qui permettra d'insérer les données en base (voir aide). Cette fonction prendra en paramètre le dictionnaire créé dans l'étape précédente. + - Ajouter la nouvelle fonction à la fonction `main`. + - Pour tester votre programme localement (avec la base de données dans le conteneur) + - Lier le port 5432 du conteneur au port 5432 de la machine hôte dans le docker compose (et le relancer) + - Ajouter les variables d'environnement dans la commande permettant de lancer votre script, comme ci-dessous : + ```bash + DB_HOST=localhost DB_NAME=sysmon DB_USER=metricwriter DB_PASSWORD=metricwriter DB_PORT=5432 python app.py + ``` + - Tester votre code et le valider + - Pour finir, il faut utiliser `time.sleep` et une boucle `while` infinie dans `main` pour recommencer l'opération chaque seconde. + - La période de mesure doit être configurable par variable d'environnement également. 1 seconde sera la valeur par défaut. + - Mettre à jour le document de conception et faire un nouveau commit + +!!! question Aide + Pour insérer des données dans une base Postgres en Python : + ```py + cur = conn.cursor() # Création d'un curseur à partir de la connexion : c'est l'objet qui va permettre d'exécuter les commandes SQL. + sql = "remplacer par requête" # Définition de la requête SQL d'insertion sous forme de chaîne de caractères. Ici, il faut remplacer cette chaîne par la requête INSERT adaptée. + + cur.execute(sql, metrics) # Exécution de la requête SQL en passant les valeurs à insérer via le dictionnaire 'metrics'. Cela évite les injections SQL en utilisant des paramètres. + + conn.commit() # Validation de la transaction : sans cet appel, les changements effectués ne seraient pas enregistrés définitivement dans la base. + cur.close() # Fermeture du curseur pour libérer les ressources utilisées par cet objet. + conn.close() # Fermeture de la connexion à la base, elle doit être fermée proprement pour éviter les fuites de connexions et libérer les ressources. + ``` + +!!! warning Attention + Vous avez lié le port 5432 du conteneur postgres à celui de l'hôte. C'est utile en debug mais à proscrire en production, sauf si vous savez ce que vous faites. N'oubliez pas de retirer cette directive lorsque votre code est validé. + +!!! note Dans le document de conception + - Expliquez les différentes étapes pour se connecter et écrire dans une base de données PostgresSQL depuis un programme Python + - Le port 5432 est le port standard de postgreSQL. Quel est le risque si on le laisse mappé sur le port 5432 de la machine hôte ? + - Expliquer le fonctionnement actuel de votre programme + +### Étape 3 – Conteneurisation avec Docker + +!!! example À faire + - Créer un nouveau fichier appelé `Dockerfile` dans votre répertoire `monitoring`. Il servira à créer votre image docker pour le service de monitoring. + - Ce fichier sera basé sur l'image `python:3.13-slim-bookworm` + - Écrire le Dockerfile à l'aide des informations suivantes : + - S'inspirer de la [documentation de l'image Python](https://hub.docker.com/_/python/) + - Il faudra installer les dépendances du fichier `requirements.txt` + - Il faut ajouter les fichiers du répertoire `src` + - Votre commande sera `python app.py` + - Construire l'image pour valider sa compilation : `docker build -t monitoring-service monitoring` + +!!! note Dans le document de conception + - Expliquez l'intérêt d'utiliser `python:3.13-slim-bookworm` par rapport aux autres tags de l'image python (pourquoi `slim`, pourquoi `bookworm` ?) + - Pourquoi est-il inutile de créer un environnement virtuel dans notre image ? + - Expliquez les différentes étapes de votre Dockerfile et vos choix + +### Étape 4 – Intégration dans un environnement multi-conteneurs + +!!! example À faire + - Compléter le fichier `docker-compose.yml` pour y ajouter le service de monitoring. Compléter les informations : + - image : monitoring-service + - réseau : voir cahier des charges (architecture). Attention à le déclarer et à l'ajouter aussi au service postgres + - environment : variables de connexion à la base de données + - Démarrer votre stack et vérifier que tout fonctionne + +!!! note Dans le document de conception + - Pourquoi a-t-on choisi d'avoir un réseau distinct pour accéder à la base de données ? + - Expliquez ce que vous avez réalisé dans cette partie, et dans cette activité. + - Donnez les difficultés rencontrées et la manière dont vous les avez résolues. + diff --git a/src/cours/CIEL2/02-python-flask/tp/2_monitoring_app.pdf b/src/cours/CIEL2/02-python-flask/tp/2_monitoring_app.pdf new file mode 100644 index 0000000..f0e06b5 Binary files /dev/null and b/src/cours/CIEL2/02-python-flask/tp/2_monitoring_app.pdf differ diff --git a/src/slides/B1/db/01_modèle_de_données.md b/src/slides/B1/db/01_modèle_de_données.md new file mode 100644 index 0000000..03dadb3 --- /dev/null +++ b/src/slides/B1/db/01_modèle_de_données.md @@ -0,0 +1,451 @@ +--- +marp: true +theme: catppuccin +paginate: true +size: 4:3 +transition: coverflow +footer: '' +math: katex +lang: "fr" +--- + + + +# Bases de données - Modélisation + +--- + +## Modélisation + +Qu'est-ce que la modélisation ? +- **Analyse** et **conception** des informations +- **Représentation** de la structure des informations + +Objectif : +- Identifier les **éléments** (entités) logiques +- Identifier et tracer les **dépendances** (relations) logiques entre les entités + +C'est une représentation **abstraite** : on ignore les données individuelles elles-mêmes au profit de la structure + +--- + +### Méthode Merise + +- Méthodologie de modélisation française assez ancienne (années 70/80) +- Mais éprouvée et toujours d'actualité +- Propose plusieurs étapes sous forme de schémas + - Dictionnaire de données + - **MCD** : Modèle Conceptuel de Données + - **MLD** : Modèle Logique de Données + - **MPD** : Modèle Physique de Données +--- + +#### Dictionnaire de données + +- Document utilisé pour lister les informations à stocker en base +- Obtenu suite à l'analyse des besoins du client +- Simple et compréhensible de tout le monde + +--- + +#### MCD - Modèle Conceptuel de Données + +- Schéma utilisé pour représenter les données extraites du dictionnaire +- Regroupe par **entités** et montre les **associations** (relations) +- Reste compréhensible de tout le monde (pas de détails techniques) +- Important car la suite dépend de lui + +--- + +#### MLD - Modèle Logique de Données + +- Schéma qui découle directement du MCD +- Ajoute des détails techniques : + - Découpage en **tables** et **colonnes** + - **Clés** + - **Tables de jointure** + +--- + +#### MPD - Modèle Physique de Données + +- Schéma qui représente les données de manière physique + - Tient compte des spécificités du **SGBD** + - Ajoute les **types** de données, les **index**, les **contraintes**... + +- SGBD = Système de Gestion de Bases de Données + - Logiciel dédié à la gestion et manipulation des données + +--- + +## Merise en détails + +--- + + + + +### Demande du client + +Une loueur de véhicules souhaite construire une base de données pour +- Enregistrer les véhicules que ses client peuvent louer et les dates de location. +- Il veut pouvoir les joindre facilement, donc il voudra leurs noms et prénoms, ainsi qu'un numéro de téléphone. +- La loi l'oblige également à stocker le numéro du permis de conduire des conducteurs et conductrices, en cas d'infraction du code de la route. +- Par ailleurs, il souhaite savoir quel est le kilométrage des véhicules en sa possession, et leur prix journalier +- Pour finir, il veut stocker certaines informations sur les modèles qu'il a en stock pour aider les clients à choisir un véhicule (marque et modèle, nombre de places, type de véhicule, volume pour les utilitaires...) + +--- + +### Le dictionnaire de données + +- Document qui contient les informations sur les données à stocker +- Tiré des informations données par le client +- À valider avec le client -> il doit le comprendre +- Informations du dictionnaire de données + - Nom + - Format + - Longueur + - Contraintes + - Document (le "groupe" de données) + +--- + +#### Les formats + +- **Alphabétique** + - A-Z uniquement +- **Alphanumérique** + - A-Z et 0-9, éventuellement caractères spéciaux +- **Numérique** + - Nombres entiers, flottants etc.. +- **Date** +- **Logique** + - Vrai/Faux + +--- + +#### Les contraintes + +Ce sont les contraintes du client +- Données **obligatoires** +- Données **uniques** +- Valeurs par défaut +- Etc. + +--- + + + +#### Dans notre exemple + +**Document** : Conducteur + +| Nom | Format | Longueur | Contrainte | +| ---------------------------- | -------------- | -------- | ------------------- | +| Nom | Alphabétique | 30 | Obligatoire | +| Prénom | Alphabétique | 30 | Obligatoire | +| Numéro de téléphone | Alphanumérique | 20 | Obligatoire | +| Numéro de permis de conduire | Alphanumérique | 50 | Obligatoire, Unique | + +--- + +**Document** : Véhicule + +| Nom | Format | Longueur | Contrainte | +| --------------- | -------------- | -------- | ------------------- | +| Immatriculation | Alphanumérique | 30 | Obligatoire, Unique | +| Kilométrage | Numérique | - | Obligatoire | +| Prix journalier | Numérique | - | Obligatoire | + +--- + +**Document** : Modèle + +| Nom | Format | Longueur | Contrainte | +| ---------------- | -------------- | -------- | -------------------------------- | +| Marque | Alphanumérique | 30 | Obligatoire | +| Modèle | Alphanumérique | 30 | Obligatoire | +| Nombre de places | Numérique | - | Obligatoire | +| Volume | Numérique | - | Obligatoire pour les utilitaires | +| Type de véhicule | Alphabétique | 30 | | + +L'association marque-modèle est unique (pour simplifier l'exemple) + +--- + +**Document** : Location + +| Nom | Format | Longueur | Contrainte | +| ------------- | ------ | -------- | ----------- | +| Date de début | Date | - | Obligatoire | +| Date de fin | Date | - | Obligatoire | + +--- + +### MCD - Le Modèle Conceptuel de Données + +- Représenter les données récupérées dans le dictionnaire +- Doit rester compréhensible par le client + +--- + +#### Le diagramme + +![MCD base](images/mcd-base.png) + +--- + +#### Vocabulaire + +- Le diagramme possède des **entités** + - carrés jaunes +- qui sont composées d'**attributs** + - certains attributs peuvent être **uniques** + - écrit en gras + - leur valeur ne peut se retrouver qu'une seule fois + - certains attributs peuvent être **discriminants** + - écrit en gras et souligné + - ils **identifient** de manière unique une occurrence + +--- + +- Le diagramme possède des **associations** + - Bulle ovale + - Représentée par un **verbe à l'infinitif** +- Les associations ont une **cardinalité** + - Nombre d'occurrences d'une entité par rapport à une autre + +--- + +#### Les cardinalités + +- Élément essentiel du MCD +- Définit le nombre d'occurrences d'une entité par rapport à une autre (l'entité est associée à X occurrences) +- Cardinalité est définie par deux valeurs : + - **Minimum** d'occurrences + - **Maximum** d'occurrences + - On l'écrit sous forme : **Min,Max** + +--- + +- Valeurs courantes : + - **0** : signifie "0 occurrence" + - **1** : signifie "1 occurrence" + - **N** : signifie "n'importe quel nombre d'occurrences" +- Cardinalités courantes : (l'entité est associée à) + - **0,1** : Soit aucune soit une occurrence + - **1,1** : Exactement 1 occurrence + - **0,n** : N'importe quel nombre d'occurrences + - **1,n** : Au moins une occurrence + +--- + +#### Associations réflexives + +- Certaines entités peuvent être reliées à elles-mêmes par une association + - Ce sont des **associations réflexives** +- **Exemple** : Genres de livres + - Un genre peut regouper des sous-genres plus précis + - On crée une association réflexive entre l'entité "Genre" et elle-même + - Crée une hiérarchie de genres + +--- + +#### Héritage + +**L'héritage** va nous permettre de rassembler des propriétés identiques dans une entité commune (appelée **entitée générique**) et créer des entités plus spécialisées appelées **entitées spécialisées** + +![heritage](images/heritage.png) + +--- + +#### Dans notre exemple + +![mcd height:600px](images/mcd.png) + +--- + + +#### Choix du discriminant + +- Attributs peuvent identifier de manière unique un enregistrement + - **Discriminant naturel** + - Attribut appartenant à l'objet qui identifie de manière unique + - ex: numéro de sécurité sociale + - **Discriminant synthétique** + - Attribut créé de toutes pièces pour identifier l'objet + +- Préférer un discriminant synthétique + - Facilite la maintenance + - Facilite les changements plus tard + - Réduit le nombre de modifications quand on change le discriminant + +--- + +![mcd height:600px](images/mcd-id.png) + +--- + +### MLD - Le Modèle Logique de Données + +- Le MLD est la suite logique et directe du MCD +- Il en découle directement par l'application de règles simples +- Transforme le MCD en modèle qui peut être implémenté dans un SGBD +- Ajoute des détails techniques + +--- + +#### Convertir les entités et attributs + +- Les **entités** deviennent des **tables** +- Les **attributs discriminants** (gras soulignés) deviennent des **clés primaires** + - Clé primaire : donnée (composée d'une ou plusieurs colonnes) qui permet d'identifier de manière unique un enregistrement dans une table +- Les **attributs uniques** (gras) deviennent des **colonnes uniques** +- Les autres **attributs** deviennent des **colonnes** + +--- + +#### Convertir les associations + +Il faut se baser sur la cardinalité de chaque association. + +Cas possibles (x vaut 0 ou 1) : +- (x, n) - (x, 1) : Many to One / One to Many +- (x, n) - (x, n) : Many to Many +- Associations réflexives + +--- + +##### Many to One - (x, n) - (x, 1) + +!!! success La règle +- On ajoute une **clé étrangère** dans la table du côté de la relation **One** (x, 1) +!!! + +- La clé étrangère est la clé primaire de la table côté **Many** +- L'héritage entre dans ce cas : + - On considère qu'une entité spécialisée peut spécialiser exactement 1 entité générique (1,1) + - Une entité générique peut être spécialisée par n entités spécialisées (0,n) + - On est dans une relation (0,n) - (1,1) + +--- + +###### Exemple Many to One + +| MCD | MLD | +| -------------------------------------------- | ---------------------------------------------- | +| ![manytoone_mcd](images/many-to-one-mcd.png) | ![many to one mld](images/many-to-one-mld.png) | + +--- + +###### Exemple héritage + +| MCD | MLD | +| ---------------------------------------------------- | ---------------------------------------------------- | +| ![heritage mcd width:400px](images/heritage-mcd.png) | ![heritage mld width:400px](images/heritage-mld.png) | +--- + +##### Many to Many + +- Dans ce cas impossible de stocker une clé étrangère dans l'une des deux tables : il faudrait pouvoir stocker des listes de clés. + +!!! success La règle +On crée une **table de jointure** qui va relier les deux tables +!!! + +- **Nom** : composé des deux tables qu'elle relie, avec le nom de l'association netre deux : `entity1_action_entity2` +- **Colonnes** : Clés étrangères des deux tables qu'elle relie + autres colonnes de la relation + +--- + +###### Exemple + +![Many to Many width:800px](images/manytomany-mcd.png) +![Many to Many MLD width:800px](images/manytomany-mld.png) + +--- + +##### Associations réflexives + +Dans ce cas on applique exactement les mêmes règles : +- Si la relation est **Many to One** : on ajoute une **clé étrangère** + - qui sera la clé primaire de la même table +- Si la relation est **Many to Many** : on ajoute une **table de jointure** + - qui contiendra des clés primaires de la table +--- +###### Exemple association réflexive Many to One +![reflexive-mcd](images/reflexive-mcd.png) +![reflexive-mld](images/reflexive-mld.png) + +--- +###### Exemple association réflexive Many to Many +![reflexive-many-mcd](images/reflexive-many-mcd.png) +![relflexive-many-mld](images/reflexive-many-mld.png) + +--- + +##### Associations avec plus de deux tables + +!!! success La règle +On crée une **table de jointure** qui va relier toutes les tables +!!! + +| MCD | MLD | +| ------------------------------------------- | ----------------------------------------- | +|![ternaire-mcd width:400px](images/ternaire-mcd.png)|![ternaire-mld width:400px](images/ternaire-mld.png)| + +--- + +##### Cas particuliers + +- (0, 1) - (1, 1) : On utilisera une clé étrangère + - comme relation Many to One où n = 1 +- (1, 1) - (1, 1) : Ce type de relation n'a pas de sens + - Si cela arrive c'est que vous avez découpé en deux entités ce qui aurait dû n'en faire qu'une + +--- + +#### Dans notre exemple + +| MCD | MLD | +| ------------------------------------------- | ----------------------------------------- | +| ![ex-mcd2 height:550px](images/ex-mcd2.png) | ![ex-mld height:550px](images/ex-mld.png) | + +--- + +## MPD - Modèle Physique de données \ No newline at end of file diff --git a/src/slides/B1/db/images/ex-mcd2.png b/src/slides/B1/db/images/ex-mcd2.png new file mode 100644 index 0000000..977a209 Binary files /dev/null and b/src/slides/B1/db/images/ex-mcd2.png differ diff --git a/src/slides/B1/db/images/ex-mld.png b/src/slides/B1/db/images/ex-mld.png new file mode 100644 index 0000000..05b8c2f Binary files /dev/null and b/src/slides/B1/db/images/ex-mld.png differ diff --git a/src/slides/B1/db/images/heritage-mcd.png b/src/slides/B1/db/images/heritage-mcd.png new file mode 100644 index 0000000..78305d4 Binary files /dev/null and b/src/slides/B1/db/images/heritage-mcd.png differ diff --git a/src/slides/B1/db/images/heritage-mld.png b/src/slides/B1/db/images/heritage-mld.png new file mode 100644 index 0000000..db1c2fb Binary files /dev/null and b/src/slides/B1/db/images/heritage-mld.png differ diff --git a/src/slides/B1/db/images/heritage.png b/src/slides/B1/db/images/heritage.png new file mode 100644 index 0000000..33207ac Binary files /dev/null and b/src/slides/B1/db/images/heritage.png differ diff --git a/src/slides/B1/db/images/many-to-one-mcd.png b/src/slides/B1/db/images/many-to-one-mcd.png new file mode 100644 index 0000000..e383a8a Binary files /dev/null and b/src/slides/B1/db/images/many-to-one-mcd.png differ diff --git a/src/slides/B1/db/images/many-to-one-mld.png b/src/slides/B1/db/images/many-to-one-mld.png new file mode 100644 index 0000000..1356c96 Binary files /dev/null and b/src/slides/B1/db/images/many-to-one-mld.png differ diff --git a/src/slides/B1/db/images/manytomany-mcd.png b/src/slides/B1/db/images/manytomany-mcd.png new file mode 100644 index 0000000..ddbf6fd Binary files /dev/null and b/src/slides/B1/db/images/manytomany-mcd.png differ diff --git a/src/slides/B1/db/images/manytomany-mld.png b/src/slides/B1/db/images/manytomany-mld.png new file mode 100644 index 0000000..f2bfb5f Binary files /dev/null and b/src/slides/B1/db/images/manytomany-mld.png differ diff --git a/src/slides/B1/db/images/mcd-base.png b/src/slides/B1/db/images/mcd-base.png new file mode 100644 index 0000000..c511521 Binary files /dev/null and b/src/slides/B1/db/images/mcd-base.png differ diff --git a/src/slides/B1/db/images/mcd-id.png b/src/slides/B1/db/images/mcd-id.png new file mode 100644 index 0000000..66c405d Binary files /dev/null and b/src/slides/B1/db/images/mcd-id.png differ diff --git a/src/slides/B1/db/images/mcd.png b/src/slides/B1/db/images/mcd.png new file mode 100644 index 0000000..0b7a366 Binary files /dev/null and b/src/slides/B1/db/images/mcd.png differ diff --git a/src/slides/B1/db/images/reflexive-many-mcd.png b/src/slides/B1/db/images/reflexive-many-mcd.png new file mode 100644 index 0000000..5594f59 Binary files /dev/null and b/src/slides/B1/db/images/reflexive-many-mcd.png differ diff --git a/src/slides/B1/db/images/reflexive-many-mld.png b/src/slides/B1/db/images/reflexive-many-mld.png new file mode 100644 index 0000000..86d2648 Binary files /dev/null and b/src/slides/B1/db/images/reflexive-many-mld.png differ diff --git a/src/slides/B1/db/images/reflexive-mcd.png b/src/slides/B1/db/images/reflexive-mcd.png new file mode 100644 index 0000000..b03f10d Binary files /dev/null and b/src/slides/B1/db/images/reflexive-mcd.png differ diff --git a/src/slides/B1/db/images/reflexive-mld.png b/src/slides/B1/db/images/reflexive-mld.png new file mode 100644 index 0000000..edb068d Binary files /dev/null and b/src/slides/B1/db/images/reflexive-mld.png differ diff --git a/src/slides/B1/db/images/ternaire-mcd.png b/src/slides/B1/db/images/ternaire-mcd.png new file mode 100644 index 0000000..4f8a674 Binary files /dev/null and b/src/slides/B1/db/images/ternaire-mcd.png differ diff --git a/src/slides/B1/db/images/ternaire-mld.png b/src/slides/B1/db/images/ternaire-mld.png new file mode 100644 index 0000000..295a794 Binary files /dev/null and b/src/slides/B1/db/images/ternaire-mld.png differ