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
  • Modélisation
  • Exercices
    • Dépendance Fonctionnelle
    • Dépendance Fonctionnelle Elémentaire
    • Décomposition SPI
    • Formes normales
    • Compagnie aérienne
  • 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

Exercices

Dépendance Fonctionnelle

Dépendance Fonctionnelle dans une relation
  • Question
  • Solution

A partir de l’instance de relation :

R
XYZ
x1y1z1
x2y1z1
x2y2z2
x3y3z2
x3y2z2

Quels dépendances fonctionnelles pouvez-vous identifiez ? Justifiez votre réponse!

Votre réponse :
Texte : inputlines1379.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :

Dans cette relation on peut identifier les DF :

  • \((X,Y) \rightarrow Z\).
  • \(Y \rightarrow Z\).

Puisque à chaque couple de valeurs de \((X,Y)\) ou à chaque valeur de \(Y\) correspond une seule valeur de \(Z\).

\(Y\) est le seul attribut pour lequel à chaque valeur correspond une seule et même valeur de l’attribut \(Z\).

En effet :
  • \(Y \nrightarrow X\)
    • \(y1 \rightarrow x1\)
    • \(y1 \rightarrow x2\)
  • \(X \nrightarrow Y\)
    • \(x2 \rightarrow y1\)
    • \(x2 \rightarrow y2\)
  • \(X \nrightarrow Z\)
    • \(x2 \rightarrow z1\)
    • \(x2 \rightarrow z2\)
  • \(Z \nrightarrow X\)
    • \(z1 \rightarrow x1\)
    • \(z1 \rightarrow x2\)
  • \(Z \nrightarrow Y\)
    • \(z2 \rightarrow y2\)
    • \(z2 \rightarrow y3\)

De la même manière :

  • \(Y \nrightarrow X\):

    • \(y1 \rightarrow x1\)
    • \(y1 \rightarrow x2\)
  • \(X \nrightarrow Y\).

    • \(x2 \rightarrow y1\)
    • \(x2 \rightarrow y2\)
  • \(X \nrightarrow Z\)

    • \(x2 \rightarrow z1\).
    • \(x2 \rightarrow z2\).
  • \(Z \nrightarrow Y\)

    • \(z1 \rightarrow x1\)
    • \(z1 \rightarrow x2\)
Exemple : 'ventes de produits'
  • Question
  • Solution

A partir de l’instance de relation :

ventes
clientproduitprix
Andrépoivre2.5
Maximepoivre2.5
Maximepiment3.2
Zoésel3.2
Zoépiment3.2

Y a t’il une DF ? Si oui, laquelle ? Expliquez !

Votre réponse :
Texte : inputlines1383.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :

Oui, le prix dépend fonctionnellement du produit :

  • \(produit \rightarrow prix\).

C’est le seul attribut pour lequel à chaque valeur correspond une seule et même valeur de l’attribut \(prix\).

Par contre \(client \nrightarrow produit\) (connaître un client ne veut pas dire que l’on sait exactement le produit qu’il va acheter)

En effet à une même valeur de \(client (ex: Maxime)\) correspond deux valeurs différentes de \(produit (poivre,piment)\)

De la même manière :

  • \(prix \nrightarrow produit\) : le prix ne permet pas de retrouver le produit
  • \(prix \nrightarrow client\) : le prix ne détermine pas le client (mais peut le dissuader d’acheter le produit)
  • \(produit \nrightarrow client\) : connaître le produit ne veut pas dire qu’on connait le client (quoique …)
  • \(client \nrightarrow prix\) : connaître le client ne permet pas de retrouver le prix du produit

Dépendance Fonctionnelle Elémentaire

A partir de l’instance de relation \(R(A,B,C,D,E)\) suivante :

R
ABCDE
a1b1c1d1e1
a1b2c2d2e1
a2b1c3d3e1
a2b1c4d3e1
a3b2c5d1e1

Répondre aux questions suivantes sur les DFE.

