Bases de données relationnelles

I. Introduction

A. Exemple introductif

On souhaite informatiser notre ludothèque. On peut représenter cela sous la forme d'une table ainsi :

Nom du jeuAuteur 1Auteur 2ÉditeurNbJoueursMinNbJoueursMaxNationalité éditeurDurée en minIllustrateurNationnalité illustrateurThèmes
Les chevaliers de la table ronde Bruno Cathala S. Laget Days of wonder 3 7 Française 90 Julien Delval Française Moyen-âge, Légende arthurienne
Cargo Noir Serge Laget Days of wonder 2 5 Française 60 Miguel Coimbra Française Marché Noir, Navigation marchande
Era : medieval age Matt Leacock EggertSpiele 1 4 Allemande 50 Chris Quilliams Canadienne Médiéval, Construction
Smash up Paul Peterson Iello 2 4 Française 45 Bruno Balixa, Dave Alsop, Franciso Rico Torres Américaine Fantastique, Monstre, Pirate

Cet exemple servira de fil rouge tout au long de ce court, aussi devez-vous vous y référer chaque fois que cela sera nécessaire.

B. Quelques premières définitions

On appelle une telle table une Relation. Cette table est notamment définie par l'ensemble des noms des colonnes, appelé Schéma de relation, à savoir (Nom du jeu, Auteur 1, Auteur 2, Éditeur, NbJoueursMin, NbJoueursMax, Nationalité éditeur, Durée en min, Illustrateur, Nationnalité illustrateur, Thèmes).

On appelle chaque ligne de la table un Enregistrement ou un Tuple. Les colonnes peuvent être appelées Attribut ou Champ. Les attributs sont caractérisés par un nom et un type (ou ensemble de définition).

C. Premiers constats

Une telle table présente plusieurs inconvénients :

D. Modification de la table

Pour éviter le problème des dépendances multiples (plusieurs auteurs et illustrateurs), on préfère représenter les informations précédentes sous la forme suivante :

Nom du jeuAuteurÉditeurNbJoueursMinNbJoueursMaxNationalité éditeurDurée en minIllustrateurNationnalité illustrateurThèmes
Les chevaliers de la table ronde Bruno Cathala Days of wonder 3 7 Française 90 Julien Delval Française Moyen-âge, Légende arthurienne
Les chevaliers de la table ronde S. Laget Days of wonder 3 7 Française 90 Julien Delval Française Moyen-âge, Légende arthurienne
Cargo Noir Serge Laget Days of wonder 2 5 Française 60 Miguel Coimbra Française Marché Noir, Navigation marchande
Era : medieval age Matt Leacock EggertSpiele 1 4 Allemande 50 Chris Quilliams Canadienne Médiéval, Construction
Smash up Paul Peterson Iello 2 4 Française 45 Bruno Balixa Américaine Fantastique, Monstre, Pirate
Smash up Paul Peterson Iello 2 4 Française 45 Franciso Rico Torres Américaine Fantastique, Monstre, Pirate
Smash up Paul Peterson Iello 2 4 Française 45 Dave Alsop Américaine Fantastique, Monstre, Pirate

Avec une telle représentation, le problème de redondance devient alors criant.

II. Un peu de vocabulaire et de théorie...

A. Notion de dépendance fonctionnelle

1. Définitions

Pour mieux structurer la représentation de notre ludothèque, on introduit la notion de dépendance fonctionnelle entre attributs :

Il y a dépendance fonctionnelle (df) d'un ensemble d'attributs E vers un attribut A si et seulement si, sur l'ensemble des enregistrements que peut contenir la table, la valeur de A dépend fonctionnellement des valeurs des attributs de E. Autrement dit, pour tous les enregistrements ayant même valeurs pour les attributs de E, la valeur de A est identique.

Par ailleurs, on préfère avoir uniquement des champs atomiques :

Un attibut est atomique si et seulement si il ne contient qu'une seule information.

