SQL or NoSQL : Which one to choose ?

SQL or NoSQL : Which one to choose ?

Aujourd’hui, les développeurs ont la possibilité de choisir leur base de données. Le temps où la seule option possible pour créer son application Web était MySQL est révolu. Vous allez découvrir d’autres bases de données qui vous permettront de répondre de manière plus efficace à vos problématiques.

Un peu de théorie

Ce qui définit les bases SQL que l’on connaît depuis des dizaines d’années, ce sont leurs caractéristiques ACID. Un SGBD permet de réaliser des transactions atomiques, cohérentes, isolées, et durables. Ces avantages sont aussi des inconvénients en termes de performance en introduisant des goulots d’étranglement dans l’architecture applicative, notamment à cause des verrous.




C’est pourquoi depuis quelques années, un nouveau modèle émerge pour se différencier de ce modèle relationnel en allant jusqu’à abandonner le langage SQL. Ainsi, certaines bases abandonneront la durabilité : c’est le cas des bases en mémoire vive. D’autres encore abandonneront les transactions rendant ainsi impossibles les opérations atomiques et les retours arrière classiquement utilisés. Les propriétés ACID laissent donc place à trois autres caractéristiques (CAP) auxquelles les bases NoSQL tentent de répondre:

  • Cohérence (Consistency): tous les noeuds d’un cluster disposent des mêmes données au même moment;
  • Disponibilité (Availability) : à tout moment, une requête reçoit une réponse;
  • Tolérance au partitionnement (Partition Tolerance): un problème sur un noeud du cluster ne doit pas empêcher le fonctionnement du cluster dans son intégralité.

Au-delà des principes d’architecture, ce qui va différencier les bases SQL des bases NoSQL : c’est le format de stockage. En SQL, on travaille avec des tales contenant des lignes. Ces données sont structurées selon un schéma contraint et des relations sont possibles entre les différentes lignes. Une base NoSQL s’affranchira de cette approche et pourra stocker les données sou différentes formes : document (XML, JSON…), objet, clef/valeur, colonnes ou encore graphe par exemple, Comme nous allons le voir, ce ne sont plus le langage ni le framework utilisés qui déterminent la base de données que l’on utilise. On choisit la base de données qui correspond le mieux à notre besoin.

Redis : zoom sur une base clef/valeur

Redis a pour caractéristique principale de proposer un mécanisme de stockage en mémoire vive. La structure des données stockées permet de l’utiliser comme système de base de données, de cache ou encore de message broker. Les types de données proposés sont évolués. Au-delà de la chaîne de caractères, Redis supporte nativement les hash, les listes, les set, index géospaciaux et autres données structurées. Redis propose nativement un système de publication/souscription permettant d’implémenter simplement des communications asynchrones.

Redis est donc une base de données clef/valeur évoluée. Elle permet également la mise en place de la réplication, prend en charge le langage de script LUA, les transactions, et plus récemment, un mécanisme de persistance sur disque. Il est possible de mettre en place une architecture haute disponibilité en s’appuyant sur Redis Sentinel et la répartition automatique avec Redis Cluster.


MongoDB : stockage de document

MongoDB est une base de données orientée stockage de documents au format JSON. Cette base propose de nombreux connecteurs pour les différents langages les plus répandus ainsi qu’un Shell permettant de requêter en ligne de commande avec des instructions en langage JavaScript. La grande force de MongoDB est de proposer une API simple permettant de mettre en place facilement des opérations d’agrégations de données.

Du point de vue des performances, MongoDB permet la mise en place d’un cluster appelé “replica set”. Celui-ci permet la duplication des données sur un groupe de serveurs qui possédera un noeud principal et n-serveurs de backup. Si à un moment donné le noeud principal est inopérant, automatiquement l’un des serveurs de backup deviendra serveur primaire.
Les index sont pris en charge dans MongoDB et ont le même rôle et principe de fonctionnement que sur une base SQL. Comme il n’y a pas de schéma, les index sont construits par un appel à l’API MongoDB. Il est également possible de créer des index multichamps. MongoDB prend particulièrement bien en charge les index géospaciaux.

La dernière version de MongoDB, la version 3.2, propose de nombreuses évolutions intéressantes telles que la validation de documents, un moteur de stockage chiffré ou encore des outils tels que des connecteurs pour la Business Intelligence.


ElasticSearch : moteur de recherche