DFE : attributs cibles
  • Question
  • Solution

Expliquer pour quelle raison la DF suivante :

  • \(C \rightarrow (A,B,D,E)\)

peut être retenue dans l’ensemble des DFE

Votre réponse :
Texte : inputlines1387.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :

Pour chaque enregistrement la valeur de l’attribut \(C\) est différente. Donc si on connait la valeur de \(C\) on retrouve les valeurs des attributs \((A,B,D,E)\).

  • \(C \rightarrow (A,B,D,E)\) représente donc une DF.

En utilisant l’axiome de décomposition on peut décomposer la DF en faisant apparaître un seul attribut cible :

  • \(C \rightarrow A\)
  • \(C \rightarrow B\)
  • \(C \rightarrow D\)
  • \(C \rightarrow E\)

Comme il n’y a qu’un seul attribut source, il ne peut donc y avoir de sous-ensemble qui soit une DF sur l’attribut cible.

La DF :

  • \(C \rightarrow (A,B,D,E)\)

représente donc 4 DFE.

DFE : attributs sources
  • Question
  • Solution

Expliquer pour quelle raison la DF suivante :

  • \((A,B,C) \rightarrow (D,E)\)

ne peut être retenue dans l’ensembles des DFE

Votre réponse :
Texte : inputlines1391.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :

Un sous-ensemble de l’ensemble des attributs \((A,B,C)\) suffit pour déterminer les valeurs des attributs \((D,E)\)

Les DF \((A,B,C) \rightarrow D\) et \((A,B,C) \rightarrow E\) ne peuvent donc pas être retenues dans l’ensemble des DFE.

Toutes les DFE
  • Question
  • Solution

Trouver les Dépendances Fonctionnelles Elémentaires (DFE) existantes entre les attributs \((A,B,C,D,E)\).

On représentera les DF sous la forme \(X \rightarrow A\).

Votre réponse :
Texte : inputlines1395.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :
  1. \(A \rightarrow E\)
  2. \(B \rightarrow E\)
  3. \(C \rightarrow (A,B,D,E)\)
  4. \(D \rightarrow E\)
  5. \((A,B) \rightarrow D\)
  6. \((A,D) \rightarrow B\)
  7. \((B,D) \rightarrow A\)

Les quatre premières DF s’expliquent du fait qu’il n’y a qu’un seul élément (une seule valeur) dans l’ensemble \(E\) sur tous les enregistrements, l’attribut E dépend donc fonctionnellement de chaque attribut de la relation \((A,B,C,D)\). Ce sont des DFE car il n’y a qu’un attribut cible et, du fait que la source de la DF n’est constitué que d’un seul attribut, il n’existe pas de sous-ensemble des attributs source qui pourraient représenter une DF sur l’attribut \(E\) .

Comme les valeurs de l’attribut \(C\) sont toutes différentes, chacun des autres attributs dépend fonctionnellement de l’ensemble \(C\). En utilisant des axiomes d’additivité et de décomposition on peut donc grouper les DFE en une seule DF \(C \rightarrow (A,B,D,E)\) puis les dégrouper pour obtenir les DFE.

Il ne pourra y avoir de combinaison des attributs \((A,B,C,D)\) en tant qu’attributs source pour déterminer l’attribut cible \(E\) puisqu’avec les DFE précédentes il y aura toujours un sous-ensemble de ces combinaisons qui suffira à déterminer les valeurs de \(E\).

La cinquième DF peut-être retenue en tant que DFE car pour chaque valeur combinée des attributs \((A,B)\), il n’y a qu’une seule valeur associée de l’attribut \(D\). Ce ne sera pas le cas pour les 2 sous-ensembles possibles de ces 2 attributs source. Par contre \((A,B) \rightarrow C\) ne sera pas une DF car il peut correspondre des valeurs différentes de l’attribut cible pour un même combinaison des valeurs des attributs sources \(A,B\).

