Base de données relationnelle (RDB) vs NoSQL : modèle de données, schéma, jointures, cohérence, montée en charge

Une base de données relationnelle représente les données sous forme de tables de lignes et de colonnes et s’interroge en SQL. Elle permet des requêtes complexes qui joignent des tables, et maintient les données strictement cohérentes grâce aux propriétés ACID des transactions et à des contraintes comme les clés primaires et étrangères. NoSQL est un terme générique pour les bases de données autres que relationnelles : clé-valeur, orientées documents, orientées colonnes (wide-column) et orientées graphes. La plupart assouplissent le format des données et facilitent la montée en charge horizontale sur de nombreux serveurs, au prix des requêtes complexes comme les jointures et d’une partie de la cohérence stricte. Aucune n’est meilleure en soi : le choix dépend de la forme des données et des propriétés recherchées.

CritèreBase de données relationnelle (RDB)NoSQL
Représentation des donnéesTables (relations) de lignes et de colonnes, reliées entre elles par des valeurs communes (clés étrangères)Selon le type : paires clé-valeur, documents de type JSON, groupes de colonnes, graphes de sommets et d’arêtes, etc.
SchémaLes noms et types des colonnes sont définis à l’avance ; les modifier impose de changer la définition de la table, par exemple avec ALTER TABLEBeaucoup de produits n’exigent pas de schéma strict à l’avance (sans schéma) : des enregistrements aux champs différents peuvent être stockés ensemble
RequêtesRecherche par conditions, agrégation, tri, etc. s’écrivent de façon déclarative en SQL, un langage normaliséEn général des API ou langages de requête propres au produit ; certains produits proposent des langages proches de SQL
JointuresJOIN permet des requêtes qui combinent plusieurs tablesBeaucoup gèrent mal les jointures ; les données lues ensemble sont souvent stockées ensemble dans un même document ou une même valeur
Transactions et cohérenceLes transactions dotées des propriétés ACID peuvent valider ensemble des mises à jour de plusieurs lignes et tablesBeaucoup de produits limitent les mises à jour à une seule clé ou un seul document, ou admettent la cohérence à terme, où les copies ne concordent pas immédiatement ; certains produits offrent toutefois des transactions ACID
Montée en chargeSurtout verticale, en rendant un serveur plus puissant ; les lectures peuvent être réparties sur des réplicas, mais répartir les écritures sur de nombreux serveurs est difficileMontée en charge horizontale facile, en partitionnant les données par clé sur de nombreux serveurs
NormalisationLes tables sont normalisées pour supprimer les données en double et éviter les anomalies de mise à jourLes mêmes données sont souvent dupliquées pour privilégier des lectures rapides
Usages adaptésSystèmes de gestion où l’intégrité compte et où les relations entre données sont complexes : comptabilité, stocks, commandesSessions et caches de services web à très fort trafic, données sans forme fixe, grands volumes de journaux, liens entre personnes ou objets (graphes)

Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.

Quand choisir l'un ou l'autre ?

Base de données relationnelle
Pour des données qui ne doivent pas devenir incohérentes au milieu d’une mise à jour, comme l’argent ou les stocks, et des données que l’on veut joindre et agréger selon des conditions variées. C’est le choix standard de la plupart des systèmes de gestion.
NoSQL
Lorsque le volume de données ou le trafic est trop important pour un seul serveur, lorsque la forme des données varie et change souvent, ou lorsque le travail consiste surtout en lectures et écritures simples par clé. Il importe de choisir le type adapté à l’usage.

Questions fréquentes

NoSQL signifie-t-il « pas de SQL » ?

On l’explique généralement comme « Not only SQL » (pas seulement SQL), et le terme sert moins à rejeter SQL qu’à désigner collectivement les alternatives aux bases relationnelles. D’ailleurs, certains produits permettent d’utiliser des langages de requête proches de SQL.

Quels types de bases NoSQL existe-t-il ?

Il en existe quatre grands types. Les bases clé-valeur se spécialisent dans la lecture et l’écriture simples de valeurs par clé. Les bases orientées documents stockent des documents à structure imbriquée, de type JSON, et permettent aussi de rechercher sur des champs internes aux documents. Les bases orientées colonnes (wide-column) autorisent des colonnes différentes pour chaque ligne et conviennent à l’écriture de grands volumes de données répartis sur de nombreux serveurs. Les bases orientées graphes représentent les liens entre données par des sommets et des arêtes et conviennent aux requêtes qui suivent ces liens.

Quel rapport entre le théorème CAP et cette comparaison ?

Le théorème CAP montre qu’une base de données distribuée qui conserve des copies sur plusieurs serveurs ne peut pas garantir pleinement à la fois la cohérence (chaque lecture renvoie la valeur la plus récente) et la disponibilité (chaque requête obtient une réponse) lorsque le réseau est partitionné. Beaucoup de produits NoSQL privilégient la disponibilité et adoptent la cohérence à terme, dans laquelle les copies convergent avec le temps.