La recherche plein-texte fait partie des besoins spécifiques auxquels répondent certains outils. Le plus répandu est ElasticSearch. Ce dernier exploite un moteur Lucene pour l’indexation et la recherche des données. ElasticSearch offre plusieurs avantages dont le principal est de proposer une interface de Web Services. Cette API REST permet ainsi d’échanger des données au format JSON, ce qui permet une interopérabilité dans tous les langages supportant HTTP. ElasticSearch propose également des optimisations de performances au travers la mise en place d’un cache et d’un mécanisme de haute disponibilité. Dans son utilisation, on va retrouver l’équivalent de ce que permet MongoDB.

ElasticSearch permet le stockage de documents JSON et leur requêtage. Les opérations de types map/reduce et agrégation sont également disponibles pour un gain de performance significatif. Le revers de la médaille est que cet outil a été pensé pour la recherche : le vocabulaire est donc différent de celui des bases de données et il n’est pas toujours simple de se retrouver dans la documentation. ElasticSearch diffère notamment des bases de données classiques puisqu’il ne propose aucun mécanisme d’authentification ni de règles d’accès. Il faut donc prévoir dans son architecture un développement et une configuration prenant en compte ces contraintes de sécurité.


Neo4j : stockage de graphe

Les graphes font partie des structures les plus complexes qu’il est possible de stocker en base de données. La force de Neo4J est d’offrir un support natif du requêtage de graphes tout en assurant des transactions ACID. Neo4j supporte la mise en place de clusters pour la montée en charge et notamment la gestion du failover pour la disponibilité.

Le principe est donc de matérialiser les relations entre objets lors de l’insertion en base, les performances en lecture sont donc excellentes. Il est facile d’effectuer des requêtes traversant les relations entre les différents noeuds en base. Le stockage des données reste compact et grâce à la mémoire cache, son utilisation peut se faire même sur du matériel aux performances limitées. Les requêtes à la base Neo4J se font par des Web Services HTTP, ce qui rend sont utilisation possible dans tous les langages. Malgré tout, on trouve un client natif pour de nombreux langages : Java, .NET, JavaScript (Node.js), Python, Ruby, PHP et même R, Go, Clojure, Perl, Haskell. Adressant un besoin spécifique, Neo4J est pris en charge dans de nombreux écosystèmes, dont MongoDB ou ElasticSearch.


OrientBD : stockage de graphe et plus encore

OrientDB est un système de base de données sous forme de graphe de seconde génération. Ce qu’il propose c’est tout simplement davantage de flexibilité que Neo4j avec un stockage sous forme de documents. Il propose également tout le nécessaire pour répondre aux problématiques de performances à travers la mise en place d’un cluster avec réplication et sharding.

OrientDB propose également différents niveaux de sécurité et de règles d’accès aux données contrairement à Neo4j. OrientDB est globalement plus performant tout en supportant le langage SQL. Cette base de données permet les jointures et bien d’autres concepts propres à SQL sans pour autant imposer la mise en place d’un schéma. Celui-ci est facultatif et il est même possible de concevoir une base de données avec à la fois un schéma pour certaines données et l’absence de schéma pour d’autres.

Le moteur d’OrientDB supporte les graphes, les documents, les clefs/valeurs et des modèles objets ce qui en fait un outil répondant à de nombreuses problématiques fonctionnelles. Il ne s’agit pas d’un support multi-modèles par couche, mais bel et bien d’un moteur prenant en charge nativement ces différents modèles de données tout en étant capable de travailler sur ces données hétérogènes ensemble. Il ne faut pas s’attendre à un niveau de performance aussi efficace qu’une base de données spécialisée dans un modèle de données.


InfluxDB : données chronologiques

La base de données Influx est une base permettant le stockage de données de type chronologiques. C’est une base idéale pour stocker des données de métrologie (météo, santé, monitoring…) avec un focus particulier sur la haute disponibilité et sur les performances. InfluxDB est une base open source écrite en langage Go, simple à installer. Une interface Web est fournie avec le serveur et permet de réaliser les opérations de base et d’accéder aux données. Les données stockées possèdent un timestamp, un numéro de séquence, un certain nombre de métadonnées sous forme de clef/valeur au format texte et une valeur numérique.

Les requêtes sont simples et proches du langage SQL. Ce langage (InfluxQL) permet d’agréger les données à la volée avec le mot clef GROUP BY.

Le stockage des données peut aussi bien se faire en mémoire vive que sur disque selon les besoins. Influx permet la mise en place d’une politique de rétention spécifique et propose un système de sauvegardes incrémentales.


Riak: haute disponibilité

