Vous êtes sur la page 1sur 21

Algèbre Relationnelle

Chapitre 4, Sections 4.1 – 4.2


Langages de Requêtes relationnels
 Langages de requêtes: Permettent la manipulation et l’extraction
des données d’une base de données.
 Le modèle relationnel supporte de simples et puissants LRs:
 Solide fondation formelle basée sur la logique.
 Permet beaucoup d’optimisation.
 Langages de requêtes != langages de programmation!
 Les LRs ne sont pas équivalents à la machine de Turing.
 Ils ne sont pas destinés à être utilisés pour des calculs complexes.
 Ils supportent un accès facile et efficient à de larges ensembles de
données.
Langage de Requêtes Relationnels (Suite)

 Deux langages de requêtes à caractère


mathématique forment le soubassement des
langages réels comme SQL et de
l’implémentation de ceux-ci :
 Algèbre relationnelle: Plus opérationnelle, très utile
pour représenter les plans d’exécution.
 Calcul relationnel: Permet aux utilisateurs de
décrire ce qu’ils veulent, plutôt que la manière
dont ce qu’ils veulent doit être calculé. (Non
opérationnel, déclaratif.)
Préliminaires
 Une requête est appliquée aux instances relationnelles et
son résultat est aussi une instance relationnelle.
 Les schémas des relations d’entrée d’une requête sont fixes (la
requête exécutera cependant indépendamment de l’instance!)
 Le schéma du résultat d’une requête donnée est aussi fixe! Il est
déterminé par la définition des éléments du langage des
requêtes.
 Notation positionnelle vs. notation nominale:
 La notation positionnelle est plus facile à utiliser dans les
définitions formelles.
 La notation nominale est plus lisible.
 Les deux notations sont utilisées dans SQL.
R1 sid bid day
Exemple d’Instances 22 101 10/10/96
58 103 11/12/96
 Nous utilisons les relations sid sname rating age
“Sailors” et “Reserves” S1
pour nos exemples. 22 dustin 7 45.0
 Nous utiliserons les 31 lubber 8 55.5
notations positionnelles et 58 rusty 10 35.0
nominales selon les cas et
assumeront que les noms
S2 sid sname rating age
des attributs des résultats
28 yuppy 9 35.0
des requêtes seront hérités
des noms des attributs des
31 lubber 8 55.5
relations d’entrée des 44 guppy 5 35.0
requêtes. 58 rusty 10 35.0
Algèbre Relationnelle
 Opérations de base:


Sélection ( ) Sélectionne un sous-ensemble des lignes d’une relation.
 Projection ( ) Efface des colonnes d’une relation.


Produit Cartésien ( ) Permet de combiner deux relations.

relation 2. 
Différence ( ) Contient des tuples de la relation 1, moins ceux de la

 
Union ( ) Contient les tuples des relations 1 et 2.
 Opérations additionnelles:

 Intersection, join, division, « renaming »: Pas essentielles; utiles.
 Les opérations retournant une relation, elles peuvent être
composées! (L’algèbre est close.)
sname rating
Projection yuppy 9
lubber 8
 Efface les attributs qui ne sont pas dans
la liste de projection.
guppy 5
 Le Schéma du résultat contient
rusty 10
exactement les attributs de la liste de
projection, avec les mêmes noms qu’ils
 sname,rating(S2)
portaient dans la seule relation d’entrée
de la projection.
 L’opérateur de projection doit éliminer
les duplicata! (Pourquoi?) age
 Note: les systèmes réels n’éliminent
pas les duplicata, à moins que
35.0
l’utilisateur le fasse explicitement. 55.5
(Pourquoi?)
 age(S2)
sid sname rating age
Sélection 28 yuppy 9 35.0
58 rusty 10 35.0
 Sélectionne les lignes qui
ne satisfont pas une  rating 8(S2)
condition de sélection.
 Pas de duplicata dans le
résultat.
 Schéma du résultat sname rating
identique au schéma de la yuppy 9
seule relation d’entrée.
rusty 10
 Le résultat peut être
l’entrée d’une autre
opération algébrique  sname,rating( rating 8(S2))
(Composition d’opérateurs).
Union, Intersection, Différence
 Toutes ces opérations
prennent comme entrées sid sname rating age
deux relations qui doivent 22 dustin 7 45.0
être compatible vis-à-vis de 31 lubber 8 55.5
l’union: 58 rusty 10 35.0
 même nombre de colonnes.
44 guppy 5 35.0
 colonnes correspondantes ont
le même type.
28 yuppy 9 35.0
 Par convention, le schéma du S1 S2
résultat sera le schéma de la
1ère relation. sid sname rating age
sid sname rating age 31 lubber 8 55.5
22 dustin 7 45.0 58 rusty 10 35.0

S1 S2 S1 S2
Produit Cartésien
 Chaque ligne de S1 est appariée avec chaque ligne de R1.
 Le schéma du résultat contient les attributs de S1 et R1,
avec les noms d’attributs hérités si possible.
 Conflit: S1 et R1 ont chacun un attribut portant le nom sid.
 Solution: changer le nom des attributs (« renaming »).
(sid) sname rating age (sid) bid day
22 dustin 7 45.0 22 101 10/10/96
22 dustin 7 45.0 58 103 11/12/96
31 lubber 8 55.5 22 101 10/10/96
31 lubber 8 55.5 58 103 11/12/96
58 rusty 10 35.0 22 101 10/10/96
58 rusty 10 35.0 58 103 11/12/96

 Opérateur de renaming:  (C(1 sid1, 5  sid 2), S1 R1)


