Fichier de rejeu Close

Indication Close

A propos de... Close

Commentaire Close

Systèmes d'Information

  • Notions mathématiques
  • Calcul relationnel
  • Algèbre relationnelle
  • Langage de requêtes
  • Arbre de requêtes
  • Exercices
  • Introduction
  • Commandes de bases
  • Langage de définition de données (LDD)
  • Langage de manipulation de données (LMD)
  • Types de données
  • Exercice
  • Présentation
  • Calcul relationnel
  • Algèbre relationnelle
  • Division relationnelle
  • Relation
  • Fonction
  • Application
  • Injection
  • Surjection
  • Bijection
  • Association
  • Exemples
  • Dépendances fonctionnelles
  • Décomposition de relations
  • Inférence logique
  • Normalisation
  • Aux pays des bières
    • Aucune forme normale
    • Première forme normale
    • Deuxième forme normale
    • Troisième forme normale
  • Modélisation
  • Exercices
  • Liste des projets
  • Aux pays des bières
  • Au Tournoi des six nations
  • Salles de concerts
  • Généralités
  • Langage SQL
  • Modèle relationnel
  • Généralités
  • SQL
  • Algèbre relationnelle
  • Synthèse
Index

Archives

  • Site Web
  • Sources reStructuredText
  • EniBook 1.618033988
logo

Crédits

© Your Copyright

Aide

En-tête

MenuContenu
Sommaire,
Téléchargements
Aide sur les outils

Pied de page

ChevronAction
Aller en haut de la page courante
Aller en bas de la page courante
Passer à la page précédente
Passer à la page suivante

Normalisation : « Aux pays des bières »

La modélisation des bars qui servent des bières peut être décrite simplement dans une seule table :

  • \(barsdumonde(\underline{id\_bar,id\_biere},bar,pays,continent,biere,couleur,origine,stock)\)

en partant du fait qu’il faudra connaître un numéro de bar (id_bar) et de bière (id_biere) pour retrouver toutes les informations sur une bière servie dans un bar.

En effet il ne suffit pas de connaître le nom du bar et celui de la biere sachant que :

  • plusieurs bars peuvent avoir le même nom (il peut exister plusieurs bar='Bar du Coin')
  • un même nom peut être donné à une bière produite dans différents pays (ex : “Budweiser” produite en “Tchéquie” et aux “USA”)

Partant de cette modélisation de base non normalisée, on structurera notre modèle de données en se basant sur les trois premières formes normales et en appliquant le théorème de Heath pour proposer une décomposition sans perte à chaque étape de normalisation.

Aucune forme normale

En partant de notre première structuration des informations dans une seule table nous souhaiterions obtenir la représentation suivante des informations :

barsdumonde
id_barbarpayscontinentid_bierebierecouleuroriginestock
1Bar du CoinFranceEurope1KronenbourgBlondeFrance1000
2GuinnessBruneIrlande250
3SpatenBlondeAllemagne50
4BushBlondeBelgique100
2Cafe der EckeAllemagneEurope3SpatenBlondeAllemagne5000
5ErdingerBlondeAllemagne30000
6BudweiserBlondeTchéquie7500
3Corners PubUSAAmérique6BudweiserBlondeTchéquie10
7BudweiserBlondeUSA10000
4BushBlondeBelgique2500

Avec cette représentation, quel serait le résultat de la requête SQL suivante :

SELECT * FROM barsdumonde
WHERE bar='Bar du Coin';

Est-il possible de retrouver facilement les bières servies au “Bar du Coin” ?

Cette modélisation ne permet donc pas de manipuler facilement les informations.

Cette représentation de l’information contredit la première forme normale (1NF) :

  • tous les attributs de la relation doivent avoir des valeurs simples (contiennent une valeur atomique)

On doit donc dupliquer toutes les informations regroupées par bar.

NB : Ce genre de regroupement pourra toujours être réalisé ultérieurement (GROUP BY)

Première forme normale

La représentation de notre premier modèle de données en 1NF sera donc :