De même, la sixième DF peut-être retenue en tant que DFE car pour chaque valeur combinée des attributs \((A,D)\), il n’y a qu’une seule valeur associée de l’attribut \(B\). Par contre il n’y a pas une seule valeur correspondante de l’attribut \(C\).

La dernière DF peut aussi être retenue en tant que DFE car pour chaque valeur combinée des attributs \((B,D)\), il n’y a qu’une seule valeur associée de l’attribut \(A\). Par contre il n’y a pas une seule valeur correspondante de l’attribut \(C\).

Décomposition SPI

Décomposition SPI d'une relation
  • Question
  • Solution

A partir de l’instance de relation :

R
XYZ
x1y1z1
x2y1z1
x2y2z2
x3y3z2
x3y2z2

On défini le schéma relationnel \(R(X,Y,Z)\) avec :

  • \(R(X,Y,Z)\)
  • \(Y \rightarrow Z\)

Et les décompositions possibles de la realtion \(R(X,Y,Z)\) :

  • \(R_1(X,Y),R_2(Y,Z),R_3(X,Z)\)

Sur les trois jointures naturelles possibles :

SELECT X,Y,Z FROM R1 NATURAL JOIN R2;
SELECT X,Y,Z FROM R1 NATURAL JOIN R3;
SELECT X,Y,Z FROM R2 NATURAL JOIN R3;

Laquelle permettra de reconstruire les informations présentes dans la table \(R(X,Y,Z)\) ?

Expliquez pour quelles raisons.

Votre réponse :
sql : spi-create.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
Texte : inputlines1400.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :
SELECT X,Y,Z FROM R1 NATURAL JOIN R2;

C’est la seule décomposition pour laquelle la différence des groupes d’attributs des deux relations \(R_1(X,Y), R_2(Y,Z)\)

  • \(Z=\setminus((Y,Z),(X,Y))\)

dépend fonctionnellement de l’intersection de ces mêmes groupes d’attributs :

  • \(Y=\cap((Y,Z),(X,Y)))\)

Du fait de la seule DF du schéma relationnel : \(Y \rightarrow Z\)

Alors que pour les relations \(R_2(Y,Z),R_3(X,Z)\)

  • \(Y=\setminus((Y,Z),(X,Z))\)
  • \(X=\setminus((X,Z),(Y,Z))\)

\(X,Y\) ne dépendent pas fonctionnellement de \(Z\)

  • \(Z=\cap((Y,Z),(X,Z))\)

Ainsi que pour les relations \(R_1(X,Y),R_3(X,Z)\)

  • \(Y=\setminus((X,Y),(X,Z))\)
  • \(Z=\setminus((X,Z),(X,Y))\)

\(Y,Z\) ne dépendent pas fonctionnellement de \(X\)

  • \(X=\cap((X,Y),(X,Z))\)
sql : spi-create.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
Exemple : 'ventes de produits'
  • Question
  • Solution

A partir de l’instance de relation :

ventes
clientproduitprix
Andrépoivre2.5
Maximepoivre2.5
Maximepiment3.2
Zoésel3.2
Zoépiment3.2

Sur les trois décompositions possibles :

  • produits(produit,prix)
  • preferences(client,produit)
  • depenses(client,prix)

Quelle(s) jointure(s) naturelle(s) permet(tent) de retrouver l’instance de la relation d’origine :

SELECT client,produit,prix FROM preferences NATURAL JOIN produits;
SELECT client,produit,prix FROM preferences NATURAL JOIN depenses;
SELECT client,produit,prix FROM produits NATURAL JOIN depenses;

Expliquez pour quelles raisons.

Votre réponse :
Texte : inputlines1405.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :
SELECT client,produit,prix FROM preferences NATURAL JOIN produits;

C’est la seule décomposition pour laquelle la différence :

  • \(prix=\setminus((produit,prix),(client,produit))\)

des groupes d’attributs des deux relations :

  • \(preferences(client,produit), produits(produit,prix)\)

