Chapitre 4
Chapitre 3 : Le modèle
relationnel
Début des années 70, le modèle relationnel fait son apparition
[Codd 70]. La recherche se passionne : impossible de nier les progrès
apportés concernant la représentation et la manipulation des données
par les systèmes. Dix ans passent, les spécialistes déchantent
: ce top-model engendre en définitive des systèmes commerciaux
bien moins performants que leurs concurrents fondés sur les modèles
réseau ou hiérarchique. Deux ans plus tard et voilà que
les produits relationnels peuvent prétendre relayer les "vieux" systèmes.
Leurs apports sont fondamentaux : les nouvelles fonctionnalités permettent
un confort d'utilisation sans précédent. Les systèmes commerciaux
s'emparent des concepts de ce nouveau modèle. Celui-ci, désormais,
s'impose.
Mais quels sont ces concepts, leurs
avantages, leurs limites ? Certains sont déjà bien répandus.
Ce sont les notions de base que nous détaillerons dans la première
partie : domaine, relation, attribut ; puis la manipulation ensembliste des
relations par les opérateurs de l'algèbre relationnelle (deuxième
partie) sur lesquels sont construits des langages non procéduraux comme
SQL (chapitre 4) ; l'importante base théorique du modèle enfin
fournit des méthodes pour la conception des bases de données (chapitre
5). D'autres concepts sont toutefois moins connus qui constituent pourtant un
progrès essentiel : les vues relationnelles permettent à chaque
utilisateur de personnaliser sa vision des données et les contraintes
d'intégrité complètent la description de l'information
(chapitre 6). Les chapitres suivants présentent chacun des ressorts qui
font du modèle relationnel la référence obligée
en matière de gestion de bases de données.
III.1. Le modèle
relationnel
Le modèle relationnel, contrairement
à ceux présentés dans le chapitre précédent,
ne manipule pas des structures de données figées, mais des valeurs
: aucun chemin d'accès n'est préalablement défini (on ne
parlera désormais plus de déplacements ou de langages navigationnels),
toute manipulation des données est désormais possible. L'important
bagage théorique, et la vision tabulaire des informations, qui est agréable
à l'utilisateur, assurent le succès du modèle relationnel.
III.1.1. Une première
approche du relationnel
Nous présentons dans ce paragraphe
un moyen simple de visualiser la structure de base du modèle relationnel
: la relation. Nous décrivons ci-dessous une extension de la base des nageurs
sous la forme de tableaux de colonnes de valeurs typées et nommées.
La relation des nageurs :
La relation des plages :
La relation des baignades :
III.1.2. La construction
du modèle relationnel
Nous allons dans ce paragraphe introduire
les notions utilisées dans la construction théorique du modèle
relationnel: domaine, relation, tuple, attribut, schéma.
La notion de domaine
Définition : domaine
Un domaine est un ensemble de
valeurs (distinctes).
Cette définition correspond
à l'ensemble des valeurs que peut prendre une certaine manifestation
du monde réel. Elle s'apparente souvent à un type (entier, réel),
mais peut également être hétéroclite (date). Dans
l'exemple précédent, un domaine est l'ensemble des valeurs d'une
colonne d'un tableau : {'Mauvaise', 'Excellente', 'Bonne'} est un domaine.
Exemples de domaines :
- l'ensemble des entiers est
un domaine ;
- {3, 5.7, 124} est un domaine ;
- [-3, 4] È {5, 7} est un domaine ;
- ('Jean', 'Paul', 'Louis', 'Arthur') est un domaine ;
- (14/07/89, 15/07/89, 15/07/89) est un domaine ;
- Tout ensemble de valeurs est un domaine.
Produit cartésien de plusieurs
domaines :
Définition : produit
cartésien
Le produit cartésien d'un
ensemble de domaines D1, D2,…, Dn,
noté D1xD2x…xDn,
est l'ensemble de n-uplets (ou tuples) <v1, v2,…,
vn> tels que vi Î Di.
Exemple :
Réalisons le produit cartésien
des domaines suivants, (Plouf, Coule, Brasse), (Jean, Paul).
Comme on le voit, si un domaine représente
l'ensemble des valeurs possibles d'une manifestation du monde réel (exemples
: les cheveux sont blonds, noirs, bruns ou blancs ; les ages sont compris entre
0 et 130, etc.), le monde réel "possible" est constitué par le
produit cartésien des domaines et le monde réel "réel"
est forcément un sous ensemble du produit cartésien.
La notion de relation
Définition : relation
une relation est un sous-ensemble
du produit cartésien d'une liste de domaines.
Exemple :
la relation NAGEURS
est un sous-ensemble du produit cartésien des domaines suivants : (100,
110, 120), (Plouf, Coule, Brasse), (Jean, Paul), (Mauvaise, Bonne, Excellente).
La notion de n-uplet
Définition : n-uplet
ou tuple
un n-uplet (élément)
correspond à une ligne d'une relation.
Une autre représentation des
relations
Une autre façon de considérer
une relation à N domaines D1, D2,...
DN est de représenter un espace à N dimensions.
Dans cet espace chaque domaine correspond à l'une des dimension, chaque
n-uplet ou tuple correspond à un point de l'espace.
La notion d'attribut
Définition : attribut
Un attribut est le nom donné
à une colonne d'un tableau représentant une relation.
Exemple :
les attributs de la relation
PLAGES sont NP, NOMP, REGION, TYPE
et POLLUTION.
La notion de schéma
Définition : schéma
d'une relation
Le schéma d'une relation
est composé de son nom suivi du nom de ses attributs et de leurs domaine
:
R(A1 Ì
D1, A2 Ì D2,…,
AN Ì DN).
Lorsque le choix des domaines
est évident, on simplifie l'écriture de la façon suivante
:
R(A1, A2,…,
AN).
Exemple :
PLAGES (NP, NOMP,
TYPE, REGION, POLLUTION).
Définition : schéma
d'une base de données relationnelle
Le schéma d'une base de
données relationnelle est l'ensemble des schémas des relations
qui la composent..
Une base de données relationnelle
est constituée par l'ensemble des tuples de toutes les relations définies
dans le schéma de la base.
III.1.3. Une manipulation
ensembliste des données
Nous avons étudié au chapitre
précédent les premiers modèles de SGBD.
Que ce soit le segment dans le modèle hiérarchique ou l'article
dans le modèle réseau, la manipulation des informations s'effectue
enregistrement par enregistrement.
Dans un système relationnel,
les informations ne sont pas forcément repérées individuellement
; on sait appliquer le même traitement à un ensemble d'enregistrements
caractérisés, non par la liste des identifiants individuels, mais
par le critère que vérifie chacun des enregistrements qui composent
l'ensemble. On dit que la manipulation est ensembliste.
En particulier, pour rechercher des
tuples, il suffit de préciser un critère de sélection ;
le système déterminera l'ensemble des tuples satisfaisant ce critère
et rendra un résultat. Les tuples de ce résultat, extraits de
relations de la base, constituent eux-même une relation qu'il sera ainsi
aisé de conserver, si nécessaire, pour le plus grand confort de
l'utilisateur.
Par exemple, pour connaître
les dates et durées des bains pris par Paul Coule ainsi que les noms
des plages, on obtient le résultat suivant, qui est une relation RESULTAT
à trois attributs NOMP, DATE, DUREE
:
Typiquement, on peut classer les
requêtes en deux grandes catégories : la mise à jour de
tuples dans une relation et la recherche de tuples vérifiant une certaine
condition. Eventuellement, ces deux types de requêtes peuvent être
combinés.
La manipulation ensembliste est très
utile en mise à jour. Elle permet, par exemple, de modifier directement
la qualité de tous les nageurs ayant pris un bain sur la plage de Binic
le 14 juillet 1989, sans avoir à déterminer préalablement
la liste des nageurs qui présentent cette caractéristique. Cette
puissance d'expression explique largement le succès du relationnel.
Les insertions/suppressions sont
réalisées à l'aide de relations temporaires internes et
d'opérateurs ensemblistes d'union et de différence (détails
au paragraphe suivant). La combinaison de ces opérateurs et des opérateurs
relationnels de sélection sur des critères de recherche facilite
sensiblement les opérations de modification. C'est le cas en particulier
des modifications calculées, c'est-à-dire des modifications portant
sur un ensemble de tuples résultant eux-mêmes d'une sélection.
Exemples
- insertion ou suppression de
Paul Brasse, mauvais nageur, qui a pris un bain de 2 minutes le 14/07/1989
sur la plage de sable très polluée de Binic, en Bretagne.
- recherche des noms des nageurs ayant pris des bains de plus d'une minute
en Bretagne.
- suppression de tous les nageurs ayant pris, en février, des bains
de plus de 2 minutes en Bretagne (hydrocution ?).
Pour manipuler ces relations, nous avons
besoin d'un langage adapté dont la particularité est de savoir manipuler
aisément ces tableaux de données. Ce langage constitue l'algèbre
relationnelle.
III.2. L'algèbre
relationnelle
L'algèbre relationnelle est le
langage interne d'un SGBD relationnel. Elle se compose d'opérateurs de
manipulation des relations. Ces opérateurs sont regroupés en deux
familles : les opérateurs ensemblistes et les opérateurs relationnels.
Chacune de ces familles contient quatre opérateurs.
III.2.1. Les opérateurs
ensemblistes
L'union
Noté R È S, où
R et S représentent deux relations de même schéma, cet opérateur
permet de réaliser l'insertion de nouveaux tuples dans une relation.
Par exemple, ajouter à la relation permanente RP...
... la relation de travail RT...
... on obtient la nouvelle relation
RESULTAT = RP È RT...
Remarquons que la manipulation
est réellement ensembliste : les éléments qui pourraient
être dupliquées (insertion de la plage de Trégastel qui
figure déjà dans la relation permanente) ne le sont pas.
L'intersection
Opérateur noté R
Ç S, où R et S représentent deux relations de même
schéma, qui permet de retrouver les tuples identiques dans deux relations
.
La différence
Opérateur noté R
- S, où R et S représentent deux relations de même schéma,
qui permet de réaliser la suppression de tuples dans une relation. Par
exemple, retrancher à la relation permanente RP...
... La relation de travail RT...
... Pour obtenir la relation RESULTAT
= RP - RS…
Le produit cartésien
Si R1 et R2 sont des relations
de schémas respectifs (att1,1, att1,2,...,att1,N)
et (att2,1, att2,2,..., att2,M)
contenant respectivement T1 et T2
tuples, alors la relation R = R1 X R2
résultant du produit cartésien des deux relations a pour schéma
(att1,1, att1,2,...,att1,N,
att2,1, att2,2,..., att2,M)
et contient T1 * T2 tuples obtenus
par concaténation des T1 tuples de R1
et des T2 tuples de R2.
III.2.2. Les opérateurs
relationnels
La restriction
Noté sE(R)
où E exprime un prédicat sur une relation R, cet opérateur
permet de ne conserver, dans une relation, que les tuples dont les attributs
vérifient une certaine condition. Par exemple, la relation permanente
RP...
… réduite aux plages à
forte pollution (le prédicat E se note POLLUTION = 'forte') donne la
relation RESULTAT…
La projection
Noté pA1,...,AN(R)
où A1,...,AN représentent
des attributs particuliers de la relation R, cet opérateur permet de
ne conserver que certains attributs d'une relation. Par exemple, les différentes
régions et leurs niveaux de pollution sont obtenus par projection de
la relation PLAGES sur les attributs REGION et POLLUTION...
Notons l'aspect ensembliste de
cette opération qui ne duplique pas le tuple ('Normandie', 'forte') qui
figurait en double dans la relation intermédiaire résultat d'une
projection brutale de la relation initiale.
La jointure
Définition :
La jointure de deux relations
R et S selon une qualification multi-attributs Q est l'ensemble des tuples
du produit cartésien RxS satisfaisant la qualification Q.
Notation
Il existe plusieurs notations
possibles de cet opérateur. Les plus répandues sont :
- JOIN (R, S/Q) ;
- R |x|Q S
équi-jointure
La qualification Q consiste simplement
en l'égalité entre différents attributs des deux relations.
C'est le cas le plus courant de jointure.
Exemple :
Pour connaître les bains
pris par les différents nageurs, il suffit d'effectuer l'équi-jointure
entre les deux relations NAGEURS et BAIGNADES
sur chacun de leur attribut NN
dans le cas d'une équi-jointure,
on peut éliminer la colonne en double ; on parle alors d'équi-jointure
naturelle.
Exemple d'inéqui-jointure
:
Quels sont les nageurs ayant
pris des bains sur une plage de numéro NP supérieur
à leur propre numéro d'identification NN
?
Autre exemple de jointure :
Quels sont les nageurs ayant
pris des bains de durée égale à leur numéro ?
La division
Noté R ¸ S où
R et S désignent deux relations, cet opérateur, plus complexe,
permet de connaître toutes les valeurs d'un domaine qui sont en correspondance
avec toutes les valeurs d'un autre domaine. Par exemple, existe-t-il des nageurs
qui ont pris des bains à la fois le 14/07/89 et le 15/07/89 ? Pour le
savoir, il suffit d'effectuer la division de la relation Baignade projetée
sur (NN, DATE) (notée RES1)
par la colonne DATE restreinte aux 14/07/89 et au 15/07/89
:
Les tuples du résultat RESF
(NN), concaténés à tout tuple de DATES
(DATE) donne un tuple de RES1 (NN,
DATE). Ainsi, l'ensemble des tuples résultats du
produit cartésien de RESF et DATES
sont dans RES1.
III.2.3. Opérateurs
de base et opérateurs dérivés
Cinq de ces huit opérateurs forment
les opérateurs de base (ce sont l'union, la différence, le produit
cartésien, la restriction et la projection) tandis que les trois autres,
appelés opérateurs dérivés, s'obtiennent plus ou moins
facilement par combinaison des opérateurs de base :
R Ç S = R - (R - S)
R |x| S (Ai, Bj) = s
iqj
(R x S)
R ¸ S = pi1,…,i(r-s)
(R) - pi1,…,i(r-s) ( (pi1,…,i(r-s)
(R) x S) - R)
Les cinq opérateurs de base
permettent de répondre à toutes les questions que l'on peut poser
avec la logique du premier ordre (c'est à dire sans les fonctions) :
on dit que l'algèbre relationnelle est complète.
En réalité, nous n'utiliserons
dans nos requêtes que les opérateurs les plus maniables : ce sont
l'union et la différence pour l'insertion et la suppression de tuples
dans la base et la restriction, la projection et la jointure pour la recherche
sélective de tuples.
III.2.4. Des exemples
de requêtes
Exemple 1 :
Donner les noms des plages fortement
polluées.
Cette requête comprend deux
opérations,
TEMP = Rest (PLAGES,
POLLUTION = 'forte')
RESU = Proj (TEMP,
NOMP)
Ce qui se note encore :
RESU = Proj (Rest(PLAGE,
POLLUTION = 'forte'), NOMP)
Exemple 2 :
Donner les noms des personnes
ayant pris un bain en Bretagne.
T1 = Rest (PLAGE, REGION
= 'Bretagne')
T2 = Join (T1,
BAIGNADE, T1.NP = BAIGNADE.NP)
T3 = Join (T2,
NAGEURS, T2.NN = NAGEURS.NN)
RESU = Proj (T3, NOM)
Exemple 3 :
Insertion de la plage de sable
"Fort bloqué", en Bretagne, faiblement polluée avec le numéro
120.
PLAGES = PLAGES È(120,
'Fort bloqué', 'sable', 'Bretagne', 'faible').
Exemple 4 :
Suppression des nageurs de qualité
médiocre.
NAGEURS = NAGEURS -
Rest( NAGEURS, QUALITE = 'médiocre')
III.2.5. Les arbres algébriques
et l'optimisation
Nous venons de voir comment décrire
une requête au moyen des opérateurs de l'algèbre relationnelle.
Toutefois, l'écriture de cette combinaison d'opérateurs est malaisée
à déchiffrer. Il existe en contrepartie une description graphique
plus lisible : l'arbre algébrique.
Un arbre algébrique est un
arbre dont :
- les feuilles sont les relations
de base ;
- les nœuds sont les opérateurs
;
- la racine est le résultat
;
- les liens représentent
les flux de données.
Ainsi, des nœuds différents représentent
les cinq principaux opérateurs relationnels : l'union, la différence,
la restriction, la projection et la jointure.
L'union :
La différence :
La restriction :
La projection :
La jointure :
Nous pouvons dès lors facilement
représenter la requête :
"Sur quelle plage (NOMP)
Jean Plouf a-t-il pris des bains de plus de deux minutes ? "
Remarquons que cette requête
peut s'exécuter de diverses façons :
Première méthode
Une première méthode
d'exécution de requête peut minimiser le nombre d'opérations
à effectuer. C'est ce que nous faisons ici en exécutant les jointures
dans un premier temps, puis en repoussant à la fin la restriction et
la projection qui permettent d'obtenir le résultat désiré.
On minimise ainsi le nombre d'opérations à effectuer, mais on
réalise des jointures sur des relations très volumineuses. ce
qui augmente considérablement les tailles des relations intermédiaires
et donc le coût global d'exécution de la requête.
Deuxième méthode
Quelle que soit l'heuristique choisie
pour exécuter la requête. Déterminer dans quel ordre l'exécution
des jointures entraîne un coût minimum est intéressant. Suivant
la taille des relations mises en jeu, la différence de coût Correspondant
à une inversion dans l'ordre des jointures peut être considérable.
Troisième méthode
Toutefois, compte tenu du coût
très important des jointures et de l'importance de la taille des relations
mises en jeu, il vaut mieux rajouter des étapes intermédiaires
qui diminuent la taille des relations à l'entrée des jointures.
Le coût supplémentaire est compensé par une baisse sensible
du coût des jointures. C'est ce que nous faisons ici : les opérations
de jointure agissent sur des relations réduites au maximum par des restrictions
et des projections.
Quatrième méthode
Nous pouvons affiner cette méthode
en éliminant après chaque jointure les attributs devenus inutiles
pour l'obtention du résultat final.
Cinquième méthode
Enfin, nous pouvons également
être amenés à rechercher les critères de variation
du coût entre la méthode décrite ci-dessous et la précédente.
Nous rajoutons ici une première étape de projection avant la première
restriction.
A partir de cet exemple, nous constatons
qu'à une même requête correspond de multiples plans d'exécution.
Le choix d'un plan par rapport à un autre a de nombreuses implications
quant à la durée d'exécution de la requête.
Enfin, si la vérification
que l'ordre des opérateurs permet de réaliser la question initialement
posée, choisir parmi les nombreuses solutions qui n'affectent pas le
résultat, mais seulement la rapidité d'exécution de la
requête est plus délicat .
En effet, se préoccuper activement
du coût d'exécution d'une requête est nécessaire :
un SGBD est jugé sur sa rapidité.
Une heuristique simple consiste à
restreindre le plus vite possible la taille des relations intermédiaires
pour diminuer le coût . Pour ce faire, nous utilisons les propriétés
des différents opérateurs :
- associativité des jointures
;
- commutativité restriction/jointure ;
- commutativité restriction/projection (si le critère de restriction
porte sur les attributs projetés);
- commutativité projection/jointure (si le critère de jointure
porte sur les attributs projetés).
Une méthode relativement aisée
à mettre en œuvre consiste à disposer en entrée des jointures
de relations les plus petites possibles, ce qui revient à faire précéder
les jointures, opérations les plus coûteuses, du maximum de restrictions
et de projections possibles sans altérer le résultat final.
De façon générale
; il est indispensable de disposer :
- de relations initiales et intermédiaires
les plus petites possibles ;
- de techniques de placement adaptées qui permettent de ne pas rapatrier
toute une relation pour isoler les informations intéressantes (voir
chapitre 7) ;
- d'algorithmes performants implantant les opérateurs relationnels.
III.3. Conclusions
Les SGBD existant à ce jour mettent
en œuvre des techniques performantes pour la manipulation des données.
Par exemple, tous les SGBD offrent
aujourd'hui un langage assertionnel de requêtes, SQL. Un langage assertionnel
permet de poser la requête sous la forme d'une ou de plusieurs conditions
(assertions) à remplir sans se préoccuper de l'ordre des différentes
opérations à effectuer au niveau du système. C'est au SGBD
d'analyser la condition et de la décomposer en une requête de l'algèbre
relationnelle.
L'optimiseur de requêtes est
un composant très important d'un SGBD relationnel. L'étape fondamentale
est la construction d'un arbre algébrique optimisé, en déterminant
le meilleur ordre d'exécution des diverses opérations. Cependant,
les SGBD utilisent d'autres critères (contraintes d'intégrité,
taille des relations candidates, méthodes de placement…) soit pour aider
à la construction de l'arbre optimisé, soit pour réfuter
logiquement une requête et pour choisir l'algorithme adéquat à
la réalisation d'une opération particulière (une même
opération dispose couramment de différents algorithmes dont les
performances varient suivant les caractéristiques des relations mises
en jeu).
L'opération de jointure ou
la prise en compte des temps de transit de données dans des systèmes
répartis sont un bon exemple de la multiplicité des algorithmes
existants.
Les améliorations sur le marché
suivent de près les progrès de la recherche et les produits évoluent
vite : les premières versions de nombreux produits offraient des algorithmes
peu performants, mais la situation a bien changé depuis. Les SGBD
demeurent toutefois des produits délicats à évaluer, comme
c'est souvent le cas des produits informatiques. L'utilisation d'un algorithme
ne suffit pas à garantir sa bonne utilisation. Notez en particulier l'importance
essentielle des méthodes de stockage et des primitives de bas niveau
offertes par le système d'exploitation pour l'efficacité des SGBD.
Pour toutes ces raisons, le modèle relationnel, malgré sa "beauté
conceptuelle", a mis beaucoup de temps à s'imposer sur le marché.
III.4. Références
[Astrahan 76] M. ASTRAHAN
et al : "System R : A Relational Approach to Database Management", ACM
Transactions on Database Systems, Vol 1, N°2, 1976.
[Codd 70] E.F. CODD,
"A Relational Model of Data for Large Shared Data Banks", Communications
ACM, V13, N6, Juin 1970, pp 377-387.
Chapitre 4