Le NoSQL (Not only SQL) est un type de système de gestion de base de données (SGBD) qui offre une alternative aux bases de données relationnelles traditionnelles.
Contrairement aux systèmes basés sur le SQL (Structured Query Language), les bases de données NoSQL sont conçues pour traiter de grandes quantités de données non structurées et semi-structurées, ce qui les rend idéales pour les applications modernes qui nécessitent évolutivité, flexibilité et haute disponibilité. Dans cet article, nous allons explorer les raisons pour lesquelles les SGBD NoSQL sont un excellent choix pour les applications modernes, ainsi qu’un exemple concret de code avec MongoDB.
Les raisons de choisir un SGBD NoSQL
Scalability (Évolutivité)
L’un des principaux avantages des SGBD NoSQL est leur évolutivité. Ces systèmes peuvent gérer des quantités massives de données, ce qui en fait un choix idéal pour les applications qui nécessitent une mise à l’échelle horizontale, où les données sont distribuées sur plusieurs serveurs. En revanche, les systèmes traditionnels basés sur SQL s’appuient généralement sur une évolutivité verticale, où le matériel est mis à niveau pour traiter des quantités croissantes de données.
Or le prix d’une mise à l’échelle horizontale est bien important qu’une mise à l’échelle verticale. En effet, il est moins cher d’acheter de nouveaux serveurs que d’améliorer les serveurs existants en ajoutant RAM, SSD, Processeurs …
Une question reste en suspens, pourquoi est-il plus facile de mettre à l’échelle horizontalement un SGBD NoSQL qu’un SGBD relationnel ?
La réponse est directement liée à la manière de stocker l’information, en NoSQL les objets sont “self-contained”, c’est-à-dire indépendants les uns des autres alors que dans une structure relationnelle, comme son nom l’indique, les éléments sont liés.
Autrement dit, en NoSQL les objets peuvent se trouver sur différents serveurs sans qu’il soit nécessaire de joindre des lignes provenant de plusieurs serveurs, comme c’est le cas avec le modèle relationnel.
Flexibilité
Les SGBD NoSQL sont conçus pour traiter des données non structurées et semi-structurées, ce qui les rend plus flexibles que les systèmes basés sur SQL. Ces bases de données peuvent stocker différents types de données, tels que du texte, des images, des vidéos et des documents, sans nécessiter de modèles de données ou de schémas complexes.
Performance
Les SGBD NoSQL offrent généralement des niveaux de performance élevés par rapport aux systèmes basés sur SQL. Ils peuvent traiter rapidement de grandes quantités de données, ce qui en fait un choix idéal pour les applications qui nécessitent un traitement et une analyse en temps réel.
Disponibilité
Les SGBD NoSQL sont conçus pour offrir une haute disponibilité, avec des mécanismes intégrés de réplication et de basculement qui garantissent que les données sont toujours disponibles, même en cas de défaillance matérielle.
La réalité reste nuancée …
Il est difficile d’affirmer simplement que SQL ou NoSQL est le meilleur. SQL et NoSQL ont tous deux des avantages et des inconvénients dans différentes situations. Les bases de données SQL, du fait qu’elles possèdent des relations, ont un avantage lors de la mise à l’échelle verticale et sont garantes de la cohérence des données (au sens ACID). Comme la cohérence est prioritaire dans les bases de données SQL, le système de gestion de la base de données doit faire beaucoup de travail pour maintenir l’état cohérent, ce qui entraîne une perte de temps. Les bases de données NoSQL, conçues pour être flexibles et rapides, ont moins de contraintes que SQL en réduisant les frais généraux de maintien de la cohérence. En ce qui concerne la flexibilité, NoSQL peut stocker des données dans plusieurs types d’objets (documents ou paires clé-valeur) de manière distribuée. En ce qui concerne la vitesse, NoSQL est généralement plus rapide que SQL, en particulier pour le stockage des couples clé-valeur. D’un autre côté, les bases de données NoSQL peuvent ne pas supporter entièrement les transactions ACID, ce qui peut entraîner des incohérences dans les données.
Exemple pratique pour débuter avec Mongo DB
Pour installer MongoDB, vous pouvez télécharger le package approprié pour votre système d’exploitation depuis le site officiel de MongoDB, puis suivre les instructions d’installation pour votre plateforme. Ensuite, pour communiquer avec mongoDB, nous avons le plus souvent besoin d’un langage de programmation. Dans la suite, nous utiliserons JavaScript pour effectuer des opérations sur la BDD.
Installation de la bibliothèque mongoDB pour JavaScript
Tout d’abord, vous devez installer la bibliothèque mongodb à l’aide de npm (gestionnaire de package pour JavaScript) :
npm install mongodb
Connexion à la base de données
Ensuite, vous pouvez vous connecter à la base de données en utilisant la méthode MongoClient.connect() :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const MongoClient = require('mongodb').MongoClient; | |
const url = 'mongodb://localhost:27017'; | |
const dbName = 'db'; | |
MongoClient.connect(url, function(err, client) { | |
console.log("Connecté à la base de données"); | |
const db = client.db(dbName); | |
// Interagir avec la base de données ici | |
client.close(); | |
}); |
Cela vous connectera à la base de données db sur votre machine locale à l’aide de l’URL mongodb://localhost:27017.
Création d’une collection
Pour créer une collection, vous pouvez utiliser la méthode createCollection() de l’objet db :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
db.createCollection("ma_collection", function(err, res) { | |
console.log("Collection créée !"); | |
}); |
Cela créera une nouvelle collection appelée ma_collection dans la base de données.
Insertion de données
Pour insérer des données, vous pouvez utiliser la méthode insertOne() ou insertMany() de l’objet collection :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const collection = db.collection('ma_collection'); | |
collection.insertOne({ nom: "Louis", age: 22 }, function(err, res) { | |
console.log("Document inséré !"); | |
}); |
Cela insérera un nouveau document dans la collection ma_collection avec les champs nom et age.
Pour vérifier la bonne création de la collection et la bonne insertion des données vous pouvez utiliser mongo GUI, une interface graphique pour MongoDB. Cette dernière affiche les bases données et les collections associées ainsi que les differents objets qui composent chaque collection.
Recherche de données
Pour rechercher des données, vous pouvez utiliser la méthode find() de l’objet collection :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const collection = db.collection('ma_collection'); | |
collection.find({}).toArray(function(err, docs) { | |
console.log("Résultat de la recherche : "); | |
console.log(docs); | |
}); |
Cela affichera tous les documents de la collection ma_collection.
Mise à jour de données
Pour mettre à jour des documents existants, vous pouvez utiliser la méthode updateOne() ou updateMany() de l’objet collection :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const collection = db.collection('ma_collection'); | |
collection.updateOne({ nom: "Louis" }, { $set: { age: 99 } }, function(err, res) { | |
console.log("Document mis à jour !"); | |
}); |
Cela mettra à jour le document avec le champ nom égal à “Louis” en définissant la valeur de age à 99.
Suppression de données
Pour supprimer des documents de la collection, vous pouvez utiliser la méthode deleteOne() ou deleteMany() de l’objet collection :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const collection = db.collection('ma_collection'); | |
collection.deleteOne({ nom: "Louis" }, function(err, res) { | |
console.log("Document supprimé !"); | |
}); |
Cela supprimera le premier document de la collection avec le champ nom égal à “Louis”.