dépend fonctionnellement de l’intersection de ces mêmes groupes d’attributs :

  • \(produit=\cap((client,produit),(produit,prix))\)

Du fait de la DFE identifiée dans l’instance de la relation d’origine :

  • \(produit \rightarrow prix\)

Pour la décomposition :

  • \(preferences(client,produit),depenses(client,prix)\) :

La différence (\(produit\) ou \(prix\)):

  • \(produit=\setminus((client,produit),(client,prix))\)
  • \(prix=\setminus((client,prix),(client,produit))\)

des groupes d’attributs ne dépendent pas fonctionnellement de l’intersection (\(client\)) de ces mêmes groupes d’attributs:

  • \(client=\cap((client,prix),(client,produit))\)

Connaître le client ne permet pas de retrouver le produit ou le prix.

De même, pour la décomposition en relations :

  • \(produits(produit,prix),depenses(client,prix)\)

La différence (\(produit\) ou \(client\)) :

  • \(produit=\setminus((produit,prix),(client,prix))\)
  • \(client=\setminus((client,prix),(produit,prix))\)

des groupes d’attributs ne dépendent pas fonctionnellement de l’intersection (\(prix\)) de ces mêmes groupes d’attributs:

  • \(prix=\cap((client,prix),(produit,prix))\)

Connaître le prix ne permet pas de retrouver le produit ou le client.

Tests SQL :

sql : spi-produits.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

Formes normales

1NF,2NF,3NF,BCNF
  • Question
  • Solution

Soit la relation \(R(A,B,C)\) avec l’ensemble des Dépendances Fonctionnelles :

  • \(F=\{ A \rightarrow B, B \rightarrow C \}\)

En quelle forme normale est cette relation ?

Votre réponse :
Texte : inputlines1410.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :

On est en 2NF :

  • par transitivité (\(A \rightarrow B,B \rightarrow C\)) on trouve la DF : \(A \rightarrow C\)
  • donc par additivité on obtient la DF : \(A \rightarrow (B,C)\)
  • par conséquent la clé est constitué d’un seul attribut \(A\) ce qui veut dire qu’on est en 2NF car il ne peut y avoir de sous-ensemble de la clé qui détermine les autres attributs.
  • Cette relation n’est pas en 3NF du fait de la dépendance transitive \(A \rightarrow B, B \rightarrow C\)
1NF,2NF,3NF,BCNF
  • Question
  • Solution

L’instance de relation suivante :

R
ABC
a1b1c1
a2b1c2
a3b1c1
a4b2c2

peut-elle représenter une instance de la relation \(R(A,B,C)\) si l’ensemble des Dépendances Fonctionnelles identifiées sur cette relation est :

  • \(F=\{ A \rightarrow B, B \rightarrow C \}\)

Que faudrait-il ajouter ou enlever à cette instance de relation pour qu’elle satisfasse les Dépendances Fonctionnelles du schéma relationnel ?

Votre réponse :
Texte : inputlines1414.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :

Non car à une même valeur de l’attribut \(B\) correspond deux valeurs différentes de l’attribut \(C\):

  • \(b1 \rightarrow c1\)
  • \(b1 \rightarrow c2\)

ce qui contredit la dépendance fonctionnelle \(B \rightarrow C\).

Il suffirait d’enlever le deuxième enregistrement \((a2,b1,c2)\) pour que la DF \(B \rightarrow C\) soit respectée.

1NF,2NF,3NF,BCNF
  • Question
  • Solution

A partir de l’instance de relation \(R(A,B,C)\) suivante :

R
ABC
a1b1c1
a2b1c2
a3b1c1
a4b2c2

Quelles sont les DF que l’on peut identifier dans cette instance de table et en quelle forme normale est cette relation ? Justifiez votre réponse.

Votre réponse :
Texte : inputlines1418.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Texte : inputlines1419.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :

On peut identifier dans cette instance de relation la DF \(A \rightarrow (B,C)\). En effet, à chaque valeur de l’attribut \(A\) correspond une seule valeur de l’attribut \(B\) :

  • \(A \rightarrow B\)