Riak fait référence à trois produits différents fonctionnant grâce à une API REST. Le plus connu est certainement Riak KV, une base de données de type clef/valeur. Riak KV est une base de données distribuée, scalable de manière linéaire, hautes performances qui visent la meilleure tolérance aux pannes possible. D’un point de vue fonctionnel, elle propose un stockage de données sans schéma. Cette base prend en charge le stockage des données sous différentes formes : texte, images, documents JSON/XML/HTML… Riak est développé en Erlang, un langage répondant au paradigme de programmation concurrente, temps réel et distribué. Le point fort du langage Erlang est justement sa tolérance aux pannes et Riak en profite directement. L’interopérabilité est également très importante et permet à Riak de fonctionner sur de très nombreuses architectures dont Raspberry Pi.
Riak TS permet répond au besoin spécifique de stockage de données chronologiques, ce qui en fait une alternative d’InfluxDB. Celui-ci se différencie d’InfluxDB notamment par l’absence de typage des données qui se limitent à des valeurs numériques et texte. Il est également possible d’exécuter des scripts côté serveurs ainsi que des triggers avant ou après chaque insertion.

Enfin, Riak S2 permet de stocker des objets lourds permettant ainsi aux serveurs Web de s’affranchir d’un système de fichier par nature non scalable pour le stockage d’images ou autres fichiers par exemple. Riak S2 répond ainsi au besoin d’un système de fichier distribué sur le Web, avec notamment une API compatible avec Amazon S3.




Cassandra : stockage orienté colonnes

Apache Cassandra est une base de données permettant de stocker différents types de données structurées ou non. Elle permet la répartition à travers plusieurs serveurs avec de bonnes capacités montées en charge et haute disponibilité. Les opérations de maintenance sont simples à mettre en oeuvre notamment à chaud. Cassandra ne contient pas de SPof (Single Point of Failure).

Le modèle de donnée flexible apporte une souplesse dans la conception des données tout en offrant de bons temps de réponse. Initialement développé par Facebook en Java, Cassandra est distribué sous licence Open source et fait partie des solutions NoSQL les plus utilisées. Les données sont stockées sous forme de clef/valeur en s’appuyant sur une architecture relationnelle orientée colonne. Les données sont distribuées selon leur clé primaire. Le langage de requête est proche du SQL et porte le nom de CQL (Cassandra Query Language).


ArangoDB : multimodèles

ArangoDB est une base de données permettant le stockage de données multi-modèles. Son moteur est suffisamment flexible pour permettre le stockage de données hétérogènes : documents, graphes ou encore clef/valeurs. Malgré tout, son approche en fait davantage une base orientée documents, tant en termes de vocabulaire que d’architecture. Pour autant, ArangoDB se différencie par son Langage AQL qui ressemble beaucoup au langage SQL tout en s’appuyant sur le format JSON.

L’agrégation est implémentée dans une approche différente de MongoDB, en conservant une syntaxe proche du SQL grâce à des mots clefs spécifiques comme FILTER et COLLECT.

Essentiellement documenté pour JavaScript et notamment pour leur propre framework Foxx. ArangoDB est documenté pour Node.js et PHP et ne propose malheureusement pas de nombreux connecteurs pour le moment.


MariaDB : SQL n’est pas mort

MariaDB est tout simplement un serveur de base de données dont le fonctionnement permet de remplacer MySQL. Il apporte des fonctionnalités supplémentaires tout en conservant la meilleure compatibilité. MariaDB propose notamment de nombreux moteurs, dont XtraDB qui remplace avantageusement InnoDB. SphinxSE permet une recherche textuelle performante. Le stockage Big Data est également mis à disposition avec le support du moteur TokuDB. Le moteur Spider quant à lui propose un support natif du sharding. Globalement des efforts sont faits pour intégrer des moteurs NoSQL avec notamment le support de Cassandra.

Les développeurs de MariaDB ont travaillé sur l’optimisation de la base de données ce qui permet d’atteindre un meilleur niveau de performance que MySQL. Cela s’explique essentiellement par l’optimisation des moteurs de stockage, mais un travail a également été fourni sur la gestion du pool de connexions et une meilleure prise en charge des requêtes exécutées en parallèle sur un cluster de serveurs répliqués. MariaDB offre également des fonctionnalités supplémentaires, que ce soit au niveau de la gestion des droits utilisateurs, de la création et gestion des schémas ou encore sur le requêtage. On peut notamment citer la prise en charge de la géolocalisation. MariaDB se veut également plus stable et plus sûr que MySQL.
MariaDB est disponible sur la plateforme Windows Azure via le service MariaDB Enterprise Cluster.




SQL : zoom PostgreSQL