Utilise-t-on parfois les deux dans un même système ?

Souvent. Par exemple, les données dont l’intégrité compte, comme les commandes et les paiements, vont dans une base relationnelle ; les sessions des utilisateurs connectés et les caches des données souvent lues vont dans une base clé-valeur ; et les données sans forme uniforme, comme les descriptions de produits, vont dans une base orientée documents.

Vérifier vos connaissances

Parmi les bases de données dites NoSQL, quelle description des caractéristiques d'une base clé-valeur est généralement correcte ?

  1. AElle peut traiter du SQL complexe, avec jointures de tables et sous-requêtes, plus vite qu'une base de données relationnelle
  2. BAvant toute écriture de données, les noms et types de toutes les colonnes doivent être strictement définis sous forme de schéma
  3. CElle est spécialisée dans l'opération simple de lecture et d'écriture d'une valeur à partir de sa clé et se répartit facilement sur plusieurs serveurs pour monter en charge, mais elle se prête mal aux requêtes complexes comme les jointures de tables
Afficher la réponse et l'explication

Réponse : C. Elle est spécialisée dans l'opération simple de lecture et d'écriture d'une valeur à partir de sa clé et se répartit facilement sur plusieurs serveurs pour monter en charge, mais elle se prête mal aux requêtes complexes comme les jointures de tables

NoSQL est un terme collectif qui désigne les bases de données autres que relationnelles, notamment les types clé-valeur, document, orienté colonnes (wide-column) et graphe. Une base clé-valeur enregistre des paires formées d'une clé (identifiant) et d'une valeur, et elle est spécialisée dans l'opération simple consistant à récupérer une valeur en indiquant sa clé. Comme les données peuvent facilement être réparties par clé sur plusieurs serveurs, elle est utilisée par des services web à très fort trafic, par exemple pour stocker les informations des utilisateurs connectés (sessions). En revanche, elle est peu adaptée aux recherches sur le contenu des valeurs et aux requêtes complexes comme les jointures de tables ; l'application doit donc compenser. De nombreux produits n'exigent pas non plus de fixer strictement à l'avance le format des valeurs (sans schéma, ou schemaless). Certains produits admettent aussi la cohérence à terme (eventual consistency), dans laquelle les mises à jour ne sont pas immédiatement reflétées dans toutes les copies réparties.