A chaque valeur de l’attribut \(A\) correspond une seule valeur de l’attribut \(C\) :

  • \(A \rightarrow C\)

L’instance de relation est en 3NF car un seul attribut permet de retrouver les deux autres et il n’y a pas de dépendances transitive entre les attributs.

décomposition 3NF
  • Question
  • Solution

A partir de l’instance de relation \(R(A,B,C)\) suivante :

R
ABC
a1b1c1
a2b1c2
a3b1c1
a4b2c2

On identifie la DF \(A \rightarrow (B,C)\).

Parmi les jointures naturelles suivantes :

  1. \(\Join_{[R_1.A=R_2.A]}(R_1,R_2)\)
  2. \(\Join_{[R_1.B=R_3.B]}(R_1,R_3)\)
  3. \(\Join_{[R_2.C=R_3.C]}(R_2,R_3)\)

Laquelle reconstituera la table d’origine ? Justifiez votre réponse sans donner le résultat des requêtes.

Vérifiez en créant instances des relations \(R(A,B,C), R_1(A,B),R_2(A,C),R_3(B,C)\) et exécutant les requêtes correspondantes.

Votre réponse :
Texte : inputlines1423.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
sql : essai.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
Une solution possible :

La jointure naturelle :

  • \(\Join_{[R_1.A=R_2.A]}(R_1,R_2)\)

permettra de reconstituer la table d’origine du fait de la DF \(A \rightarrow (B,C)\) que l’on a sur l’instance de la relation \(R(A,B,C)\).

En effet, d’après le théorème de Heath lors de la décomposition, la différence des ensembles d’attributs devra dépendre fonctionnellement de l’intersection des deux ensembles d’attributs.

Or :

  • \(A=\cap((A,B),(A,C))\)
  • \(B=\setminus((A,B),(A,C))\)
  • \(C=\setminus((A,C),(A,B))\)

Donc :

  • \(\cap((A,B),(A,C)) \rightarrow \setminus((A,B),(A,C))\)
  • \(\cap((A,B),(A,C)) \rightarrow \setminus(((A,C),A,B))\)

Par conséquent on peut décomposer la table :

  • \(R(A,B,C)\)

en deux tables :

  • \(R_1(A,B)\)
  • \(R_2(A,C)\)

sans perte d’information.

Création de la table \(R(A,B,C)\)

CREATE TABLE R (
                A  char(2),
                B  char(2),
                C  char(2)
               );

INSERT INTO R VALUES('a1','b1','c1');
INSERT INTO R VALUES('a2','b1','c2');
INSERT INTO R VALUES('a3','b1','c1');
INSERT INTO R VALUES('a4','b2','c2');


CREATE TABLE R1 (
                A  char(2),
                B  char(2)
               );

INSERT INTO R1 VALUES('a1','b1');
INSERT INTO R1 VALUES('a2','b1');
INSERT INTO R1 VALUES('a3','b1');
INSERT INTO R1 VALUES('a4','b2');


CREATE TABLE R2 (
                A  char(2),
                C  char(2)
               );

INSERT INTO R2 VALUES('a1','c1');
INSERT INTO R2 VALUES('a2','c2');
INSERT INTO R2 VALUES('a3','c1');
INSERT INTO R2 VALUES('a4','c2');


CREATE TABLE R3 (
                 B  char(2),
                 C  char(2)
                );

INSERT INTO R3 VALUES('b1','c1');
INSERT INTO R3 VALUES('b1','c2');
INSERT INTO R3 VALUES('b2','c2');

-- Vérification des jointures naturelles.

SELECT * FROM R;
SELECT * FROM R1 NATURAL JOIN R2;
SELECT * FROM R1 NATURAL JOIN R3;
SELECT A,B,C FROM R2 NATURAL JOIN R3;
Employes en 2 NF ?
  • Question
  • Solution

La relation :

  • \(employes(\underline{matricule},nom,prenom,age)\)

