Cadre formel pour la manipulation de tables
2024-09-13
Formulé par E. Codd en 1970
Fondé sur la théorie des relations (partie de la théorie naïve des ensembles)
Propose une solution pour
Facile à traduire/mettre en œuvre dans des langages réels comme Structured Query Language (SQL)
ou dans des environnements de calcul orientés données comme R/dplyr
Rappel sur la notion de relation (au sens classique)
Definition : Domaine
Un ensemble d’éléments
Exemples : entiers
Les types d’un langage de programmation comme C
, Java
, …
Un domaine peut se définir :
en extension (en donnant la liste de toutes les valeurs possibles) ou
en intention (en donnant une propriété caractéristique).
Définition : Produit cartésien
Le Produit cartésien d’une liste de domaines
est l’ensemble
Un élément
Relations (classique)
Une Relation
où
Deux domaines
Un produit cartésien
Une relation
Une relation est un (sous-) ensemble (d’un produit cartésien)
On peut représenter
1 | 2 |
1 | 4 |
5 | 2 |
5 | 4 |
Chaque ligne de la table correspond à un élément de la relation
Dans ce cours, toutes les relations ont un nombre fini d’éléments !
Définition : Cardinalité de la relation
On appelle cardinalité d’une relation
Arité de la relation
Soit
On parle parfois aussi de degré d’une relation.
Une relation binaire est une relation d’arité
En BD relationnelle, on donne un nom à chaque colonne
En BD on ne peut pas avoir deux attributs identiques (même nom, même domaine) dans une même table
Note
L’idée de nommer les colonnes plutôt que de les désigner par une position/un numéro se retrouve dans les sytèmes qui manipulent des données tabulaires (Pandas/Python
, R
, Spark
, …).
Définition : schéma
Le Schéma d’une relation
Le schéma peut se noter
où
bebes
dans babynames
bd_2023-24> \dt
+-----------+-------+-------+-----------+
| Schema | Name | Type | Owner |
|-----------+-------+-------+-----------|
| babynames | bebes | table | boucheron |
+-----------+-------+-------+-----------+
bd_2023-24> \d bebes
+--------+------------------------+-----------+
| Column | Type | Modifiers |
|--------+------------------------+-----------|
| sexe | integer | |
| prenom | character varying(500) | |
| annee | integer | |
| nombre | integer | |
+--------+------------------------+-----------+
Données INSEE. Une ligne de la table bébés
nous informe qu’en France (héxagone?), pendant une annee
, le nombre de naissances de sexe sexe
, ayant reçu le prénom prenom
est donnée par la colonne nombre
.
bd_2023-24> SELECT *
FROM bebes
WHERE sexe=1 AND annee=2000 AND prenom='THÉO' ;
+------+--------+-------+--------+
| sexe | prenom | annee | nombre |
|------+--------+-------+--------|
| 1 | THÉO | 2000 | 7961 |
+------+--------+-------+--------+
L’arité de bebes
est
En BD, l’ordre des éléments et l’ordre des colonnes n’a pas d’importance (on désigne les membres d’un
La définition formelle diffère donc de celle d’une relation classique
Soient
Notation
Une relation
Pour tout
Un élément
Pour désigner l’ensemble des valeurs
A un tuple
On notera aussi
Quatre tuples de bebes
:
RELATION ↔︎ TABLE À DEUX DIMENSIONS
(NOM DE) COLONNE ↔︎ ATTRIBUT
EN-TÊTE DU TABLEAU ↔︎ SCHEMA DE LA RELATION
LIGNE ↔︎ TUPLE
ENSEMBLE DES LIGNES ↔︎ CONTENU DE LA RELATION
L’algèbre relationnelle est un système de calcul sur les tables
Elle est formée d’une collection d’opérateurs qui prennent en argument des tables et retournent des tables
Remarque:
Les opérateurs prennent en général des arguments supplémentaires qui ne sont pas des tables. La notion d’algèbre relationnelle est inspirée par les structures algébriques comme les groupes, les anneaux, les corps où des opérations internes opèrent sur une ensemble (par exemple
L’algèbre n’est pas aussi expressive qu’un langage de programmatoin classique (comme Python
). C’est cela qui rend ce modèle de calcul intéressant : il permet de faire des choses pas triviales, mais il est plus facile à utiliser qu’un langage de programmation.
Liste des opérateurs
L’algèbre relationnelle est d’abord un *Langage de Manipulation de Données& (LMD)}.
Union:
Intersection:
Différence:
Projection:
Sélection:
Produit cartésien:
Renommage:
s’appliquent à des relations pour produire d’autres relations (le résultat).
Définition
L’union et l’intersection sont des opérations portant sur deux relations
Les Schémas de
-- THEO_1900
+------+-----------+-------+--------+
| sexe | prenom | annee | nombre |
|------+-----------+-------+--------|
| 1 | THEOBALD | 1900 | 6 |
| 1 | THEODORE | 1900 | 227 |
| 1 | THEOPHILE | 1900 | 309 |
| 1 | THEODOSE | 1900 | 3 |
| 1 | THEODULE | 1900 | 39 |
| 1 | THEOPHANE | 1900 | 3 |
+------+-----------+-------+--------+
-- THEO_2000
+------+-----------+-------+--------+
| sexe | prenom | annee | nombre |
|------+-----------+-------+--------|
| 1 | THEO | 2000 | 6 |
| 1 | THAO | 2000 | 4 |
| 1 | THÉO | 2000 | 7961 |
| 1 | THÉO-PAUL | 2000 | 3 |
| 1 | THEODOR | 2000 | 3 |
| 1 | THEOPHANE | 2000 | 47 |
| 1 | THEODORE | 2000 | 149 |
| 1 | THEOPHILE | 2000 | 336 |
| 1 | THEOPHYLE | 2000 | 4 |
| 1 | THEOS | 2000 | 3 |
| 1 | THEOTIM | 2000 | 4 |
| 1 | THEOTIME | 2000 | 73 |
+------+-----------+-------+--------+
THEO_1900
∪ THEO_2000
+------+-----------+-------+--------+
| sexe | prenom | annee | nombre |
|------+-----------+-------+--------|
| 1 | THEODOR | 2000 | 3 |
| 1 | THAO | 2000 | 4 |
| 1 | THÉO | 2000 | 7961 |
| 1 | THÉO-PAUL | 2000 | 3 |
| 1 | THEOBALD | 1900 | 6 |
| 1 | THEO | 2000 | 6 |
| 1 | THEODORE | 1900 | 227 |
| 1 | THEODOSE | 1900 | 3 |
| 1 | THEODULE | 1900 | 39 |
| 1 | THEODORE | 2000 | 149 |
| 1 | THEOPHANE | 1900 | 3 |
| 1 | THEOPHANE | 2000 | 47 |
| 1 | THEOPHILE | 1900 | 309 |
| 1 | THEOTIME | 2000 | 73 |
| 1 | THEOPHILE | 2000 | 336 |
| 1 | THEOPHYLE | 2000 | 4 |
| 1 | THEOS | 2000 | 3 |
| 1 | THEOTIM | 2000 | 4 |
+------+-----------+-------+--------+
-- THEO_1900
+------+-----------+-------+--------+
| sexe | prenom | annee | nombre |
|------+-----------+-------+--------|
| 1 | THEOBALD | 1900 | 6 |
| 1 | THEODORE | 1900 | 227 |
| 1 | THEOPHILE | 1900 | 309 |
| 1 | THEODOSE | 1900 | 3 |
| 1 | THEODULE | 1900 | 39 |
| 1 | THEOPHANE | 1900 | 3 |
+------+-----------+-------+--------+
-- THEOD_1900
+------+-----------+-------+--------+
| sexe | prenom | annee | nombre |
|------+-----------+-------+--------|
| 1 | THEODORE | 1900 | 227 |
| 1 | THEODOSE | 1900 | 3 |
| 1 | THEODULE | 1900 | 39 |
+------+-----------+-------+--------+
Définition
La différence de deux relations
de même schéma que
constituée des tuples appartenant à
On note
Opération non commutative !
-- THEO_1900
+------+-----------+-------+--------+
| sexe | prenom | annee | nombre |
|------+-----------+-------+--------|
| 1 | THEOBALD | 1900 | 6 |
| 1 | THEODORE | 1900 | 227 |
| 1 | THEOPHILE | 1900 | 309 |
| 1 | THEODOSE | 1900 | 3 |
| 1 | THEODULE | 1900 | 39 |
| 1 | THEOPHANE | 1900 | 3 |
+------+-----------+-------+--------+
-- THEOD_1900
+------+-----------+-------+--------+
| sexe | prenom | annee | nombre |
|------+-----------+-------+--------|
| 1 | THEODORE | 1900 | 227 |
| 1 | THEODOSE | 1900 | 3 |
| 1 | THEODULE | 1900 | 39 |
+------+-----------+-------+--------+
Définition
Soient:
Dans le contexte “classique” :
Attention
En algèbre relationnelle, cette opération est commutative (
Définition formelle
Définition
Remarque
Implicitement, on a élimination des doublons car une projection peut produire plusieurs fois le même tuple.
Remarque
À la différence des opérations ensemblistes ∩, ∪, ∖, ×, la projection ne fait pas intervenir que des tables.
On peut considérer la projection comme une fonction à deux arguments, avec un premier argument de type table, et un second argument constitué par une liste d’attributs.
On peut aussi considérer la projection comme une fonction avec un nombre variable d’arguments. Un premier argument de type table, puis de arguments qui désignent des attributs de la table. Si on accepte ce point de vue, on peut adopter la notation
On note
Dans la suite, nous utiliserons cette possibilité.
Π(THEOD_1900
, prenom
, nombre
)
+-----------+---------+
| prenom | nombre |
|-----------+---------+
| THEODORE | 227 |
| THEODOSE | 3 |
| THEODULE | 39 |
+-----------+---------+
Ici, aucune éliminitation de doublons n’a été nécessaire
Définition
La sélection d’une relation
de même schéma que
dont les tuples sont ceux de
On note
La condition
s’exprime à l’aide des noms d’attributs de la relation ou de constantes (pour les opérandes)
on peut utiliser des opérateurs arithmétiques de comparaison (
Remarque
À la différence des opérations ensemblistes ∩, ∪, ∖, ×, comme la projection, la sélection ne fait pas intervenir que des tables.
On peut considérer la sélection comme une fonction à deux arguments, avec un premier argument de type table, et un second argument constitué par une condition (une expression dont l’évaluation sur chaque ligne de la table retourne Vrai
, Faux
, ou Indéterminé
).
On peut aussi considérer la sélection comme une fonction avec un nombre variable d’arguments. Un premier argument de type table, puis de arguments qui représentent des expressions susceptibles d’être évaluées sur chaque ligne de la table. Une ligne fera partie de la table résultat, si elle satisfait toutes les expressions.
On note
Dans la suite, nous utiliserons cette possibilité.
Notons que dans un langage comme Python
, nous ne disposons pas d’emblée d’un type expression et que la notation proposée ici ne se code pas trivialement en Python
.
En langage R
, on dispose d’un type expression, la notation proposée ici est mise en œuvre dans le package dplyr
.
σ(THEO_1900
, ¬ prenom
LIKE
‘THEOD%’)
Définition
Remarque
Comme la projection et la sélection, le renommage ne fait pas intervenir que des tables.
On peut considérer le renommage comme une fonction avec un nombre variable d’arguments. Un premier argument de type table, puis de arguments qui représentent des expressions indiquant comment doivent être renommées certains attributs.
On note
Dans la suite, nous utiliserons cette possibilité.
Notons que dans un langage comme Python
, nous ne disposons pas d’emblée d’un type expression et que la notation proposée ici ne se code pas trivialement en Python
.
En langage R
, on dispose d’un type expression, la notation proposée ici est mise en œuvre dans le package dplyr
.
-- THEOD_1900
+------+-----------+-------+--------+
| sexe | prenom | annee | nombre |
|------+-----------+-------+--------|
| 1 | THEODORE | 1900 | 227 |
| 1 | THEODOSE | 1900 | 3 |
| 1 | THEODULE | 1900 | 39 |
+------+-----------+-------+--------+
ρ(THEOD_1900
, sexe→sex
, prenom→name
, annee→year
, nombre→count
)
-- THEOD_1900
+------+-----------+-------+--------+
| sex | name | year | count |
|------+-----------+-------+--------|
| 1 | THEODORE | 1900 | 227 |
| 1 | THEODOSE | 1900 | 3 |
| 1 | THEODULE | 1900 | 39 |
+------+-----------+-------+--------+
Utilité Va permettre d’étendre certains opérateurs pour des relations de schémas non-disjoints
Opérations ensemblistes classiques.
Projection : élimine des colonnes
Sélection : élimine des lignes
Pour interroger une BD, on compose ces opérateurs :
π(σ(THEO_1900
, prenom
LIKE
‘THEOD%’), prenom
, nombre
)
ρ(π(σ(THEO_1900
, prenom
LIKE
‘THEOD%’), prenom
, nombre
), prenom→name
, nombre→count
)
On peut rendre la composition de fonctions plus lisible (pour l’humain) en reprenant un mécanisme d’Unix
: le pipe (tuyau) |>
(notation de )
Plutôt qu’écrire f(x,y) |> g(z, t)
voire x |> f(y) |> g(z,t)
Et pour rendre l’expression encore plus lisible on peut écrire
On peut ainsi réécrire
ρ(π(σ(THEO_1900
, prenom
LIKE
‘THEOD%’), prenom
, nombre
), prenom→name
, nombre→count
)
en
On va définir des opérations pratiques pour la manipulation de données : les jointures
Jointure
Jointure naturelle
Définition
La jointure
de schéma la concaténation des schémas de
formée des tuples du produit cartésien
Règles de formation de la condition de jointure : comme pour la sélection
Définition formelle
Remarque
Comme la projection, la sélection et le renommage, la jointure ne fait pas intervenir que des tables.
On peut considérer la jointure comme une fonction avec un nombre variable d’arguments. Deux premiers arguments de type table, puis une expression dont l’évaluation permet de déterminer quels couples de lignes doivent figurer dans la table résultat
On note
Dans la suite, nous utiliserons cette possibilité.
Notons que dans un langage comme Python
, nous ne disposons pas d’emblée d’un type expression et que la notation proposée ici ne se code pas trivialement en Python
.
En langage R
, on dispose d’un type expression, la notation proposée ici est mise en œuvre dans le package dplyr
avec la fonction inner_join()
,
world
Lier les pays (les lignes de country
) à leur capitale, c’est à dire les couples de lignes de country
et de city
qui satisfont capital = id
world
(suite)Autour de la jointure ⋈(R, S, C)
on a pris l’habitude de distinguer des types de jointure selon la forme de l’expression de jointure (la condition C
)
On distingue
Équi-jointure
Jointure avec égalité entre attributs de types comparables
Condition de jointure entre attributs de types comparables et avec un opérateur différent de l’égalité, c’est-à-dire dans
Définition
C’est une équi-jointure concernant les attributs communs (même nom et même type) de deux relations
On ne garde dans le résultat qu’une copie des attributs communs
On considère
Soit
Considérons
La jointure naturelle sur deux relations
bd_2023-24> \d countrylanguage
+-------------+--------------+-----------+
| Column | Type | Modifiers |
|-------------+--------------+-----------|
| countrycode | character(3) | not null |
| language | text | not null |
| isofficial | boolean | not null |
| percentage | real | not null |
+-------------+--------------+-----------+
+--------------------+---------------+-----------+
| Column | Type | Modifiers |
|--------------------+---------------+-----------|
| countrycode | character(3) | not null |
| name_country | text | not null |
| continent | text | not null |
| region | text | not null |
| surfacearea | real | not null |
| indepyear | smallint | |
| population_country | integer | not null |
| lifeexpectancy | real | |
| gnp | numeric(10,2) | |
| gnpold | numeric(10,2) | |
| localname | text | not null |
| governmentform | text | not null |
| headofstate | text | |
| capital | integer | |
| code2 | character(2) | not null |
+--------------------+---------------+-----------+
On aurait pu décrire de façon plus explicite la jointure en précisant sur quels attributs s’effectue la jointure
Asia
)Perte d’information dans jointure naturelle
Les tuples ne satisfaisant pas la condition (non appariés) disparaissent
Définition
On ajoute symboliquement” une ligne dont les valeurs sont vides (ou avec valeur spéciale NULL
) pour garder les tuples initiaux “non satisfaisants” après la jointure
On note cette opération entre deux relations
On veut une table formée par les codes ISO, les noms des pays et (si possible) les noms des capitales. Les territoires sans capitale doivent apparaître en fin de table, avec une colonne nom de capitale nulle.
Obtenir la première partie de la réponse avec une jointure est facile. Pour trouver les territoires sans capitale, il suffit de faire une sélection dans country
sur le critère capital IS NULL
. Ensuite, on peut faire une UNION
(∪
)
Définition
La division ou quotient
d’une relation
par une relation
est la relation
Autrement dit
On note
Lister les langues parlées sur tous les continents
On aimerait écrire une expression qui renvoie un résultat correct quelque soit les conventions adoptées sur la définition de continent (les Amériques forment-elles un ou deux continents, etc)
L’union, la différence, le produit cartésien, la sélection et la projection et le renommage sont suffisants pour définir tous les opérateurs que l’on a vu.
Mais avoir un panier plus large d’opérateurs simplifie l’écriture des requêtes.
Quelques définitions
Pour la Jointure :
Pour l’intersection :
L’algèbre relationnelle est la définition d’un modèle de calculabilité restreint.
Comme les modèles de calcul classiques (les langages de programmation comme Python
), elle est formée de briques de base (les opérateurs) et de mécanismes d’assemblage (la composition de fonction).
Le modèle de calcul relationnel est bien plus simple qu celui d’un langage de programmation (pas de boucles while
, for
). Il est aussi moins expressif. On peut montrer qu’il existe de questions qui sont solubles avec un langage de programmation mais qui ne le sont pas avec l’algèbre relationnelle.
L’histoire de l’algèbre relationnelle éclaire le développement des bases de données.
In the 1960s and 1970s he [Codd] worked out his theories of data arrangement, issuing his paper “A Relational Model of Data for Large Shared Data Banks” in 1970.[ To his disappointment, IBM proved slow to exploit his suggestions until commercial rivals started implementing them.
Initially, IBM refused to implement the relational model to preserve revenue from IMS/DB. Codd then showed IBM customers the potential of the implementation of its model, and they in turn pressured IBM. Then IBM included in its Future Systems project a System R subproject – but put in charge of it developers who were not thoroughly familiar with Codd’s ideas, and isolated the team from Codd. As a result, they did not use Codd’s own Alpha language but created a non-relational one, SEQUEL. Even so, SEQUEL was so superior to pre-relational systems that it was copied, in 1979, based on pre-launch papers presented at conferences, by Larry Ellison, of Relational Software Inc, in his Oracle Database, which actually reached market before SQL/DS – because of the then-already proprietary status of the original name, SEQUEL had been renamed SQL.
Codd continued to develop and extend his relational model, sometimes in collaboration with Christopher J. Date. One of the normalised forms, the Boyce–Codd normal form, is named after him.
Codd’s theorem, a result proven in his seminal work on the relational model, equates the expressive power of relational algebra and relational calculus.
MA15Y030 – Bases de Données – L3 MIASHS – UParis Cité