Quelle description du théorème CAP est appropriée pour une base de données distribuée qui conserve des copies des données sur plusieurs serveurs ?

  1. ALorsque le réseau entre les serveurs est partitionné, la cohérence (n'importe quel serveur renvoie la valeur la plus récente) et la disponibilité (chaque requête obtient une réponse) ne peuvent pas être pleinement satisfaites en même temps
  2. BAvec une conception appropriée, la cohérence, la disponibilité et la tolérance au partitionnement peuvent toujours être satisfaites en même temps
  3. CLa tolérance au partitionnement consiste à doubler les liaisons réseau pour que le réseau entre les serveurs ne soit jamais partitionné
Afficher la réponse et l'explication

Réponse : A. Lorsque le réseau entre les serveurs est partitionné, la cohérence (n'importe quel serveur renvoie la valeur la plus récente) et la disponibilité (chaque requête obtient une réponse) ne peuvent pas être pleinement satisfaites en même temps

Le théorème CAP montre qu'une base de données distribuée ne peut pas satisfaire pleinement et en même temps les 3 propriétés suivantes : la cohérence (Consistency : lire depuis n'importe quel serveur renvoie le résultat de la dernière écriture), la disponibilité (Availability : tout serveur non défaillant répond à toutes les requêtes) et la tolérance au partitionnement (Partition tolerance : le système continue de fonctionner même lorsque la communication entre serveurs est coupée). Comme les partitions du réseau sont inévitables en pratique, l'essentiel est que, lorsqu'une partition survient, le système doit choisir entre privilégier la cohérence, en cessant de répondre à certaines requêtes, et privilégier la disponibilité, en continuant de répondre tout en admettant que des valeurs périmées soient renvoyées. En l'absence de partition, la cohérence et la disponibilité peuvent être satisfaites toutes les deux. De nombreux produits NoSQL privilégient la disponibilité et adoptent la cohérence à terme, dans laquelle les copies convergent avec le temps. La tolérance au partitionnement ne consiste pas à doubler les liaisons ; c'est la propriété de continuer à fonctionner même lorsqu'une partition survient.

Quel est le but principal de la normalisation des tables d'une base de données relationnelle ?

  1. ARéduire le nombre de tables pour que toute recherche puisse se faire rapidement sans jointure
  2. BChiffrer les données pour que les utilisateurs non autorisés ne puissent pas les lire
  3. CÉliminer les données en double et éviter des anomalies comme des contenus qui deviennent incohérents après une mise à jour
Afficher la réponse et l'explication

Réponse : C. Éliminer les données en double et éviter des anomalies comme des contenus qui deviennent incohérents après une mise à jour

La normalisation est une démarche de conception qui découpe les tables en fonction des dépendances fonctionnelles entre colonnes (une relation dans laquelle la valeur d'une colonne détermine celle d'une autre), afin que le même fait ne soit pas enregistré à plusieurs endroits. Par exemple, si chaque ligne d'une table des employés contient aussi le nom du service, renommer un service oblige à réécrire toutes les lignes des employés de ce service, et en oublier une seule rend le contenu incohérent (anomalie de mise à jour). D'autres problèmes surviennent aussi : on ne peut pas enregistrer un service qui n'a pas encore d'employé (anomalie d'insertion), et supprimer le dernier employé d'un service efface aussi les informations du service (anomalie de suppression). Si les informations sur les services sont placées dans une table Service distincte, le nom d'un service ne doit être corrigé qu'à un seul endroit. En revanche, des tables séparées impliquent davantage de jointures lors des recherches ; la normalisation ne rend donc pas forcément les recherches plus rapides.

  1. Dans une base de données utilisée surtout pour la lecture et l'agrégation, des tables issues de la normalisation sont parfois délibérément fusionnées en une seule, de sorte que les mêmes données sont stockées en double (dénormalisation). Quelle combinaison associe correctement un avantage et un inconvénient de cette conception ?
  2. Parmi les propriétés ACID qu'une transaction doit posséder, laquelle garantit qu'un virement qui débite le compte A et crédite le compte B est soit effectué entièrement, soit pas du tout, même si une panne survient en cours de route ?

Questions d'entraînement sur Bases des bases de données

Termes clés expliqués

Base de données relationnelle
Base de données qui représente les données sous forme de tables (relations) de lignes et de colonnes, et relie les tables entre elles par des valeurs communes. On l'appelle aussi SGBDR ou RDB. Les requêtes et mises à jour se font en SQL, et des contraintes comme les clés primaires et les clés étrangères maintiennent la cohérence des données.
NoSQL
Terme collectif qui désigne les bases de données autres que relationnelles, notamment les types clé-valeur, document, orienté colonnes et graphe. De nombreux produits se répartissent facilement sur plusieurs serveurs pour monter en charge et admettent des formats de données souples, mais ils sont souvent peu adaptés aux requêtes complexes comme les jointures de tables et à la cohérence stricte.
SQL
Langage standard des bases de données relationnelles, qui sert à définir les tables, à rechercher, insérer, mettre à jour et supprimer des données, et à contrôler les privilèges. Il est normalisé par l'ISO/IEC (au Japon aussi sous forme de norme JIS). Ses instructions comprennent SELECT, INSERT, UPDATE, DELETE, CREATE TABLE et GRANT.
Transaction
Série d'opérations sur une base de données traitée comme une seule unité. COMMIT rend les résultats définitifs, et ROLLBACK ramène les données à leur état d'avant le début de la transaction. Le SGBD gère les transactions au moyen de verrous et de journaux pour qu'elles satisfassent l'atomicité, la cohérence, l'isolation et la durabilité (propriétés ACID).
Propriétés ACID
Initiales de 4 propriétés qu'une transaction doit satisfaire : l'atomicité (Atomicity : tout est exécuté ou rien ne l'est), la cohérence (Consistency : les contraintes d'intégrité restent satisfaites), l'isolation (Isolation : des transactions simultanées n'interfèrent pas entre elles) et la durabilité (Durability : les résultats validés ne sont pas perdus, même en cas de panne).
Normalisation
Démarche de conception qui découpe les tables d'une base de données relationnelle en fonction des dépendances fonctionnelles entre colonnes, afin que le même fait ne soit pas enregistré à plusieurs endroits. Elle supprime les données en double et évite les anomalies de mise à jour, d'insertion et de suppression. Ses étapes comprennent les première à troisième formes normales et la forme normale de Boyce-Codd.
Clé primaire
Colonne, ou ensemble de colonnes, qui sert à identifier de façon unique une ligne d'une table. Elle est soumise aux contraintes selon lesquelles ses valeurs ne doivent pas comporter de doublons ni contenir de NULL. La clé primaire est choisie parmi les ensembles minimaux de colonnes capables d'identifier une ligne de façon unique (clés candidates).
Clé étrangère (foreign key)
Colonne qui fait référence à la clé primaire (ou à une colonne unique) d'une autre table. Grâce à la contrainte d'intégrité référentielle, qui n'admet que des valeurs existant dans la table référencée ou NULL, elle empêche les données qui pointent vers des lignes inexistantes. On peut aussi préciser le comportement lorsqu'une ligne référencée est supprimée ou mise à jour (refus, suppression en cascade, etc.).

Comparatifs associés