est-elle en 2NF ?

Votre réponse :
Texte : inputlines1428.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :
Oui, car la clé (attributs soulignés) du schéma relationnel ne contient qu’un seul attribut.
Commandes en 2 NF ?
  • Question
  • Solution

La relation :

  • \(commandes(\underline{piece\_id, prod\_id},quantite,producteur\_nom)\)

est-elle en 2NF ?

Si non, quelle décomposition sans perte d’information peut-on faire ?

Votre réponse :
Texte : inputlines1432.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :

Non car un sous-ensemble de la clé (attributs soulignés) permet de retrouver les attributs non-primitifs (attributs cible):

  • \(prod\_id \rightarrow producteur\_nom\)

Quelle décomposition sans perte d’information peut-on faire ?

En appliquant le théorème de Heath on peut répartir les informations dans les deux relations suivantes :

  • \(pieces(\underline{piece\_id, prod\_id},quantite)\)
  • \(producteur(\underline{prod\_id},producteur\_nom)\)

car la différence des groupes d’attributs dépend fonctionnellement de l’intersection des groupes d’attributs

  • \(producteur\_nom=\setminus((prod\_id,producteur\_nom),(piece\_id, prod\_id,quantite))\)
  • \(prod\_id=\cap((prod\_id,producteur\_nom),(piece\_id, prod\_id,quantite))\)

On obtient ainsi un schéma relationnel en 2NF :

  • Il faut connaître l’identifiant de la pièce et du producteur pour connaître la quantite produite
  • L’identifiant du producteur suffit pour retrouver son nom.
Compagnies en .. NF
  • Question
  • Solution

En quelle forme normale est la relation :

  • \(compagnies(vol,avion,pilote)\)

si on a les DFE suivantes entre les attributs :

  • \(vol \rightarrow avion\)
  • \(avion \rightarrow pilote\)
  • \(vol \rightarrow pilote\)

Y aura t’il des anomalies de mises à jour ?

Si oui, que peut-on faire pour éviter ce problème de mises à jour

Votre réponse :
Texte : inputlines1436.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :

On est en 2NF car la clé ne contient qu’un seul attribut mais la relation n’est pas en 3NF du fait de la dépendance transitive (\(avion \rightarrow pilote\)) entre attributs non-clés.

Il y aura donc des problèmes de mises à jour. En effet, il ne sera pas possible d’introduire un nouvel avion sur un nouveau vol sans préciser un nom de pilote.

Pour éviter ce problème on pourrait proposer la décomposition suivante de la relation :

  • \(vols(\underline{vol},avion)\)
  • \(pilotes(\underline{vol},pilote)\)

qui permet de résoudre ce problème de dépendance entre attributs non-clés et de respecter la 3NF mais pas celui de la mise à jour (on perd la DF \(avion \rightarrow pilote\)).

Une décomposition basée sur le théorème de Heath permettra de préserver cette DF :

  • \(avions(\underline{avion},pilote)\)
  • \(vols(\underline{vol},avion)\)

où la différence des ensembles d’attributs :

  • \(pilote=\setminus((avion,pilote),(vol,avion))\)

dépend fonctionnellement de l’intersection :

  • \(avion=\cap((avion,pilote),(vol,avion))\)

Avec cette décomposition on évitera les problèmes de mises à jour et on pourra retrouver les informations de la relation initiale par jointure naturelle entre les deux relations.

Compagnie aérienne

On considère l’instance de la relation compagnies suivante :

compagnies
volavionpilote
AA 1234B 747Roger
AA 5678B 747Roger
AF 1234A 320Alfred
AF 5678A 380Alfred
Création de l'instance de la relation
  • Question
  • Solution

Créer l’instance de relation correspondant à cette table

Votre réponse :
sql : essai.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
Une solution possible :
CREATE TABLE compagnies (
                         vol char(7),
                         avion  char(5),
                         pilote  char(20)
                         );

