name: inverse layout: true class: center, middle, inverse --- # Base de données - CM2 ## Inès de Courchelle ## 2024-2025 ![image](img/CY-tech.png) --- layout: false # Rappel ## Exemple d'un MCD complet
--- # Rappel ## Exemple d'un MCD complet .pull-left[ #### Le MCD
] .pull-right[ #### Les cardinalités - une personne est sponsorisée par un et un seul skateshop - un skateshop sponsorise 0 ou plusieurs personnes - un skateshop est implanté dans une seule et unique ville - une ville a 0 ou plusieurs skateshop - Une personne achete un ou plusieurs skate dans un ou plusieurs skateshop ] --- # Du MCD au MLD ? ## Mais Pourquoi ? - Vérifier l'intégrité des entités et des attributs - chaque propriété doit être élémentaire - chaque information ne doit apparaître qu'une seule fois dans une entité donnée - chaque propriété doit prendre une et une seule valeur - Éviter la redondance d'information - Avoir un langage se rapprochant de la machine
--- # Comment passer du MCD au MLD ? ## Plan 1. Vérification de notre MCD 2. Règles de passage du MCD au MLD 3. Élaboration des dépendances fonctionnelles
--- # Comment passer du MCD au MLD ? ## Plan 1. **Vérification de notre MCD** 2. Règles de passage du MCD au MLD 3. Élaboration des dépendances fonctionnelles
--- # Vérification du MCD ## Plusieurs cas 1. Propriété élémentaire 2. Intégrité référentielle 3. Attribut multiple 4. Attribut dérivé 5. Fusion/suppression ## Objectif Vérifier si notre modèle est correcte et apporter les corrections --- # Vérification du MCD ## Propriété élémentaire
## Explication Ici, l'attribut .under[membres] peut prendre plusieurs valeurs | id | nom | dateDeFormation | membres | | --- | --- | ---- | --- | | 01 | Led Zeppelin | 1968 | {Jimmy Page, Robert Plant, John Paul Jones, Bonzo } | | 02 | Les Nuls | 1987 | {Alain Chabat, Chantal Lauby, Dominique Farrugia, Bruno Carette} | --- # Vérification du MCD ## Solution - L'attribut membre est un ensemble/tableau - Il faut créer une entité ## Propriété élémentaire
--- # Vérification du MCD ## Contrainte d'intégrité
## Explication Quelle est le rapport entre l'âge et l'appelation d'une matière ?
--- # Vérification du MCD ## Solution - Il ne faut pas pas mélanger les torchons et les serviettes - Il ne faut pas pas mélanger des choux et des carottes - ... - .underR[C'est pas de l'informatique, c'est du rangement !] ## Contrainte d'intégrité
--- # Vérification du MCD ## Attribut multiple
## Pareil que la contrainte d'intégrité
--- # Vérification du MCD ## Entité .pull-left[
] .pull-right[
]
## Transposition | id | nom | prénom | numéroTel1 | numéroTel2 | | --- | --- | ---- | --- | | | 01 | Neill | Sam | 05 59 42 54 54 | 06 58 54 45 54 | | 02 | Goldblum | Jeff | 05 59 66 66 66 | 06 66 66 66 66 | - Si Neill change de numéro de téléphone. Lequel, je change ? - Si Jeff Goldblum possède un 3ieme numéro de téléphone. Je le rajoute, où ? --- # Vérification du MCD ## Attribut multiple
--- # Vérification du MCD ## Attribut dérivé
## La règle Il est interdit de mettre de stocker des attributs que l'on peut calculer --- # Vérification du MCD ## Fusion/suppression
--- # Comment passer du MCD au MLD ? ## Plan 1. Vérification de notre MCD 2. **Règles de passage du MCD au MLD** 3. Élaboration des dépendances fonctionnelles
--- # Passage du MCD au MLD ## Objectifs - Reprendre le contenu du MCD mais préciser la structure et l'organisation des données - Formater les données pour les convertir à un format << Ordinateur >> ## Format - Une ligne = Une relation - Les attributs sont entre parenthéses - Les clés sont soulignées --- # Passage du MCD au MLD ## Vocabulaires .under[Clé] est un ensemble minimal des attributs de la relation dont les valeurs identifient à coup sûr une occurrence .under[Clé primaire] est une des clés candidates .under[Clé étrangère] est formée d'un ou plusieurs attributs qui constituent une clé primaire dans une autre relation
--- # Clé primaire ## Objectif - Rendre une spécialisation d'une entité unique - l'id ? nan ? .underR[On l'a déjà vu ?]
--- # Clé primaire ## Dans notre cas
## Mais comment ? #### Comment différencier les deux personnes
--- # Clé primaire ## Dans notre cas
## Mais comment ? #### Le numéro de téléphone ?
*Mauvaise idée s'ils changent ?* --- # Clé primaire ## Dans notre cas
## Mais comment ? #### Ajouter une clé unique par entité
--- # Clé primaire ## Du coup ? La clé primaire est donc la clé que l'on soulignait dans le MCD
## Comment on la représente dans le MLD ? Pareil on la souligne (*on va voir ça après*) --- # Clé étrangère ## Ojectifs - faire un lien avec une autre entité - récuperer toutes les informations d'une entité ## Format - Elle doit forcement être liée à une clé primaire - Exemple de son utilité
--- # Clé étrangère ## Exemple 1 - MCD
- Une voiture appartient à une seule personne - Une personne peut avoir plusieurs voiture ## Les informations .pull-left[ | id | designation | marque | | ----- | ---- | ----- | | 01 | Twingo | Renault | | 02 | Polo | volkswagen | | 03 | Polo | volkswagen | | 04 | 206 | Peugeot | ] .pull-right[ | id | nom | prénom | |----|------------|----------| | 01 | Dansletas | Alphonse | | 02 | Enfaillite | Mélusine | | 03 | Tuzzmanie | Gédéon | | 04 | Micotton | Milaine | ] .underR[Comment dire que Mélusine possède la Polo dont l'id est 02 ?] --- # Clé étrangère ## La solution On rajoute une colonne dans le tableau des voitures .pull-left[ | id | designation | marque | idPersonne | | ----- | ---- | ----- | ---- | | 01 | Twingo | Renault | 01 | | 02 | Polo | volkswagen | 02 | | 03 | Polo | volkswagen | 01 | | 04 | 206 | Peugeot | 03 | ] .pull-right[ | id | nom | prénom | |----|------------|----------| | 01 | Dansletas | Alphonse | | 02 | Enfaillite | Mélusine | | 03 | Tuzzmanie | Gédéon | | 04 | Micotton | Milaine | ]
- La personne 01 possède la voiture 01 et la voiture 03 - La personne 02 possède la voiture 02 - La personne 03 possède la voiture 04 - La personne 04 possède aucune voiture ! --- # Clé étrangère ## Exemple 2
## Les informations .pull-left[ | idActeur | nom | prenom | | ----- | ---- | ----- | | 01 | Radcliffe | Daniel | | 02 | Grint | Rupert | | 03 | Grant | Hugh | | 04 | Rickman | Alan | ] .pull-right[ | idFilm | titre | dateSortie | |--------|----------------------|-------------| | 01 | Harry Potter 1 | 05/12/2021 | | 02 | Raison et sentiments | 28/02/1996 | | 03 | Love Actually | 03/12/2003 | | 04 | Harry Potter 2 | 04/12/2002 | ]
**Comment je peux lier un acteur et un film ?** --- # Clé étrangère ## Comment je peux lier un acteur et un film ? réponse : via la clé étrangère .pull-left[ | idActeur | nom | prenom | | ----- | ---- | ----- | | 01 | Radcliffe | Daniel | | 02 | Grint | Rupert | | 03 | Grant | Hugh | | 04 | Rickman | Alan | ] .pull-right[ | idFilm | titre | dateSortie | |--------|----------------------|-------------| | 01 | Harry Potter 1 | 05/12/2021 | | 02 | Raison et sentiments | 28/02/1996 | | 03 | Love Actually | 03/12/2003 | | 04 | Harry Potter 2 | 04/12/2002 | ] ## Solution On va relier les ids de l'acteur et du film .pull-left[ | #idFilm | #idActeur | | --- | ----- | | 01 | 01 | | 01 | 02 | | 01 | 04 | | 03 | 03 | | 04 | 03 | ] .pull-right[
] --- # Les règles ## C'est partie ! Maintenant qu'on a compris le principe on va utiliser les règles officielles
--- # Les règles de passage ## R1 Toute entité est représentée par une relation. Chaque attribut de l'entité devient un attribut de la relation. La clé est conservé en tant que clé primaire de la relation. ## MCD
## MLD Médecin(
id
,nom,prénom,type) .underG[C'est pas compliqué, je recopie quoi ?!] --- # Les règles de passage ## R2 Toute association qui associe plus de deux entités (ternaire et au-delà) est représentée par une relation. La clé de chaque entité devient primaire et étrangére. ## MCD
## MLD .pull-left[ Film(
idFilm
,titre) Comedien(
idComedien
,nom) Realisateur(
idRealisateur
,nom) Tourner(#idFilm,#idComedien,#idRealisateur) ] .pull-right[ .underR[ATTENTION : Incomplet car il faut obligatoirement une clé primaire !] ] --- # Les règles de passage ## R2 - Il y a une seule clé primaire composée des 3 clés - Il y a 3 clés étrangéres ## MLD Film(
idFilm
,titre) Comedien(
idComedien
,nom) Realisateur(
idRealisateur
,nom) Tourner(
#idFilm,#idComedien,#idRealisateur
) --- # Les règles de passage ## R3 Toute association binaire dont les cardinalités maximales sont n de chaque coté devient une relation. La clé de chaque entité devient primaire et étrangére. ## MCD
## MLD .pull-left[ * Concert(
idConcert
,titre) * Musicien(
idMusicien
,nom) * Jouer(
#idConcert,#idMusicien
,date) ] .pull-right[ **TIPS** Quand une association a un attribut il y a toujours une relation qui est créée (et les cardinalités max sont toujours N et N des deux cotés) ] --- # Les règles de passage ## MCD
## MLD * Concert(
idConcert
,titre) * Musicien(
idMusicien
,nom) * Jouer(
#idConcert,#idMusicien
,date) **Ici la relation Jouer est éronnée d'un point de vue sémantique ** **Si un musicien joue dans un festival à plusieurs dates différentes !** --- # Les règles de passage ## R3 + affinités .pull-left[ | idConcert | titre | | ----- | ---- | | 01 | Woodstock | | 02 | Monterey Pop Festival | | 03 | Hellfest | | 04 | Garorock | ] .pull-right[ | idMusicien | nom | |------------|---------------| | 01 | Lemmy | | 02 | Country Joe | | 03 | Steel Panther | | 04 | Canned Heat | ]
.under[Comment faire apparaitre le fait que lemmy est joué plusieurs fois au hellfest ?] .pull-left[ |
#idConcert
|
#idMusicien
| date | | --- | ---- | --- | | 01 | 02 | 1969 | | 02 | 04 | 1967 | |
03
|
03
| 2017 | |
03
|
01
| 2015 | ] .pull-right[ |
#idConcert
|
#idMusicien
| date | | --- | ---- | --- | | 04 | 05 | 2013 | | 03 | 01 | 2005 | |
03
|
03
| 2019 | |
03
|
01
| 2010 | ]
.underR[Problème : 2 clés primaires identiques] --- # Les règles de passage ## Ai-je le droit d'avoir 2 clés primaires identiques ? NON ## Quel est l'objectif d'une clé primaire ? L'unicité ## Comment vais je faire ? .underG[Une solution => la clé primaire n'est plus un duo mais un trio] --- # Les règles de passage ## R3 + affinités - La clé primaire n'est plus un duo mais un trio - Comme cela la clé primaire est unique dans tous les cas
* Concert(
idConcert
,titre) * Musicien(
idMusicien
,nom) * Jouer(
#idConcert,#idMusicien,date
) .pull-left[ |
#idConcert
|
#idMusicien
|
date
| | --- | ---- | --- | | 01 | 02 | 1969 | | 02 | 04 | 1967 | |
03
|
03
|
2017
| |
03
|
01
|
2015
| ] .pull-right[ |
#idConcert
|
#idMusicien
|
date
| | --- | ---- | --- | | 04 | 05 | 2013 | | 03 | 01 | 2005 | |
03
|
03
|
2019
| |
03
|
01
|
2010
| ] --- # Les règles de passage ## R4 Toute association binaire dont les cardinalités maximales sont 1 (d'un côté) et n (de l'autre), n'est par représentée par une relation. ## MCD
## MLD * Sorcier(
idSorcier
,nom,prénom,age) * Baguette(
idBaguette
,taille,couleur,prix,description,#idSorcier) --- # Les règles de passage ## R4 Un autre exemple ! ## MCD
## MLD * Personnage(
idPerso
,nom,#idJoueur) * Joueur(
idJoueur
,nom) --- # Les règles de passage ## R4 Nous considérons le schèma suivant :
.pull-left[ .under[Joueur] | idJoueur | nom | | ---- | --- | | 01 | Sasha | | 02 | Ondine | | 03 | Pierre | ] .pull-right[ .under[Equipe] | idEquipe | intitulé | | ---- | --- | | 01 | bleu | | 02 | rouge | | 03 | jaune | ]
.underR[Comment lier Equipe et Joueur ?]
.underG[3 possibilités que l'on va tester] 1. Créer une nouvelle relation 2. Mettre la clé étrangère idJoueur dans Equipe 3. Mettre la clé étrangère de idEquipe dans Joueur --- # Les règles de passage ## Solution 1 - Créer une nouvelle relation 1/2 Appartenir(
#idJoueur,#idEquipe
) .pull-left-small[ Nous obtiendrons un tableau suivant : | #idJoueur | #idEquipe | | ---- | --- | | 01 | 01 | | 02 | 02 | | 03 | 01 | | 01 | 02 |
] .pull-right-big[
Ligne 1
- Le joueur 01 appartient à l'équipe 01 - Si on relie les clés étrangères avec les clés primaires associées - Sasha appartient à l'équipe bleu
Ligne 2
- Le joueur 02 appartient à l'équipe 02 - Si on relie les clés étrangères avec les clés primaires associées - Ondine appartient à l'équipe rouge
Ligne 3
- Le joueur 03 appartient à l'équipe 01 - Si on relie les clés étrangères avec les clés primaires associées - Pierre appartient à l'équipe bleu
Ligne 4
- Le joueur 01 appartient à l'équipe 02 - Si on relie les clés étrangères avec les clés primaires associées - Sasha appartient à l'équipe rouge ] --- # Les règles de passage ## Solution 1 - Créer une nouvelle relation 2/2 Appartenir(
#idJoueur,#idEquipe
) .pull-left-small[ Nous obtiendrons un tableau suivant : | #idJoueur | #idEquipe | | ---- | --- | | 01 | 01 | | 02 | 02 | | 03 | 01 | | 01 | 02 |
] .pull-right-big[
SQLment parlant
- c'est juste ! - il n'y aura pas de doublons dans la table Appartenir
Cardinalement parlant
- c'est faux ! - Un joueur ne peut appartenir à plusieurs équipes !
Sasha appartient déjà à l'équipe Bleu.
] --- # Les règles de passage ## Solution 2 - idJoueur dans Equipe 1/2 Equipe(
idEquipe
,intitule,#idJoueur) .pull-left-small[ Nous obtiendrons un tableau suivant : | idEquipe | intitule | #idJoueur | | ---- | --- | ---- | | 01 | Bleu | {01,02} | | 02 | Rouge | {03,02} | | 03 | Jaune | {03,02,01} |
] .pull-right-big[
Ligne 1
l'équipe 01 a pour intitulé Bleu et contient le joueur 01 et le joueur 02
Ligne 2
l'équipe 02 a pour intitulé Rouge et contient le joueur 03 et le joueur 02
Ligne 3
l'équipe 03 a pour intitulé Jaune et contient le joueur 03, le joueur 02, et le joueur 01 ] --- # Les règles de passage ## Solution 2 - idJoueur dans Equipe 2/2 Equipe(
idEquipe
,intitule,#idJoueur) .pull-left[ Nous obtiendrons un tableau suivant : | idEquipe | intitule | #idJoueur | | ---- | --- | ---- | | 01 | Bleu | {01,02} | | 02 | Rouge | {03,02} | | 03 | Jaune | {03,02,01} |
] .pull-right[
SQLment parlant
- c'est faux ! - il n'est pas possible des valeurs multiples ! .under[Cardinalement parlant] - c'est faux - Aucun moyen de vérifier si un joueur n'apparaît pas plusieurs fois !
Donc cette solution est fausse !
] --- # Les règles de passage ## Solution 3 - idEquipe dans Joueur 1/2 Joueur(
idJoueur
, nom,#idEquipe) .pull-left[ Nous obtiendrons un tableau suivant : | idJoueur | nom | #idEquipe | | ---- | --- | ---- | | 01 | Sasha | 01 | | 02 | Ondine | 02 | | 03 | Pierre | 03 | | 04 | Chen | 01 | | 05 | Jessie | 02 | | 06 | James | 02 |
] .pull-right[ .under[Ligne 1] le joueur 1 appartient à l'équipe 01 .under[Ligne 2] le joueur 2 appartient à l'équipe 02 .under[Ligne 3] le joueur 3 appartient à l'équipe 03 .under[...] .under[Ligne 6] le joueur 6 appartient à l'équipe 02 ] --- # Les règles de passage ## Solution 3 - idEquipe dans Joueur 2/2 Joueur(
idJoueur
, nom,#idEquipe) .pull-left-small[ Nous obtiendrons un tableau suivant : | idJoueur | nom | #idEquipe | | ---- | --- | ---- | | 01 | Sasha | 01 | | 02 | Ondine | 02 | | 03 | Pierre | 03 | | 04 | Chen | 01 | | 05 | Jessie | 02 | | 06 | James | 02 | ] .pull-right-big[ .under[SQLment parlant] - c'est Juste ! .under[Cardinalement parlant] - c'est Juste ! - un joueur appartient à une seule et unique équipe et une équipe peut avoir plusieurs joueurs ]
--- # Les règles de passage ## Cas particulier Il faut faire des choix parfois ! ## MCD
## MLD * Citoyen(
idCitoyen
,nom,prénom,age) * Candidat(
idCandidat
,parti,#idCitoyen) --- # Comment passer du MCD au MLD ? ## Plan 1. Vérification de notre MCD 2. Règles de passage du MCD au MLD 3. **Élaboration des dépendances fonctionnelles**
--- # Dépendance Fonctionnelle ## Définition - Liens entre deux attributs présent dans la BD - Deux données sont en dépendance fonctionnelle : **si la connaissance d'une valeur de A détermine la valeur de B**
--- # Dépendance Fonctionnelle ## Exemple - Un numéro de sécurité social determine un seul nom de famille, - celui du titulaire du numéro - car plusieurs personnes peuvent avoir le même nom - Au nom de Etcheverry correspond plusieurs **N° de secu** : 290106402 et 298106405 - Le **nom** ne permet pas de trouver le **N° de sécu** - Le **N° de secu** permet de trouver le **nom** d'une personne - .underG[N° secu -> nom] | N° secu | nom | prenom | téléphone | | ------------ | ------------ | ------------ | ------------ | | 290106402 | Etcheverry | Gisèle | 0602234598 | | 298106405 | Etcheverry | Gertrude | 0555456512 | | 245026407 | Etchegaray | Germaine | 0514325324 | | 299076489 | Etchegaray | Maité | 0765325656 | --- # De manière générique ! ## Définition - Soit A et B deux groupes d'attributs d'une relation R(A,B,...) - on dit que A -> B (<< A détermine B >>) - si à une valeur donnée de A correspond tout au plus une valeur de B --- # Dépendance Fonctionnelle ## Les différentes propriétés - Réflexivité - Augmentation - Transitivité - Union - Pseudo-transitivité - Décomposition ## Objectifs - Trouver les liens entre les attributs - Trouver les liens entres les relations - Factoriser de l'information - ... --- # Dépendance Fonctionnelle ## Exemple | N° skate | type | marque | taille | couleur | N° secu | | --------- | --------- | -------- | --------- | --------- | --------- | | 123 | maga deck | Primitive | 7'8 | rose | 290106402 | | 546 | deck 2 | Zoo york | 8,2 | vert | 245026407 | | 789 | red | Birdhousse | 8,44 | bleu | 298106405 | | 159 | komodo | Jart | 8 | rouge | 298106405 |
--- # Réflexivité ## Définition Tout ensemble d'attribut détermine lui même (ou une partie de lui-même) - X -> X - A,B -> A ## Exemple | []() | | | --------- | --------- | | N° skate -> N° skate | 123 ->123 | | N° skate, type -> N° skate | 123,komodo->123 | --- # Augmentation ## Définition - **SI** X -> Y - **ALORS** X,Z -> Y ## Exemple | []() | | | --------- | --------- | | **SI** type -> marque | komodo -> Jart | | **ALORS** taille, type -> marque | 8,komodo-> Jart | --- # Transitivité ## Définition - **SI** X-> Y et Y -> Z - **ALORS** X->Z ## Exemple | []() | | | --------- | --------- | | **SI** N° skate -> type et type -> marque | 123 -> komodo et komodo -> Jart | | **ALORS** N° skate -> marque | 123-> Jart | --- # Union ## Définition - **SI** X -> Y et X -> Z - **ALORS** X -> Y,Z ## Exemple | []() | | | --------- | --------- | | **SI** N° skate -> type et N° skate -> marque | 123 -> komodo et 123 -> Jart | | **ALORS** N° skate -> type,marque | 123-> komodo,Jart | --- # Autres ## Pseudo-transitivité - **SI** X -> Y et Y,W -> Z - **ALORS** X,W -> Z ## Décomposition - **SI** X -> Y,Z - **ALORS** X-> Y et X -> Z
--- # Les types de DFs ## La liste - DF Elémentaire - DF Directe
## Objectif Utiliser les différentes propriétés (Réfléxivité, Augmentation, Union, ...) pour simplifier, soulever des problèmes, améliorer le MCD et/ou le MLD --- # DF élémentaire (DFE) ## Définition 1 **X -> Y est une DF élementaire** - Si Y ne dépend pas d'un sous-ensemble de X (X est la plus petite quantité d'information déterminant Y) - NB : Y est un attribut unique n'appartenant pas à X (Y ne contient pas X) et il n'existe pas X' contenant X tel que X' -> Y ## Définition 2 **AB -> C est une DF élementaire** Si ni A et ni B pris seul ne définissent C .under[Par définition, les DF à deux rubriques (A -> B) sont toujours élémentaires] --- # DF élémentaire (DFE) ## Exemples #### DF Élémentaires - réferenceProduit -> libProduit : élémentaire car deux rubriques - numFacture, réferenceProduit -> quantitéFacturée est élémentaire : ni la référence produit seule, ni le numéro de facture seul permettent de déterminer la quantité - I -> J : élémentaire car deux rubriques #### DF Non Élémentaires - numFacture, réferenceProduit -> libProduit : non élémentaire car la référence du produit suffit à déterminer le libellé - AB -> CB : non élémentaire car CB n'est pas un attribut, mais un groupe d'attributs - N°SS -> Nom, Prénom : non élémentaire car c'est un groupe d'attributs - AB -> A : non élémentaire car A est incluse dans AB --- # Graphe des DFE ## Formalisme - Noeuds = attributs - Arcs = DF - Graphe orienté dont les noeuds sont les attributs et les arcs sont les DFE ## Objectif Déterminer la clé de la relation ## Exemple .pull-left[ Soit la relation R(A,B,C,D,E) avec les DFE : - A-> B,C - A,D -> E .underV[Les clés :] R(
A, D
, B,C,E) ] .pull-right[
] --- # Dépendance fonctionnelle Directe ## Définition **E -> F est directe** - s'il n'existe pas G tel que E -> G et G -> F ## Exemples Voiture(
id
, marque, type, puissance, couleur) #### DF Directes - id -> type : direct - id -> couleur : direct #### DF Non directes id -> marque : non direct car id -> type et type -> marque --- # Conclusion ## La morale Un bon schéma relationnel doit être issu de la décomposition universelle (normalisation) ## Différence entre MCD et MLD - Dans M**C**D, il y a un **C** comme dans carré - Dans M**L**D, il y a un **L** comme dans ligne
![alt-text](https://media.giphy.com/media/ZC0ATzzJnKqn2SNDHR/giphy.gif)