barsdumonde
id_barid_bierebarpayscontinentbierecouleuroriginestock
11Bar du CoinFranceEuropeKronenbourgBlondeFrance1000
12Bar du CoinFranceEuropeGuinnessBruneIrlande250
13Bar du CoinFranceEuropeSpatenBlondeAllemagne50
14Bar du CoinFranceEuropeBushBlondeBelgique100
23Cafe der EckeAllemagneEuropeSpatenBlondeAllemagne5000
25Cafe der EckeAllemagneEuropeErdingerBlondeAllemagne30000
26Cafe der EckeAllemagneEuropeBudweiserBlondeTchéquie7500
36Corners PubUSAAmériqueBudweiserBlondeTchéquie10
37Corners PubUSAAmériqueBudweiserBlondeUSA10000
34Corners PubUSAAmériqueBushBlondeBelgique2500

Cependant du fait de la duplication de l’information concernant les bars à chaque bière qu’ils servent, cette modélisation présente de nombreux inconvénients :

  • duplication de l’information concernant les bars pour chaque bière qu’ils servent.

  • anomalie d’insertion :

    • si on veut insérer une nouvelle bière il faudra l’associer à un bar (id_bar).

      INSERT INTO barsdumonde VALUES(4,8,NULL,NULL,NULL,'Pilsner Urquell','Blonde','Tchéquie',NULL);
      -- ou
      INSERT INTO barsdumonde VALUES(4,8,'Bar des Amis','France','Europe','Pilsner Urquell','Blonde','Tchéquie',NULL);
       -- ou
      INSERT INTO barsdumonde VALUES(1,8,'Bar du Coin','France','Europe','Pilsner Urquell','Blonde','Tchéquie',1250);
      
  • anomalie de mises à jour :

    • rebaptiser la 'Budweiser' produite en ''Tchéquie' en 'Budwar' implique de parcourir tous les éléments de l’ensemble pour faire la mise à jour :

      UPDATE barsdumonde SET biere='Budwar' WHERE biere='Budweiser' AND origine='Tchéquie'
      -- ou
      UPDATE barsdumonde SET biere='Budwar'
      WHERE  id_biere IN (
                          SELECT id_biere
                          FROM barsdumonde
                          WHERE biere='Budweiser' AND origine='Tchéquie'
                         );
      
  • anomalie de suppression :

    • enlever le 'Bar du Coin' de l’ensemble implique de perdre toute l’information sur les bières qu’il servait.

      DELETE FROM barsdumonde WHERE bar='Bar du Coin';
      

Tests d’anomalies sur la base en 1NF :

sql : bars-1NF.sql

    
>
Output

                

Interpréteur

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Interpréter le programme

Editeur

MenuRaccouciAction
Ctrl+N Initialiser l'éditeur
Ctrl+O Charger le contenu d'un fichier dans l'éditeur
Ctrl+S Sauvegarder le contenu de l'éditeur dans un fichier
Ctrl+P Imprimer le contenu de l'éditeur
Ctrl+Z Annuler la dernière modification
Maj+Ctrl+Z Rétablir la modification précedente
Ctrl+F Chercher une expression dans l'éditeur
Maj+Ctrl+F Chercher et remplacer une expression par une autre
F10 Ouvrir une documentation du langage

RaccourciAction
F1 Afficher cette aide
Tab Indenter la sélection
Maj+Tab Désindenter la sélection
Ctrl+A Sélectionner le contenu de l'éditeur
Ctrl+C Copier la sélection dans le presse-papier
Ctrl+V Remplacer la sélection par le contenu du presse-papier
Ctrl+X Supprimer la sélection et la copier dans le presse-papier
Maj+Ctrl+R Chercher et remplacer une expression par une autre dans tout l'éditeur

Il faut donc structurer la base de données de manière à répartir les informations concernant les bars et les bières dans différents ensembles.

Cependant à partir de la répartition de l’information dans ces nouveaux ensembles, il faudra pouvoir reconstituer les informations présentes dans le modèle initial.

Deuxième forme normale

Pour mieux structurer notre modèle en 1NF on doit vérifier s’il respecte la deuxième forme normale (2NF) :

  • il n’existe pas de partie de clé (sous-clé) qui soit une clé pour un attribut non-clé

Autrement dit : Toute la clé est nécessaire

Dans notre modèle d’origine :

  • \(barsdumonde(\underline{id\_bar,id\_biere},bar,pays,continent,biere,couleur,origine,stock)\)

La clé de la relation est constitué des attributs : id_bar,id_biere

Or le numéro du bar suffit à retrouver les informations sur le bar.

  • \(id\_bar \rightarrow bar,pays,continent\)