1
Joins
 Join conditionnel: R  c S   c ( R  S)
(sid) sname rating age (sid) bid day
22 dustin 7 45.0 58 103 11/12/96
31 lubber 8 55.5 58 103 11/12/96
 1  est le même que celui
Le Schéma duSrésultat R1 du produit Cartésien.
S1. sid  R1. sid
 Moins de tuples que dans le produit Cartésien; pourrait être
calculé de manière plus efficiente.
 Parfois appelé theta-join.

1
Joins (Suite)
 Equi-Join: Un cas spécial du join conditionnel où la
condition c contient seulement des égalités.
sid sname rating age bid day
22 dustin 7 45.0 101 10/10/96
58 rusty 10 35.0 103 11/12/96
S1  R1
sid
 Schéma du résultat similaire au produit Cartésien, mais
contient seulement une copie des attributs pour lesquels
l’égalité est spécifiée.
 Join naturel: Equi-join dans lequel il y a égalité entre tous
les attributs ayant le même nom dans les deux relations.

1
Division
 N’est pas supportée comme opérateur primitif, mais est utile
pour l’expression des requêtes telles que:
Trouver tous les
navigateurs qui ont réservé tous les bateaux.
 Soit A une relation avec 2 attributs, x et y; B a seulement un
attribut y:
 A/B = x |  x, y  A  y  B 
 i.e., A/B contient tous les tuples x (navigateurs) tels que pour chaque
tuple y (bateau) de B, il y a un tuple xy dans A.
 Ou: Si l’ensemble des valeurs de y (bateaux) associées avec une valeur
x (navigateur) de A contient toutes les valeurs de y dans B, la valeur de
x est dans A/B.
 En général, x et y peuvent être n’importe quelles listes
d’attributs; y est la liste des attributs de B, et x y est la liste
des attributs dans A.

1
Exemples de Division A/B
sno pno pno pno pno
s1 p1 p2 p2 p1
s1 p2 p4 p2
s1 p3 B1 p4
s1 p4
B2
s2 p1 sno B3
s2 p2 s1
s3 p2 s2 sno
s4 p2 s3 s1 sno
s4 p4 s4 s4 s1

A A/B1 A/B2 A/B3


1
Définition de A/B
 La division n’est pas essentielle car elle peut être
définie à l’aide des opérateurs de base.
 (Cela est vrai aussi pour les joins –- on l’a vu ! --, mais les
joins sont si répandus que les SGBDs les implémentent
directement.)
 Idée: Pour A/B, calculer toutes les valeurs de x qui
ne sont disqualifiées par une valeur de y dans B.
 Une valeur de x est disqualifiée si en attachant une valeur
de y venue de B, nous obtenons un tuple xy qui n’est pas
dans A.
Valeurs disqualifiées de x:  x (( x ( A)  B)  A)
A/B:  x ( A)  tous les tuples disqualifiés
1
Trouver les noms de tous les navigateurs qui ont
réservé le bateau #103
 Solution 1:  sname(( Reserves)  Sailors)
bid 103

 Solution 2:  (Temp1,  Re serves)


bid  103

 ( Temp2, Temp1  Sailors)


 sname (Temp2)

 Solution 3:  sname ( (Re serves  Sailors))


bid 103
1
Trouver les noms de tous les navigateurs qui ont
réservé un bateau rouge

 L’info au sujet de la couleur des bateaux ne


peut être enregistrée que dans Boats; d’où le
besoin d’un join supplémentaire:
 sname (( Boats)  Re serves  Sailors)
color ' red '
 Une solution plus efficiente:
 sname ( ((  Boats)  Re s)  Sailors)
sid bid color ' red '

Un optimisateur des requêtes peut trouver cette dernière solution,


Si on lui donne la première solution!
1
Trouver les navigateurs qui ont réservé un bateau
rouge ou vert
 D’abord identifier tous les bateaux rouges ou
verts, ensuite trouver les navigateurs qui ont
réservé l’un de ces bateaux:
 (Tempboats, ( Boats))
color ' red '  color ' green '
 sname(Tempboats  Re serves  Sailors)
 On peut aussi définir Tempboats en utilisant
une union.
 Que se passe-t-il si l’on remplace la disjonction
par une conjonction?
1
Trouver les navigateurs qui ont réservé une
bateau rouge et vert
 On ne peut ici utiliser l’approche précédente! On
doit d’abord identifier qui a réservé des bateaux
rouges, ensuite qui a réservé des bateaux verts, et
enfin calculer l’intersection.

 (Tempred,  (( Boats)  Re serves))


sid color ' red '
 (Tempgreen,  (( Boats)  Re serves))
sid color ' green'

 sname((Tempred  Tempgreen)  Sailors)

1
Trouver les noms des navigateurs qui ont réservé
tous les bateaux
 Utiliser la division; les schémas des relations
d’entrée à diviser doivent être choisis avec soins:

 (Tempsids, ( Re serves) / ( Boats))


sid, bid bid
 sname (Tempsids  Sailors)

 Trouver ceux qui ont réservé tous les bateaux ‘VIP’:


..... / ( Boats)
bid bname 'VIP'
2
Résumé

 Le modèle relationnel a des langages de requêtes


rigoureusement définis et qui sont simples et
puissants.
 L’algèbre relationnelle est plus opérationnelle; elle est
utile comme représentation interne des plans
d’évaluation des requêtes.
 Une requête donnée peut être exprimée de diverses
manières; un optimisateur choisira la voie la plus
efficiente.

Vous aimerez peut-être aussi