2. Exercices

Exercice 1 : Dans l'exemple introductif, déterminez les champs qui ne sont pas atomiques, et proposez un nouveau schéma de relation.

L'attribut Thèmes est bien évidemment un attribut non atomique, puisque, comme mentionné au-dessus, il peut contenir plusieurs thèmes.

L'atomicité des champs Auteur 1, Auteur 2 et Illustrateur est quant à elle discutable : si l'on souhaite pouvoir mieux caractériser les auteurs et ilustrateurs, il peut être souhaitable de distinguer prénom et nom.

On peut alors proposer le schéma de relation suivant :

Ω = (NomJeu, NomAuteur, PrénomAuteur, Éditeur, NbJoueursMin, NbJoueursMax, NationalitéÉditeur, Durée, NomIllustrateur, PrénomIllustrateur, NationnalitéIllustrateur, Thème)

Exercice 2 : Sur le schéma de relation Ω déterminé dans l'exercice précédent, donneez l'ensemble des dépendances fonctionnelles qui existent.

Il existe un grand nombre de dépendances fonctionnelles. Il y a bien sûr celles qui viennent naturellement à l'esprit :

  • NomJeu → Éditeur
  • NomJeu → NbJoueursMin
  • NomJeu → NbJoueursMax
  • NomJeu → Durée
  • Éditeur → NationalitéÉditeur
  • (NomIllustrateur, PrénomIllustrateur) → NationalitéIllustrateur

Mais il y a également des dépendances fonctionnelles tellement triviales qu'on a tendance à les oublier ; ce sont toutes les dépendances réflexives :

  • NomJeu → NomJeu
  • NbJoueursMin → NbJoueursMin
  • ...

Et il y a également d'autres dépendances, toutes aussi triviales, obtenues par Augmentation :

  • (NomJeu, NomÉditeur) → Nomjeu
  • (NomÉditeur, NomAuteur, PrénomIllustrateur) → PrénomIllustrateur
  • ...

La composition de fonction étant une loi de composition interne, la notion de dépendance fonctionnelle est également transitive. Et donc on a également par exemple :

  • NomJeu → NationalitéÉditeur

3. Couverture minimale