On peut donc décomposer notre relation de départ en appliquant le théorème de Heath :

  • \(barsdumonde(\underline{id\_bar},bar,pays,continent)\)
  • \(bieresdumonde(\underline{id\_bar,id\_biere},biere,couleur,origine,stock)\)
barsdumonde
id_barbarpayscontinent
1Bar du CoinFranceEurope
2Cafe der EckeAllemagneEurope
3Corners PubUSAAmérique du Nord
bieresdumonde
id_barid_bierebierecouleuroriginestock
11KronenbourgBlondeFrance1000
12GuinnessBruneIrlande250
13SpatenBlondeAllemagne50
14BushBlondeBelgique100
23SpatenBlondeAllemagne5000
25ErdingerBlondeAllemagne30000
26BudweiserBlondeTchéquie7500
36BudweiserBlondeTchéquie10
37BudweiserBlondeEtats-Unis10000
34BushBlondeBelgique2500
sql : bars-2NF-presque.sql

    
>
Output

                

Interpréteur

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Interpréter le programme

Editeur

MenuRaccouciAction
Ctrl+N Initialiser l'éditeur
Ctrl+O Charger le contenu d'un fichier dans l'éditeur
Ctrl+S Sauvegarder le contenu de l'éditeur dans un fichier
Ctrl+P Imprimer le contenu de l'éditeur
Ctrl+Z Annuler la dernière modification
Maj+Ctrl+Z Rétablir la modification précedente
Ctrl+F Chercher une expression dans l'éditeur
Maj+Ctrl+F Chercher et remplacer une expression par une autre
F10 Ouvrir une documentation du langage

RaccourciAction
F1 Afficher cette aide
Tab Indenter la sélection
Maj+Tab Désindenter la sélection
Ctrl+A Sélectionner le contenu de l'éditeur
Ctrl+C Copier la sélection dans le presse-papier
Ctrl+V Remplacer la sélection par le contenu du presse-papier
Ctrl+X Supprimer la sélection et la copier dans le presse-papier
Maj+Ctrl+R Chercher et remplacer une expression par une autre dans tout l'éditeur

Cependant notre structuration n’est pas encore en 2NF.

En effet il n’y a pas besoin de connaître le numéro du bar pour retrouver les informations sur une bière.

  • \(id\_biere \rightarrow biere,couleur,origine\)

On peut donc à nouveau décomposer notre relation bieresdumonde en appliquant le théorème de Heath :

  • \(bieresdumonde(\underline{id\_biere},biere,couleur,origine)\)
  • \(services(\underline{id\_bar,id\_biere},stock)\)
barsdumonde
id_barbarpayscontinent
1Bar du CoinFranceEurope
2Cafe der EckeAllemagneEurope
3Corners PubUSAAmérique du Nord
bieresdumonde
id_bierebierecouleurorigine
1KronenbourgBlondeFrance
2GuinnessBruneIrlande
3SpatenBlondeAllemagne
4BushBlondeBelgique
5SpatenBlondeAllemagne
6ErdingerBlondeAllemagne
7BudweiserBlondeTchéquie
8BudweiserBlondeEtats-Unis
services
id_barid_bierestock
111000
12250
1350
14100
235000
2530000
267500
3610
3710000
342500

Cette structuration permet d’éliminer de la redondance d’information et de retrouver les informations initiales par jointure naturelle :

  • \(\Join_{[services.id\_biere=bieresdumonde.id\_biere]}(bieresdumonde,\Join_{[services.id\_bar=barsdumonde.id\_bar]}(services,bars))\)
sql : bars-2NF.sql

    
>
Output

                

Interpréteur

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Interpréter le programme

Editeur

MenuRaccouciAction
Ctrl+N Initialiser l'éditeur
Ctrl+O Charger le contenu d'un fichier dans l'éditeur
Ctrl+S Sauvegarder le contenu de l'éditeur dans un fichier
Ctrl+P Imprimer le contenu de l'éditeur
Ctrl+Z Annuler la dernière modification
Maj+Ctrl+Z Rétablir la modification précedente
Ctrl+F Chercher une expression dans l'éditeur
Maj+Ctrl+F Chercher et remplacer une expression par une autre
F10 Ouvrir une documentation du langage

RaccourciAction
F1 Afficher cette aide
Tab Indenter la sélection
Maj+Tab Désindenter la sélection
Ctrl+A Sélectionner le contenu de l'éditeur
Ctrl+C Copier la sélection dans le presse-papier
Ctrl+V Remplacer la sélection par le contenu du presse-papier
Ctrl+X Supprimer la sélection et la copier dans le presse-papier
Maj+Ctrl+R Chercher et remplacer une expression par une autre dans tout l'éditeur

