Skip to content

Cours : Bases de données

Fiche de Cours : Bases de données (CPGE MPI - Deuxième année)

Section titled “Fiche de Cours : Bases de données (CPGE MPI - Deuxième année)”

Cette fiche de cours aborde la théorie des bases de données relationnelles, les aspects algorithmiques fondamentaux (optimisation de requêtes, complexité), ainsi que la persistance et la gestion de la concurrence.


  • Domaine (D\mathcal{D}) : Ensemble de valeurs atomiques (e.g., Z\mathbb{Z}, String\text{String}).
  • Schéma de relation (RR) : Un ensemble d’attributs R={A1,A2,…,An}R = \{A_1, A_2, \dots, A_n\}. À chaque attribut AiA_i est associé un domaine dom(Ai)\text{dom}(A_i).
  • Relation (rr) : Un sous-ensemble de l’ensemble des tuples ∏i=1ndom(Ai)\prod_{i=1}^n \text{dom}(A_i). C’est un ensemble, l’ordre des tuples n’importe pas.
  • Clé candidate : Un sous-ensemble d’attributs K⊆RK \subseteq R tel que :
    1. Unicité : Dans toute instance valide rr de RR, deux tuples distincts ont des valeurs distinctes sur KK.
    2. Irréductibilité : Aucun sous-ensemble strict de KK ne possède la propriété d’unicité.
  • Clé primaire : Une clé candidate choisie arbitrairement pour identifier de manière unique les tuples.
  • Clé étrangère : Un ensemble d’attributs dans une relation R1R_1 dont les valeurs doivent correspondre aux valeurs d’une clé primaire dans une relation R2R_2.

Intégrité et Dépendances Fonctionnelles (DF)

Section titled “Intégrité et Dépendances Fonctionnelles (DF)”
  • Définition (DF) : Soit RR un schéma, et X,Y⊆RX, Y \subseteq R. On note X→YX \to Y (lire ”XX détermine YY”) si pour toute instance rr de RR et tous tuples t1,t2∈rt_1, t_2 \in r : ∀A∈X,t1[A]=t2[A]  ⟹  ∀B∈Y,t1[B]=t2[B]\forall A \in X, t_1[A] = t_2[A] \implies \forall B \in Y, t_1[B] = t_2[B]
  • Axiomes d’Armstrong : Soit FF un ensemble de DF sur RR. La fermeture F+F^+ est déductible par les règles :
    1. Réflexivité : Si Y⊆XY \subseteq X, alors X→YX \to Y.
    2. Augmentation : Si X→YX \to Y, alors XZ→YZXZ \to YZ (pour tout ZZ).
    3. Transitivité : Si X→YX \to Y et Y→ZY \to Z, alors X→ZX \to Z.
    • Règles déduites : Union (X→YX \to Y et X→Z  ⟹  X→YZX \to Z \implies X \to YZ), Décomposition (X→YZ  ⟹  X→YX \to YZ \implies X \to Y), Pseudo-transitivité.
  • Fermeture d’un ensemble d’attributs (X+X^+) : Algorithme en temps O(∣F∣×∣R∣)O(|F| \times |R|) pour trouver tous les attributs déterminés par XX.

L’algèbre relationnelle est un langage formel procédural.

  1. Sélection (σϕ(r)\sigma_{\phi}(r)) : Filtre les tuples vérifiant la condition ϕ\phi. σϕ(r)={t∈r∣ϕ(t)}\sigma_{\phi}(r) = \{t \in r \mid \phi(t)\}
  2. Projection (πA(r)\pi_{A}(r)) : Restreint les tuples aux attributs de l’ensemble AA. πA(r)={t[A]∣t∈r}\pi_{A}(r) = \{t[A] \mid t \in r\}
  3. Produit cartésien (r1×r2r_1 \times r_2) : Combine chaque tuple de r1r_1 avec chaque tuple de r2r_2.
  4. Renommage (ρA←B(r)\rho_{A \leftarrow B}(r)) : Change le nom d’un attribut.
  5. Union (r1∪r2r_1 \cup r_2) : Nécessite que r1r_1 et r2r_2 soient compatibles d’union (même schéma).
  6. Différence ensembliste (r1∖r2r_1 \setminus r_2) (Nécessite aussi la compatibilité d’union).
  • Intersection : r1∩r2=r1∖(r1∖r2)r_1 \cap r_2 = r_1 \setminus (r_1 \setminus r_2)
  • Jointure naturelle (r1⋈r2r_1 \bowtie r_2) : Produit cartésien suivi d’une sélection sur l’égalité des attributs communs et d’une projection pour éliminer les doublons de colonnes.
  • Theta-jointure (r1⋈θr2r_1 \bowtie_{\theta} r_2 et σθ(r1×r2)\sigma_{\theta}(r_1 \times r_2))

3. SQL (Structured Query Language) et Logique du Premier Ordre

Section titled “3. SQL (Structured Query Language) et Logique du Premier Ordre”

Une requête SQL s’exprime conceptuellement selon l’ordre d’évaluation suivant :

  1. FROM (Produit cartésien et jointures)
  2. WHERE (Sélection σ\sigma)
  3. GROUP BY (Agrégation)
  4. HAVING (Filtrage sur les agrégats)
  5. SELECT (Projection π\pi)
  6. DISTINCT (Élimination des doublons)
  7. ORDER BY (Tri)