INSERT INTO compagnies VALUES('AA 1234','B 747','Roger');
INSERT INTO compagnies VALUES('AA 5678','B 747','Roger');
INSERT INTO compagnies VALUES('AF 1234','A 320','Alfred');
INSERT INTO compagnies VALUES('AF 5678','A 380','Alfred');
Dépendances fonctionnelles élémentaires
  • Question
  • Solution

Quelles dépendances fonctionnelles élémentaires (DFE) pouvez-vous identifier sur cette instance de relation ?

Votre réponse :
Texte : inputlines1444.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :

On identifie sur cette instance de relation les DFE suivantes :

  • \(vol \rightarrow avion\)
  • \(avion \rightarrow pilote\)
  • \(vol \rightarrow pilote\)

puisqu’à un vol correspond un seul avion, à un avion correspond un seul pilote et (donc) à un vol correspond un seul pilote.

Par contre à un avion peut correspondre plusieurs vols et à un pilote peut correspondre plusieurs avions ou vols.

  • \(avion \nrightarrow vol\)
  • \(pilote \nrightarrow avion\)
  • \(pilote \nrightarrow vol\)
Décomposition sans préservation de DFE
  • Question
  • Solution

A partir de la table :

  • \(compagnies(\underline{vol},avion,pilote)\)

où nous disposons d’une table en 2NF (la clé est constitué d’un seul attribut) la décomposition suivante :

  • \(vols(\underline{vol},avion)\)
  • \(pilotes(\underline{vol},pilote)\)

permettra d’obtenir un schéma relationnel en 3NF car la DFE :

  • \(avion \rightarrow pilote\)

entre les attributs non-clés n’apparaît plus dans les tables résultant de la décomposition.

Créer les instance de tables correpondant à l’instance de la relation d’origine.

Vérifier par jointure que l’on retrouve bien l’instance de la relation d’origine.

Votre réponse :
sql : essai.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
Une solution possible :
CREATE TABLE vols (
                   vol char(7),
                   avion  char(5)
                  );

INSERT INTO vols VALUES('AA 1234','B 747');
INSERT INTO vols VALUES('AA 5678','B 747');
INSERT INTO vols VALUES('AF 1234','A 320');
INSERT INTO vols VALUES('AF 5678','A 380');


CREATE TABLE pilotes (
                      vol char(7),
                      pilote  char(20)
                     );

INSERT INTO pilotes VALUES('AA 1234','Roger');
INSERT INTO pilotes VALUES('AA 5678','Roger');
INSERT INTO pilotes VALUES('AF 1234','Alfred');
INSERT INTO pilotes VALUES('AF 5678','Alfred');

SELECT * FROM vols NATURAL JOIN pilotes;
Anomalies de mises à jour
  • Question
  • Solution

En utilisant la décomposition précédente, si on met à jour la table vols pour que l’avion A 380 puisse être affecté au vol AA 1234 :

UPDATE vols SET avion='A 380' WHERE vol='AA 1234';

Quel sera le résultat de la jointure naturelle entre les tables vols,pilotes ?

La DFE : \(avion \rightarrow pilote\) est-elle respectée ?

Quelle décomposition aurait-il fallu proposer pour éviter ce problème de mise à jour ?

Votre réponse :
Texte : inputlines1452.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
Une solution possible :

La décomposition de la table compagnies(vol,avion,pilote) en :

  • vols(vol,avion)
  • pilotes(vol,pilote)

permettra par jointure naturelle de retrouver l’instance de table initiale.

Par contre après mise à jour de l’élément :

UPDATE vols SET avion='A 380' WHERE vol='AA 1234';

la jointure naturelle entre les relations vols,pilotes :

  • \(\Join_{[vols.vol=pilotes.vol]}(vols,pilotes)\)

donnera un résultat qui ne respectera pas la dépendance fonctionnelle :

  • \(avion \rightarrow pilote\)

puisqu” Alfred et Roger pourront tous les deux piloter le boeing A 380.