Troisième forme normale

Il subsiste toujours de la redondance d’information dans notre modèle de données en 2NF du fait qu’à chaque fois que l’on insère un bar dans un pays il est nécessaire de renseigner l’information sur le continent où se trouve ce pays. Or, il existe une dépendance fonctionnelle entre les informations pays,continent :

  • \(pays \rightarrow continent\)

qui représente donc une dépendance transitive entre ces attributs non-primitifs.

On doit respecter la troisème forme normale (3F) :

  • la relation est en deuxième forme normale (2NF) et tous les attributs non-primitifs sont directement dépendant d’une clé

Autrement dit :

  • il n’existe pas de dépendances fonctionnelles entre les attributs non-clé.

On peut donc à nouveau décomposer notre relation barsdumonde en appliquant le théorème de Heath :

  • \(bars(\underline{id\_bar},nom,pays)\)
  • \(monde(\underline{pays},continent)\)

On obtient au final une structuration de notre base de donnée en 3NF :

  • \(monde(\underline{pays},continent)\)
  • \(bars(\underline{id\_bar},nom,pays)\)
  • \(bieres(\underline{id\_biere},biere,couleur,origine)\)
  • \(services(\underline{id\_bar,id\_biere},stock)\)
monde
payscontinent
FranceEurope
AllemagneEurope
USAAmérique
bars
id_barbarpays
1Bar du CoinFrance
2Cafe der EckeAllemagne
3Corners PubUSA
bieres
id_bierebierecouleurorigine
1KronenbourgBlondeFrance
2GuinnessBruneIrlande
3SpatenBlondeAllemagne
4BushBlondeBelgique
5SpatenBlondeAllemagne
6ErdingerBlondeAllemagne
7BudweiserBlondeTchéquie
8BudweiserBlondeEtats-Unis
services
id_barid_bierestock
111000
12250
1350
14100
235000
2530000
267500
3610
3710000
342500
sql : bars-3NF.sql

    
>
Output

                

Interpréteur

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Interpréter le programme

Editeur

MenuRaccouciAction
Ctrl+N Initialiser l'éditeur
Ctrl+O Charger le contenu d'un fichier dans l'éditeur
Ctrl+S Sauvegarder le contenu de l'éditeur dans un fichier
Ctrl+P Imprimer le contenu de l'éditeur
Ctrl+Z Annuler la dernière modification
Maj+Ctrl+Z Rétablir la modification précedente
Ctrl+F Chercher une expression dans l'éditeur
Maj+Ctrl+F Chercher et remplacer une expression par une autre
F10 Ouvrir une documentation du langage

RaccourciAction
F1 Afficher cette aide
Tab Indenter la sélection
Maj+Tab Désindenter la sélection
Ctrl+A Sélectionner le contenu de l'éditeur
Ctrl+C Copier la sélection dans le presse-papier
Ctrl+V Remplacer la sélection par le contenu du presse-papier
Ctrl+X Supprimer la sélection et la copier dans le presse-papier
Maj+Ctrl+R Chercher et remplacer une expression par une autre dans tout l'éditeur

On obtient bien par jointure naturelle :

  • \(\Join(monde,\Join(bars,\Join(services,bieres)))\)

les informations présentes dans la base de données initiale en 1NF :

barsdumonde
id_barid_bierebarpayscontinentbierecouleuroriginestock
11Bar du CoinFranceEuropeKronenbourgBlondeFrance1000
12Bar du CoinFranceEuropeGuinnessBruneIrlande250
13Bar du CoinFranceEuropeSpatenBlondeAllemagne50
14Bar du CoinFranceEuropeBushBlondeBelgique100
23Cafe der EckeAllemagneEuropeSpatenBlondeAllemagne5000
25Cafe der EckeAllemagneEuropeErdingerBlondeAllemagne30000
26Cafe der EckeAllemagneEuropeBudweiserBlondeTchéquie7500
36Corners PubUSAAmériqueBudweiserBlondeTchéquie10
37Corners PubUSAAmériqueBudweiserBlondeUSA10000
34Corners PubUSAAmériqueBushBlondeBelgique2500
 
Systèmes d'Information : Normalisation : « Aux pays des bières », 13 avr. 2023.