PostgreSQL qui présentait déjà beaucoup d’intérêt par rapport à MySQL fait partie des bases de données SQL qui ont su évoluer et proposer des fonctionnalités pertinentes qui font face aux meilleures de NoSQL. Il gère notamment particulièrement bien les données temporelles et permet le stockage d’attribut au format JSON pouvant être requêté en SQL. Il y a peu de bases de données qui se comportent aussi bien avec la géolocalisation. Postgresql est optimisé pour traiter ces données et c’est d’ailleurs pour cette raison qu’il est utilisé par OpenStreetmap. L’utilisation de Postgresql en tant que base de documents JSON est possible. On peut si nécessaire envoyer des requêtes classiques en SQL et récupérer du JSON. Cependant il ne faut pas comparer hâtivement Postgresql à Mongodb; certaines fonctionnalités ne sont pas supportées et ne le seront probablement jamais. À commencer par l’atomicité de mise à jour des attributs JSON. Avec Postgresql on ne peut pas modifier partiellement un document JSON, on ne peut que le remplacer intégralement. Mongodb permet d’effectuer des insertions concurrentes ce que ne permet pas Postgresql puisqu’il respecte les propriétés ACID : les événements ont lieu les uns après les autres.

D’un point de vue des performances, il est possible de mettre en place un cluster avec des noeuds maîtres/esclaves, mais la haute disponibilité reste limitée dans ces conditions.
PostgreSQL supporte les tables partitionnées, cela permet une ségrégation des données selon un critère de date, de valeur numérique ou de critère personnalisé. Il s’agit de vues personnalisées qui seront plus rapides en lecture et qui héritent d’une table existante.



Les services Amazon AWS

Amazon propose différents services d’hébergement de bases de données propriétaires. Parmi ceux-ci Aurora, un moteur de stockage compatible MySQL 5.6. C’est Amazon RDS qui gère les tâches liées à la gestion des bases de données Aurora: mise en service, sauvegardes et récupérations, détection de pannes et réparation. L’intérêt ici est de permettre aux utilisateurs de migrer leur application sans avoir à modifier le code source. L’interface d’administration permet de facilement gérer les opérations courantes ainsi que la montée en charge.
Amazon CloudSearch est un moteur de recherche qui permet de créer un domaine (équivalent base de données) et d‘y associer une source de données : fichiers, S3, DynamoDB… L’outil d’initialisation permet alors de définir les champs de recherche sur les données et d’y associer un type (numérique, texte, date…) et une langue éventuelle parmi la trentaine proposée. La recherche s’effectue parmi l’ensemble des champs qu’il est possible de filtrer. L’API propriétaire peut être utilisée pour des tests à travers la console, mais un SDK est fourni ainsi qu’une interface de Web Services REST au format JSON/XML. CloudSearch propose des fonctionnalités similaires à ElasticSearch à la différence principale qu’il ne permet pas le stockage de documents riches et ne propose pas de suggestions en cas de fautes de frappe ou de termes approchants. Amazon Redshift est un service de recherche Big Data. Il permet le stockage et l’analyse de grands volumes de données de plusieurs Téraoctets. Le langage de requêtage retenu est, là encore, le SQL, associé à une procédure spécifique pour le chargement des données. Son utilisation reste simple puisqu’il peut être utilisé avec les outils habituels et les connecteurs ODBC/JDBC standards. Amazon met à disposition l’intégration de différentes solutions d’informatique décisionnelle du marché pour aller plus loin et construire de véritables applications BI : Talend, Informatica, Pentaho, QlikView…

SimpleDB est la solution de base de donnée NoSQL d’Amazon. Elle permet le stockage de données non relationnelles. Pensée pour la haute disponibilité, en arrière-plan, Amazon s’occupe de la réplication et d’une répartition géographique des données. Techniquement, SimpleDB stocke des données sous forme de table de ligne clef/valeur. Il permet la réalisation de requêtes simples d’insertion, de suppression et de sélection. Étant donné que les données sont non relationnelles, il n’est pas possible d’effectuer des requêtes complexes s’apparentant à des jointures ou à de l’agrégation.
Un autre service AWS et non des moindres: DynamoDB. Amazon nous propose un kit de développement logiciel documenté qui nous permet d’intégrer son utilisation au sein d’une application Java, .NET ou PHP. Un Shell est également disponible. DynamoDB est une solution simple à mettre en oeuvre qui inclue un hébergement scalable. Les fonctionnalités proposées restent par contre limitées en comparaison de ses concurrents open source comme MongoDB ou ElasticSearch.


Les services Google