volavionpilote
AA 1234A 380Roger
AA 5678B 747Roger
AF 1234A 320Alfred
AF 5678A 380Alfred

Cette décomposition fait perdre la DFE identifiée dans la relation d’origine :

  • \(avion \rightarrow pilote\)
Décomposition avec préservation de DFE
  • Question
  • Solution

Proposer une décomposition de la relation de départ :

  • compagnies(vol,avion,pilote)

qui permette de préserver les DFE identifiées :

  • \(vol \rightarrow avion\)
  • \(avion \rightarrow pilote\)
  • \(vol \rightarrow pilote\)

Suite à cette décomposition, créer en SQL les instances de tables correspondant à la table initiale.

Vérifiez que par jointure naturelle entre les tables vous obtenez bien les mêmes informations que celles qui sont présentes dans la table d’origine.

Vérifiez que vous préservez bien ces DFE lors de la mise à jour de l” avion A 380 que l’on affecte au :code:AA 1234`.

C’est à dire qu’il n’y aura qu’un seul avion associé à un vol, un seul avion associé à un pilote et qu’un vol ne concernera qu’un seul pilote.

Votre réponse :
Texte : inputlines1456.txt

Zone de saisie de texte

ClavierAction
F1Afficher une aide technique
F2Afficher une aide pédagogique
Ctrl-ATout sélectionner
Ctrl-CCopier la sélection dans le presse-papier
Ctrl-VCopier le presse-papier dans la sélection
Ctrl-XCouper la sélection et la copier dans le presse-papier
Ctrl-ZAnnuler la modification
Maj-Ctrl-ZRétablir la modification

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Valider la zone de saisie
Initialiser la zone de saisie
Charger le contenu d'un fichier dans la zone de saisie
Sauvegarder le contenu de la zone de saisie dans un fichier
Imprimer le contenu de la zone de saisie
sql : essai.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
Une solution possible :

Si sur la relation :

  • \(compagnies(vol,avion,pilote)\)

on a les DFE :

  • \(vol \rightarrow avion\)
  • \(avion \rightarrow pilote\)
  • \(vol \rightarrow pilote\)

On peut faire la décomposition suivante

  • \(vols(vol,avion)\)
  • \(avions(avion,pilote)\)

qui permettra de préserver la DFE :

  • \(vol \rightarrow pilote\)

par l’axiome d’Armstrong de transitivité :

  • \(X \rightarrow Y, Y\rightarrow Z \Longrightarrow X \rightarrow Z\)

On peut donc créer les tables suivantes :

CREATE TABLE vols (
                   vol char(7),
                   avion  char(5)
                  );

INSERT INTO vols VALUES('AA 1234','B 747');
INSERT INTO vols VALUES('AA 5678','B 747');
INSERT INTO vols VALUES('AF 1234','A 320');
INSERT INTO vols VALUES('AF 5678','A 380');

CREATE TABLE avions (
                avion  char(5),
                pilote  char(20)
               );

INSERT INTO avions VALUES('B 747','Roger');
INSERT INTO avions VALUES('A 320','Alfred');
INSERT INTO avions VALUES('A 380','Alfred');

A partir desquelles on pourra reconstituer la table d’origine par joiture naturelle :

  • \(\Join_{[vols.avion=avions.avion]}(vols,pilotes)\)
SELECT * FROM vols NATURAL JOIN avions;
-- ou
SELECT vol,vols.avion,avions.pilote
FROM vols, avions
WHERE vols.avion=avions.avion;

après la mise à jour (UPDATE), on vérifie bien que le résultat de la jointure naturelle :

UPDATE vols SET avion='A 380' WHERE vol='AA 1234';
SELECT * FROM vols NATURAL JOIN avions;

préservera la DFE :

  • \(avion \rightarrow pilote\)
volavionpilote
AA 1234A 380Alfred
AA 5678B 747Roger
AF 1234A 320Alfred
AF 5678A 380Alfred
 
Systèmes d'Information : Exercices, 13 avr. 2023.