Face à un schéma de relation Ω et un ensemble de dépendances fonctionnelles DF, on essaie en général de déterminer un ensemble minimale de dépendances fonctionnelles non triviales (ni réflexives, ni liées à l'augmentation) dont la fermeture transitive est égale à la fermeture transitive de l'ensemble DF.

On appelle fermeture transitive d'un ensemble de dépendances fonctionnelles df1 l'ensemble de dépendances fonctionnelles ftdf obtenu en appliquant les règles de transitivité, de réflexivité et d'augmentation à dfi pour obtenir dfi+1 jusqu'à ce que dfi+1 soit égale à dfi. dfi a alors pour valeur ftdf.

On appelle Couverture minimale d'une structure (Ω, DF1) une structure (Ω, CMDF) telle que :

  • La fermeture transitive de CMDF est égale à la fermeture transitive de DF1 ;
  • Aucune dépendance fonctionnelle de CMDF ne peut être éliminée sans perdre l'égalité des fermetures transitives.

Il existe des algorithmes pour calculer la couverture minimale d'un ensemble de dépendances fonctionnelles, mais cela dépasse le cadre de ce cours.

Remarque : Souvent, on omet le schéma de relation dans la définition de la fermeture transitive.

Exercice 3 : Déterminez la couverture minimale du schéma de relation précédent.

Sur l'exemple précédent, une couverture minimale est la suivante : CMDF = {NomJeu → Éditeur, NomJeu → NbJoueursMin, NomJeu → NbJoueursmax, NomJeu → Durée, Éditeur → NationalitéÉditeur, (NomIllustrateur, PrénomIllustrateur) → NationalitéIllustrateur}

Remarque : cela suppose qu'il n'y a pas 2 jeux de mêmes noms, ni 2 illustrateurs homonymes.

On représente souvent un ensemble de dépendances fonctionnelles sous la forme d'un graphe exempt des df triviales.

Exercice 3bis : Représentez la couverture minimale obtenue à l'exercice 3 par un graphe de dépendances fonctionnelles.

graphe des dépendances fonctionnelles

B. Notion de clé

Une clé d'une structure (Ω, DF) est un sous-ensemble d'attributs de Ω qui permet d'obtenir, par fermeture transitive de DF, l'ensemble Ω.

Corollaire : Dans une relation, il ne peut pas y avoir plusieurs tuples ayant même valeurs pour l'ensemble des attributs clef.

Notation : Dans un schéma de relation, on représente en général les attributs faisant partie de la clé retenue en les soulignant.

Une clé minimale d'une structure (Ω DF) est une clé dont aucun sous-ensemble n'est clé de (Ω DF).

Remarque : la clé minimale d'une relation n'est pas forcément unique.

Exercice 4 : Déterminer une clé minimale pour le cas de la ludothèque.

Une clé minimale de (Ω, CMDF) est : (NomJeu, NomAuteur, PrénomAuteur, NomIllustrateur, PrénomIllustrateur, Thème).

C. Formes Normales

Pour éviter un certain nombre de problèmes (redondance par exemple), différentes formes normales ont été définies pour les bases de données. Voici les 3 premières :

Un schéma de relation est en Première Forme Normale (1FN) si et seulement si tous ses attributs sont atomiques.

Un schéma de relation est en Deuxième Forme Normale (2FN) si et seulement si :

  • Il est en 1FN ;
  • Aucun attribut non clé ne dépend que d'une partie de la clé.

N.B. : par "attribut non clé", il faut comprendre "non membre d'une clé minimale".

Un schéma de relation est en Troisième Forme Normale (3FN) si et seulement si :

  • Il est en 2FN ;
  • Il n'y a aucune dépendance fonctionnelle entre attributs non clés.

N.B. : par "attribut non clé", il faut comprendre "non membre d'une clé minimale".

Remarque : La 3FN ne garantit pas totalement l'absence de redondance dans tous les cas.

Exercice 5 : Déterminez si la structure (Ω, CMDF) est en 1FN, en 2FN et en 3FN.

La structure (Ω, CMDF) est en 1FN puisque tous ses attributs sont atomiques (suite au travail fait à l'exercice 1).

La structure (Ω, CMDF) n'est pas en 2FN puisque l'attribut NationalitéIllustrateur ne dépend que d'une partie de la clé (NomIllustrateur, PrénomIllustrateur).

La structure (Ω, CMDF) n'est pas en 3FN puisqu'elle n'est pas en 2FN.

D. Transformer un schéma de relation en 3FN

Il est toujours possible de transformer un schéma de relation en 3FN. Pour cela, Il va falloir créer plusieurs relations afin de se ramener aux règles des différentes formes normales.

1. Rendre tous les attributs atomiques

Cette première phase permet d'obtenir une relation en 1FN. C'est ce qui a été fait dans l'exercice 1.

2. Passer en 2FN

Pour passer en 2FN, on va éclater le schéma de relation initial en plusieurs schémas, de façon à ce que chaque fois qu'on a une dépendance fonctionnelle de la forme (partieClé → attribut), on crée une relation spécifique avec pour clé partieClé et pour attribut non clé attribut. Une fois ceci fait, si plusieurs relations ont même clé, on les fusionne en 1 seule relation ayant tous les attributs des relations de départ. Par ailleurs, on gardera une relation avec l'ensemble des attributs de la clé minimale.

Exercice 6 : Transformer la structure (Ω, CMDF) en une structure en 2FN.

  • R1 = (NomJeu, NomAuteur, PrénomAuteur, NomIllustrateur, PrénomIllustrateur, Thème)
  • R2 = (NomJeu, Éditeur, NbJoueursMin, NbJoueursMax, Durée, NationalitéÉditeur)
  • R3 = (NomIllustrateur, PrénomIllustrateur, NationalitéIllustrateur)

3. Passer en 3FN

Pour passer en 3FN, pour chaque dépendance de la forme AttributNonClé → Attribut, on va créer une table (AttributNonClé, Attribut), et on supprime Attribut de la relation de départ. À la fin du processus, on fusione les tables de même clé.

Exerice 7 : Passer le schéma de relation précédent en 3FN

Dans le schéma en 2FN, la seule df violant la règle de la 3FN est la df Éditeur → NationalitéÉditeur. On obtient donc :

  • R1 = (NomJeu, NomAuteur, PrénomAuteur, NomIllustrateur, PrénomIllustrateur, Thème)
  • R2a = (NomJeu, Éditeur, NbJoueursMin, NbJoueursMax, Durée)
  • R2b = (Éditeur, NationalitéÉditeur)
  • R3 = (NomIllustrateur, PrénomIllustrateur, NationalitéIllustrateur)

Exercice 8 : Transformez la table donnée en énoncé en plusieurs tables conformes au schéma de relation obtenu dans l'exercice précédent.

R1
NomJeu NomAuteur PrénomAuteur NomIllustrateur PrénomIllustrateur Thème
Les chevaliers de la table ronde Cathala Bruno Delval Julien Moyen-âge
Les chevaliers de la table ronde Laget Serge Delval Julien Moyen-âge
Les chevaliers de la table ronde Cathala Bruno Delval Julien Légende Arthurienne
Les chevaliers de la table ronde Laget Serge Delval Julien Légende Arthurienne
Cargo Noir Laget Serge Coimbra Miguel Marché noir
Cargo Noir Laget Serge Coimbra Miguel Navigation marchande
Era: medieval age Leacock Matt Quilliams Chris Médiéval
Era: medieval age Leacock Matt Quilliams Chris Construction
Smash Up Peterson Paul Balixa Bruno Fantastique
Smash Up Peterson Paul Torres Francisco Rico Fantastique
Smash Up Peterson Paul Alsop Dave Fantastique
Smash Up Peterson Paul Balixa Bruno Monstre
Smash Up Peterson Paul Torres Francisco Rico Monstre
Smash Up Peterson Paul Alsop Dave Monstre
Smash Up Peterson Paul Balixa Bruno Pirate
Smash Up Peterson Paul Torres Francisco Rico Pirate
Smash Up Peterson Paul Alsop Dave Pirate
R2a
NomJeu Éditeur NbJoueursMin NbJoueursMax Durée
Les chevaliers de la table ronde Days of wonder 3 7 90
Cargo Noir Days of wonder 2 5 60
Era: medieval age EggertSpiele 1 4 50
Smash up Iello 2 4 45
R2b
Éditeur NationalitéÉditeur
Days of wonder Française
EggertSpiele Allemande
Iello Française
R3
NomIllustrateur PrénomIllustrateur NationalitéIllustrateur
Delval Julien Française
Coimbra Miguel Française
Quilliams Chris Canadienne
Balixa Bruno Américaine
Alsop Dave Américaine
Torres Francisco Rico Américaine

E. Remarque sur la 3FN et sur le travail fait précédemment

La 3FN permet d'éviter un certain nombre de redondances, mais ne les supprime pas toutes, comme on peut le voir sur l'exemple précédent. On peut bien sûr obtenir mieux, mais avec un schéma qui n'est pas équivalent au schéma initial. Les explications dépassent cependant le cadre de ce cours.

Par ailleurs, procéder comme cela a été fait précédemment ne permet pas de mettre en évidence que les attributs (NomAuteur, PrénomAuteur) correspondent à une même entité, à savoir la notion d'Auteur.