Google BigQuery est une solution en ligne qui permet le requêtage massif de jeux de données de grands volumes. Le principe de BigTable est de simplifier le fonctionnement SQL en ne proposant pas le stockage dans la table accessible en écriture, mais en ajout de lignes seulement. On peut accéder à BigQuery par une interface graphique, ou bien par un outil en ligne de commande, ou au sein d’une application grâce à l’API HTTP. Différents outils permettent de visualiser les données ou encore de simplifier le chargement de données. Les données peuvent être chargées ou exportées au format JSON et CSV. BigQuery est un outil très utile pour traiter de la donnée, mais n’est pas utilisable en lieu et place d’une base MySQL pour une application Web, par exemple un déploiement WordPress. Google Cloud Bigtable est le service d’hébergement de données NoSQL de Google. Il s’agit d’un système qui est utilisé par la firme pour ses propres applications incluant son moteur de recherche, Google Analytics, Google Maps et GMail.

Autant dire que ce service a été conçu dans un seul but : assurer une disponibilité maximale avec des temps de réponse courts malgré une forte charge. Ceci en fait une solution de choix pour le développement d’applications qui traitent des données en temps réel. Techniquement, BigTable s’intègre avec Hadoop et Spark aussi bien qu’avec les autres services qu’ils proposent, dont BigQuery. Concrètement, BigTable supporte l’API standard de la base de données HBase. Il s’agit d’une base de données orientée colonne tout comme Cassandra.

Bigtable est adapté pour les grands volumes de données, mais ne conviendra pas pour une utilisation classique de base de donnée. Google propose une autre solution NoSQL baptisée Google Cloud Datastore. Il s’agit d’une base de données prenant en charge le sharding et la réplication automatique pour mieux appréhender les montées en charge. L’API proposée s’approche du SQL, et, surtout, ce système permet des transactions ACID ainsi qu’une gestion classique des index.


Les services Microsoft

DocumentDB est la solution NoSQL de Microsoft. Ce service est uniquement disponible en ligne et propose de stocker des documents JSON et de les requêter de façon simple et immédiate. Le schéma n’est pas fixé, mais la grammaire du langage de requêtage est proche du langage SQL. Il est également possible d’écrire des procédures stockées, triggers et autres fonctions en JavaScript. Finalement le vocabulaire et le fonctionnement de DocumentDB s’approchent de MongoDB. Cependant il existe des différences majeures comme l’absence de Shell ou encore des limitations concernant les capacités de DocumentDB à effectuer des opérations de Map/Reduce ou d’agrégation. Microsoft Azure Search est un service de recherche hébergé au sein de la plateforme Azure. Il permet une implémentation simplifiée d’un moteur de recherche au sein d’une application Web ou mobile tout comme le propose Amazon Cloud Search. Il s’agit donc là aussi d’une solution clef en main qui répondrait à la mise en place d’ElasticSearch.

Le service est accessible au travers d’une API HTTP ou du SDK .NET. Microsoft se démarque ici en proposant 56 langues contre seulement 34 pour Amazon et propose les suggestions de recherche ainsi que l’autocomplétion. Un index géospatial permet également de filtrer et de trier les données selon la zone géographique.

Microsoft tire très certainement cette avance de son expérience dans le développement dans son moteur de recherche Bing.
Microsoft tout comme ses concurrents, propose une solution SQL en ligne s’appuyant sur sa solution SQL Server. Cette solution s’intègre dans sa plateforme Azure et porte le nom Azure SQL Database. L’hébergement d’une application fonctionnant avec SQL Server sera transparent et permettra de profiter des fonctionnalités d’administration intégrées. Au-delà du système de tarification progressif suivant la consommation, Microsoft met à notre disposition un système appelé Elastic Pool permettant une configuration flexible des ressources.

Conclusion

Comme nous l’avons vu, SQL a encore de beaux jours devant lui et les technologies NoSQL trouvent leur place sur des besoins spécifiques qu’ils adressent. Nous avons pu parcourir les principales solutions du marché, mais il en existe beaucoup d’autres. Pour aller plus loin, vous pouvez aussi regarder les solutions Couchbase, HBase, Accumulo, Voldemort, mais également les solutions de cache Memcached, Hazelcast. Qu’il s’agisse de serveurs dédiés sur une infrastructure publique ou privée ou encore de solutions cloud qui vous proposent un service de stockage et de requêtage clef en main. Ne succombez pas trop hâtivement aux sirènes du NoSQL. Côté hébergement en ligne, nous n’avons pas fait le tour de toutes les solutions. Oracle propose également une plateforme en ligne avec notamment Oracle Coherence sur sa plateforme Java Cloud Service et il existe des acteurs de taille plus restreinte comme Heroku ou le français Clever Cloud. N’hésitez pas à essayer et à comparer !