Théorème (Codd, 1970) : L’algèbre relationnelle et le calcul relationnel (basé sur la logique du premier ordre) ont la même expressivité (pour les requêtes sûres, i.e., n’engendrant pas de relations infinies). SQL (sans récursion) est complet par rapport à l’algèbre relationnelle.


4. Optimisation des Requêtes et Complexité

Section titled “4. Optimisation des Requêtes et Complexité”

Une requête relationnelle est représentée sous forme d’un arbre syntaxique dont les feuilles sont les relations de base et les nœuds internes sont les opérateurs algébriques.

Règles de réécriture (Heuristiques d’optimisation)

Section titled “Règles de réécriture (Heuristiques d’optimisation)”

Pour minimiser la taille des résultats intermédiaires :

  1. Pousse des sélections : Effectuer les sélections σ\sigma le plus bas possible dans l’arbre (au plus près des scans de tables).
  2. Pousse des projections : Effectuer les projections π\pi le plus tôt possible pour réduire la largeur des tuples.
  3. Commutativité et associativité : ⋈\bowtie et ×\times sont associatifs et commutatifs. On privilégie les jointures réduisant le plus rapidement la cardinalité.

Soient RR et SS deux relations de cardinalités respectives NN et MM.

  1. Nested Loop Join (Boucles imbriquées) :
    • Principe : Pour chaque tuple de rr, parcourir ss.
    • Complexité temporelle : O(N×M)O(N \times M) en pire cas (sans index), O(Nlog⁡M)O(N \log M) si un index B-Arbre existe sur la clé de SS.
  2. Sort-Merge Join (Fusion-Tri) :
    • Principe : Trier les deux relations sur l’attribut de jointure, puis les parcourir simultanément.
    • Complexité temporelle : O(Nlog⁡N+Mlog⁡M+N+M)O(N \log N + M \log M + N + M).
  3. Hash Join (Jointure par hachage) :
    • Principe : Construire une table de hachage en mémoire sur la plus petite relation (RR), puis parcourir la seconde (SS) pour sonder la table.
    • Complexité temporelle : O(N+M)O(N + M) en moyenne (si la mémoire RAM est suffisante).

  • Atoméricité : Tout ou rien. Les modifications d’une transaction sont validées (commit) ou annulées (rollback) en bloc.
  • Cohérence : Une transaction amène la base d’un état valide à un autre état valide (respect des contraintes d’intégrité).
  • Isolement : L’exécution concurrente de transactions donne le même résultat que si elles avaient été exécutées séquentiellement.
  • Durabilité : Une fois validées, les données persistent même en cas de panne système.

Ordonnancement (Schedules) et Sérialisabilité

Section titled “Ordonnancement (Schedules) et Sérialisabilité”
  • Conflit : Deux opérations appartiennent à des transactions différentes, accèdent au même élément, et l’une d’elles au moins est une écriture (WW). Les types de conflits sont R−WR-W, W−RW-R, et W−WW-W.
  • Sérialisabilité par conflit : Un ordonnancement est sérialisable par conflit s’il peut être transformé en un ordonnancement séquentiel par des permutations successives d’opérations non en conflit.
  • Théorème du graphe de conflits : Un ordonnancement est sérialisable par conflit si et seulement si son graphe de sérialisabilité (sommets = transactions, arcs = conflits orientés de la première vers la seconde) est acyclique.

  1. Traduire une requête SQL en Algèbre Relationnelle : Toujours décomposer en partant des clauses internes (FROM/WHERE →\to σ,⋈,×\sigma, \bowtie, \times) vers les externes (SELECT →\to π\pi).
  2. Calculer la fermeture X+X^+ : Dresser la liste des DF applicables itérativement jusqu’à point fixe.
  3. Vérifier la 3NF (Troisième Forme Normale) : S’assurer que pour toute DF non triviale X→YX \to Y, soit XX est une super-clé, soit YY est composé d’attributs premiers (inclus dans au moins une clé candidate).

Pièges à Éviter (Attention aux erreurs classiques !)

Section titled “Pièges à Éviter (Attention aux erreurs classiques !)”
  • Attention aux valeurs NULL : En SQL, NULL représente une valeur inconnue. Les comparaisons avec NULL (= NULL, <> NULL) évaluent à UNKNOWN (et non TRUE ou FALSE). Il faut utiliser IS NULL ou IS NOT NULL. La logique à trois valeurs (True, False, Unknown) modifie le comportement des filtres WHERE.
  • Confusion entre Ensemble et Multiset (Bag) : En théorie, une relation est un ensemble (pas de doublons). En SQL, par défaut, les tables sont des multisets (les doublons sont autorisés). L’utilisation de UNION élimine les doublons (coûteux), tandis que UNION ALL les conserve.
  • Mauvaise application de la transitivité : Ne pas oublier que X→YX \to Y n’implique pas Y→XY \to X (symétrie fausse).
  • Oubli des conditions de jointure : Omettre la clause de jointure dans un FROM génère un produit cartésien R×SR \times S, ce qui conduit à une explosion combinatoire de la taille du résultat.