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ère | Base de données relationnelle (RDB) | NoSQL |
|---|---|---|
| Représentation des données | Tables (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éma | Les 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 TABLE | Beaucoup 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êtes | Recherche 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 |
| Jointures | JOIN permet des requêtes qui combinent plusieurs tables | Beaucoup 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érence | Les transactions dotées des propriétés ACID peuvent valider ensemble des mises à jour de plusieurs lignes et tables | Beaucoup 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 charge | Surtout 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 difficile | Montée en charge horizontale facile, en partitionnant les données par clé sur de nombreux serveurs |
| Normalisation | Les tables sont normalisées pour supprimer les données en double et éviter les anomalies de mise à jour | Les mêmes données sont souvent dupliquées pour privilégier des lectures rapides |
| Usages adaptés | Systèmes de gestion où l’intégrité compte et où les relations entre données sont complexes : comptabilité, stocks, commandes | Sessions 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.