Cédric BRASSEUR
Mis à jour le 27/05/2025
No SQL
NoSQL signifie Not Only SQL, car c'est une technologie souvent complémentaire à une base de données SQL
Le modèle relationnel et ses avantages (car il en a de nombreux !)
Le NoSQL est de plus en plus utilisé pour répondre aux enjeux du BigData
Le fonctionnement est différent d'un SGBDR, les données ne respectent pas un schéma particulier et elles sont stockées sous forme de document (ou graphes, ou paires clé/valeur ou encore colonnes).
Ceci ayant plusieurs avantages par rapport à un SGBDR :
le Big Data est une forte Volumétrie, haute Vélocité et grande Variété de données qui exigent des techniques innovantes et rentables de traitement d’informations pour une meilleure efficacité
Volume
Vélocité
Variété
On ajoute plusieurs machines qui effectuent les traitements en parallèle.
Utilisation de clusters de machines et du load balancing pour une capacité d'évolution en théorie infinie.
Horizontale
Verticale
On utilise une machine avec des capacités évolutives importantes en termes de RAM, processeurs,... Afin de pouvoir le rendre scalable et le faire évoluer au fil du besoin en termes de scalabilité.
Cette technique a ses limites et peut engendrer des coûts exorbitants.
La « scalabilité » est la capacité d'un SI à s'adapter au rythme de la demande (contraintes matérielles, stockage, temps d'accès, réplication des données...)
SGBDR
Ressources
Ressources
Ressources
Ressources
Ressources
Ressources
Ressources
Ressources
Serveur (Sun Enterprise)
NoSQL
Ressources
Ressources
Ressources
Ressources
Load balancer
ACID
BASE
Eric A. Brewer (2000) a formalisé un théorème reposant sur 3 propriétés des bases de données (relationnelles, NoSQL et autres) :
CAP !
Le théorème de CAP :
Dans toute base de données, vous ne pouvez respecter au plus que 2 propriétés parmi la cohérence, la disponibilité et la distribution.
CA
Consistency + Availability
SGBDR
Ecriture
Lecture 1
Lecture 2
v1 - v2
Si on prend le cas où on décide de mettre la priorité sur la cohérence des données et la disponibilité, lors d'une opération de lecture concurrente sur une même données, des lectures simultanées obtiennent forcément le même résultat.
CP
Consistency + Partition
MongoDB
Ecriture
Lecture 1
Lecture 2
v1 - v2
Si on prend le cas où on décide de mettre la priorité sur la cohérence des données et la distribution des données. En même temps, il est nécessaire de vérifier la cohérence des données en garantissant la valeur retournée malgré des mises à jour concurrentielles. La gestion de cette cohérence nécessite un protocole de synchronisation, introduisant des délais de latence dans les temps de réponse.
v1 - v2
attente
Synchro
Si on prend le cas où on décide de mettre la priorité sur la distribution des données et la disponibilité, lors d'une opération de lecture concurrente sur une même données, des lectures simultanées n'obtiennent pas forcément le même état de la donnée accédée (car il y a partitionnement et demande de réponse rapide). On dit que la donnée est "Eventually Consistent" et elle sera consistante au fil du temps.
AP
Availability + Partition
Cassandra
Ecriture
Lecture 1
Lecture 2
v1 - v2
v1
Asynchrone
Il est donc nécessaire de faire des choix par rapport aux grandes qualités attendues d'une base de données. En fonction de vos priorités, des opportunités s'offrent à vous.
orienté
document
Plusieurs axes sont à prendre en compte afin de bien choisir la structure de données adaptée à votre besoin :
Sharding (et replication en bas à gauche)
Mongo DB
PCA / PRA : méthode 3, 2, 1
CouchDB
En NoSQL il y a trois familles de stockage de données
Paires Clé / Valeur
Orienté Colonnes
Document JSON
Paires Clé / Valeur
Pas de relations !
Pas de jointures !
* Document structuré (pas un doc classique)
*
Retour au NoSQL
{
"premiereCollectionTableauObject": [
{
"premierObjet" : {
"nom": "BRASSEUR",
"prenom": "Cédric",
},
},
{
"secondObjet" : {
"nom": "JEAN",
"prenom": "Sébastien",
},
},
],
"secondNoeudSimpleValeur" : 10,
},
Le JSON permet de stocker des données comme on le souhaite, sous forme de tableaux, d'objets ou de simple association
clé => valeur
Il est simple de travailler avec le format JSON :
De même pour écrire du JSON :
L'idée du document c'est qu'il peut et doit être stocké et restitué en une seule fois.
Attention, on ne parle pas de document classiques, mais de :
Au final le NoSQL, c'est quoi dans tout ça, petit récap fin d'introduction !
Solutions aux limites relatives au modèle relationnel, essentiellement concernant le Big Data et les problématiques associées de gestion de données.
Notez qu'il vient avec son lot de contraintes également !
Et que beaucoup de choses sont à gérer vous même dans le code client.
Le MapReduce est un concept de développement inventé par Google et qui est très utilisé depuis. Ce concept permet de réaliser des opérations très rapides dans un ensemble de données extrêmement important (PO de données). Hadoop permet l'utilisation de ce concept en utilisant le Disque Dur pour communiquer avec le processeur. Sparke, plus récent, quant à lui permet de réaliser les opérations avec la RAM.
(Workshop plus tard, peut-être)
Malgré son utilisation massive et qu'il a fait ses preuves, Hadoop a un concurrent direct suite à un simple fait : Le taux de transfert est plus rapide lorsque l'on utilise la RAM, plutôt qu'un disque dur quel qu'il soit.
Disque dur
SSD
RAM
300MB/s (max 600)
600MB/s à 14000 MB/s
20GB/s à 50GB/s
Récapitulatif rapide du taux de transfert
(Données approximatives et datant de moins d'un an)
RAM !
On travaille sur des fichiers et on peut réaliser des opérations spécifiques. Et des opérations de distribution de données et en général ça passe par une étape de tri et d'assemblage des données pour travailler sur des ensembles partitionnés.
Il existe plusieurs types de bases NoSQL, nous en avons vu quelques uns durant la partie sur le théorème CAP. Le but de cette partie est de les lister, les différencier et nous installerons certains d'entre eux pour jouer un peu avec. Avant de se focaliser sur MongoDB (qui est le plus utilisé)
Petit schéma comparatif des types
Explication et utilisation de Redis
Ces bases permettent de stocker des couples [clé, valeur].
Cette valeur peut être une simple chaîne de caractères, un document, ou encore un objet complet.
Avantages :
Utilisation :
Faiblesses :
Nous allons démarrer un conteneur Redis (on fera un exercice juste après)
Voici les trois commandes nécessaires pour utiliser Redis avec Docker (à exécuter en deux commandes séparées)
:
docker run --name my-redis -p 6379:6379 -d redis
docker exec -it my-redis bash
Puis
redis-cli
Le serveur est déjà lancé sur le conteneur (donc pas besoin de la commande redis-server)
Nous allons installer Redis (on fera un exercice juste après)
Pour installer Redis, le plus simple est d'avoir accès à une machine Unix, soit en virtuel, soit avec WSL ou directement sur une distribution. (Sous Mac avec Docker : https://medium.com/idomongodb/installing-redis-server-using-docker-container-453c3cfffbdf)
Nous allons suivre cette documentation très simple : https://redis.io/topics/quickstart
Cette documentation dit de suivre deux étapes :
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
Puis
sudo make install
(ou cp les deux fichiers, redis-cli et redis-server vers /usr/local/bin/ , à votre convenance)
Nous allons démarrer Redis Server (Personnellement j'utilise mon terminal dans VSCode par habitude, mais vous pouvez utiliser votre outil de commande habituel (WSL, si sur WSL))
Si on a bien réalisé la seconde partie d'installation, il suffit de faire (peu importe où vous vous trouvez) :
redis-server
Nous allons démarrer Redis Client pour pouvoir effectuer des requêtes sur notre redis server.
Pour tester ça, on doit va réaliser les opérations suivantes :
redis-cli
redis 127.0.0.1:6379> ping
PONG
redis 127.0.0.1:6379> set mykey somevalue
OK
redis 127.0.0.1:6379> get mykey
"somevalue"
Juste pour vous montrer un peu comment ça marche avant l'exercice, je vais vous montrer comment on peut utiliser Redis à travers les différentes méthodes proposées.
Documentation !!!
Documentation des commandes
Documentation !!!
Documentation !!!
Prise en main et utilisation de Redis
N'hésitez pas à me demander de l'aide ou des informations durant cet exercice peu guidé. Le but est de tester un peu Redis par vous-même.
Exercice node / Redis
N'hésitez pas à me demander de l'aide ou des informations durant cet exercice peu guidé. Le but est de tester un peu Redis par vous-même.
Utilisation de Redis avec Node ou Python
Réalisez un code client en NodeJS (ou en Python) permettant de communiquer avec la base Redis mise en place lors de l'exercice après démonstration. (Ou autre idée)
Utiliser Python est une bonne idée car c'est un langage simple qu'on pourrait utiliser avec tout* (* à vérifier) les types de bases NoSQL.
Exemple de code avec NodeJS : https://learntutorials.net/fr/node-js/topic/7107/nodejs-avec-redis
Exemple de code avec Python : https://developer.redis.com/develop/python/fastapi
Installation de Python : https://docs.python-guide.org/starting/install3/linux/
Explication et utilisation de CouchDB
Utilise également le couple clé / valeur et la valeur, est un document.
Ce document a une structure arborescente : comme vu précédemment c'est souvent au format JSON (ou XML)
Avantages :
Utilisation :
Faiblesses :
CouchDB est une base de données OpenSource développée par Apache. Très utilisé dans le web, informations facile à utiliser en Javascript ou JQuery...
C'est le code client qui doit réaliser un certain nombre d'opérations de vérifications et de gestion des versions des documents en contrepartie.
Nous allons démarrer un conteneur CouchDB (on fera un exercice juste après)
Voici la commande pour utiliser CouchDB avec Docker :
docker run --name my-couchdb -e COUCHDB_USER=root -e COUCHDB_PASSWORD=root -p 5984:5984 -d couchdb
Nous allons installer CouchDB (on fera un exercice juste après)
Pour installer CouchDB, il devrait être simple d'utiliser WSL ou un système Unix. Malheureusement, j'ai eu des soucis de démarrage du service couchdb, j'ai donc installé via le paquet Windows et ça a très bien fonctionné.
Nous allons télécharger sur :
http://couchdb.apache.org/#download
Ou suivre les étapes d'installation sur :
https://docs.couchdb.org/en/stable/install/index.html
Si vous avez des soucis d'installation, nous tenterons de les résoudre ensemble durant l'exercice juste après. Désolé par avance pour ceux qui sont sous Mac !
Representational State Transfer
De manière générale, le Web est composé de REST (états et fonctionnalités basées sur des appels d'URL).
CouchDB possède une interface REST accessible via : http://localhost:5984/
Et une interface web Fauxton : http://localhost:5984/_utils/#
GET
HEAD
PUT
DELETE
POST
OPTIONS
Récupération d'un contenu
Comme GET mais pour le header (méta)
Mise à jour de contenu (complet)
Ajout de contenu
Suppression de contenu
Retourne les ressources disponibles
Utilisation de la commande curl
curl est une commande simple permettant d'appeler des URL en REST, cette commande vous permettra de communiquer avec l'API REST proposée par couchdb et donc travailler sur votre base de données.
curl http://localhost:5984/
Conseillé sous Unix
Utilisation de Postman
Postman est un outil de requêtage REST très pratique.
Conseillé sous Windows
& Mac
Il permet de faire tout type de requêtes, je vous conseille de paramétrer pour chaque requête l'authentification basique avec votre compte CouchDB.
Attention particulière sur les révisions, elles ne sont pas stables indéfiniment dans le temps, une opération de compression des données est effectuée automatiquement.
Une version est ajoutée à chaque modification
http://localhost:5984/test2/001
{
"_id": "001",
"_rev": "1-c3d84a0ca6114a8e8fbef75dc8c7be00",
"test": "test"
}
Récupérer les infos de version d'un doc
http://localhost:5984/test2/001?revs=true
Récupérer les infos d'une version spécifique
http://localhost:5984/test2/001?rev=1-c3d84a0ca6114a8e8fbef75dc8c7be00
Juste pour vous montrer un peu comment ça marche avant l'exercice, je vais vous montrer comment on peut utiliser CouchDB et Fauxton.
Documentation !!!
Documentation de CouchDB
Documentation !!!
Documentation !!!
Nous allons voir rapidement comment exploiter une base de données CouchDB avec NodeJS.
Vous devez installer npm (ça ne devrait pas être trop dur). Installer node-couch avec :
Puis il suffit de faire une connexion et des opérations sur la base, voici un exemple et un lien : https://www.npmjs.com/package/node-couchdb
const NodeCouchDb = require('node-couchdb');
// node-couchdb instance with default options
const couch = new NodeCouchDb({
auth: {
user: 'root',
pass: 'root'
}
});
couch.createDatabase("testfromnode").then(() => {
console.log("Creation done")
}, err => {
console.log("Error :" + err)
});
npm install node-couchdb --save
Vous pouvez requêter directement depuis l'interface Fauxton avec Mango, je vous laisserai parcourir un peu tout ça juste après. Et nous verrons plus en détails la syntaxe de requêtage d'un document NoSQL dans la partie sur MongoDB.
Documentation !!!
Documentation de CouchDB via Mango
Documentation !!!
Documentation !!!
Petite démo de Réplication de base avec CouchDB
Possibilité de mettre en place de la réplication automatique sur des serveurs locaux ou distants aisément
Prise en main et utilisation de CouchDB
N'hésitez pas à me demander de l'aide ou des informations durant cet exercice, le but est de s'exercer et appréhender globalement CouchDB
Envoyer Exercice-simple-couch.md
Utilisation de CouchDB avec Node
Réalisez le code nécessaire avec node (ou autre technologie) permettant de réaliser les opérations suivantes :
!! TOUTES LES DONNES PEUVENT ÊTRE EN DUR ET DES DONNEES DE TESTS !!
Documentation node-couchdb :
https://www.npmjs.com/package/node-couchdb
Explications sur l'orienté Colonnes
Elles se rapprochent le plus de la structure des bases de données relationnelles. On retrouve le principe de “tables” avec des lignes et des colonnes, mais elles ont deux principales grosses différences :
Avantages :
Utilisation :
Faiblesses :
Feature | Column oriented (NoSQL) | SQL (PostgreSQL/MySQL) |
---|---|---|
Best for | Big Data, Fast Writes, Availability | Complex Queries, Transactions |
Scaling | Horizontally (more nodes) | Vertically (bigger servers) |
Joins | ❌ Not Supported | ✅ Fully Supported |
Transactions | ❌ Weak (No ACID) | ✅ Strong (ACID) |
Replication | ✅ Automatic, Multi-Datacenter | ❌ Manual, Single Master |
Use Case | IoT, Streaming, Logs, Social Media | Banking, ERP, CRM, Inventory |
Les différences entre un SGBDR et du NoSQL orienté colonnes :
Merci chat GPT ici...
On ne prendra pas le temps de voir l'orienté colonne, ça ressemble vraiment beaucoup au SQL que vous connaissez déjà, même dans la syntaxe des requêtes.
Je vous conseille Cassandra si vous souhaitez essayer.
Explications de l'orienté Graphes
Ces bases ont pour objectif de stocker les données en se basant sur la théorie des graphes. Elles s’appuient sur les notions de noeuds qui ont chacun leur propre structure, relations entre les noeuds, propriétés (de noeuds ou de relations),...
Avantages :
Utilisation :
Faiblesses :
Ce type de base de données NoSQL étant la plus proche d'un modèle relationnel, il est intéressant de comparer les deux, voici un schéma récapitulatif de ce qu'il faut savoir
Envoyer CheatSheet
Nous allons démarrer un conteneur Neo4j et je vous propose de regarder les tutoriels qui sont intégrés à Neo4j qui sont extrêmement bien fait pour démarrer avec cette base de données.
Voici la commande pour utiliser Neo4j avec Docker :
docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -e NEO4J_AUTH=neo4j/Admin123- neo4j
Prise en main et utilisation de Neo4j
Envoyer Neo4j-exercices.md
MongoDB est une base de données orientée documents. Très utilisé dans le web de manière générale en NoSQL.
C'est le code client qui doit réaliser un certain nombre d'opérations de vérifications et de gestion des versions des documents en contrepartie.
MongoDB permet de travailler sur des bases de données contenant de nombreuses données.
Son utilisation est plus flexible qu'une base de données relationnelle car on ne respecte pas (forcément) un schéma prédéfini, même si c'est possible.
Comme vu lors du théorème CAP, on choisi souvent une base comme MongoDB pour sa scalabilité horizontale.
De plus, MongoDB a des éléments intégrés pour gérer le sharding (aperçu plus tard)
Les cas d'usages fréquents sont les suivants :
Nous allons démarrer un conteneur MongoDB avec Docker
Les commandes à réaliser sont :
- Récupérer l'image mongo
docker pull mongo
- Start mongo container :
docker run --name mongodb -d -p 27017:27017 mongo
- Arriver dans le terminal de commande du conteneur :
docker exec -it mongodb bash
- Démarrer mongo en invite de commande (dans docker) :
mongosh
**Vous êtes connecté sur mongo sur docker !**
Via Docker
docker run --name mongodb -d -p 27017:27017 mongo
docker exec -it mongodb bash
mongosh
Nous allons installer MongoDB (on fera un exercice juste après)
Téléchargement :
- Lien : https://www.mongodb.com/try/download/community
Commandes :
- Se placer en cmd sur le bon répertoire (si la variable d'environnement n'est pas configurée à l'installation): `cd "C:\Program Files\MongoDB\Server\5.0\bin"` (vérifier votre version)
- Démarrage de mongoDB : `mongod` (ou `mongosh`)
- **Vous êtes connecté sur mongo en local !**
Juste pour vous montrer un peu comment ça marche avant l'exercice, je vais vous montrer comment on peut utiliser MongoDB à travers les différentes méthodes proposées.
Documentation !!!
Documentation des commandes
Documentation !!!
Documentation !!!
+ Envoyer le document complémentaire MongoDB_Cheat_Sheet_Dark.pdf (Récupéré de WebDevSimplify)
Compass
MongoDBCompass est une interface de gestion de votre base de données mongoDB, sous Windows, c'est installé en même temps que mongoDB (avec Windows).
Chaîne de connexion locale :
Normalement, c'est pré-configuré au lancement de Compass
Download (si docker)
MongoDB propose deux moyens d'importer des données : soit via l'outil mongoimport (évitons nous de l'installer, mais vous pouvez tester), soit via MongoDBCompass avec l'outil graphique d'import de données. D'abord on va créer la DB restaurants, puis la collection new_york (nécessaire, faites le en ligne de commande comme on a vu)
Si besoin, voici les commandes pour importer un fichier en ligne de commande :
- Copiez votre fichier restaurants.json dans un dossier, par exemple /tmp avec cette commande (modifier les liens en fonction)
docker cp .\MongoDB\InitializeDB\restaurants.json mongodb:/tmp/restaurants.json
- Utilisation de la commande d'import mongoimport :
mongoimport mongodb://localhost:27017 /tmp/restaurants.json
En ligne de commandes
Prise en main et utilisation de MongoDB
N'hésitez pas à me demander de l'aide ou des informations durant cet exercice peu guidé. Le but est de tester un peu MongoDB par vous-même dans un premier temps.
Envoyer simple_mongo_queries.md
+ users.json
Plusieurs opérations et opérateurs sont utilisables pour filtrer des données avec MongoDB. Déjà, comme on l'a vu, find récupère plusieurs résultats et findOne en récupère qu'un seul, les deux opérations acceptants des filtres.
Modificateurs après lecture
Opérateurs de filtres
Se fait toujours via un sous objet JSON.
Exemple : db.dogs.find({name : {$gte:"B"}})
Opérateurs : $eq, $in, $nin, $ne, $gt, $lt, $gte, $and, $or, $exists,$push,$pull...
Voir Cheat Sheet
Opérations & filtres avec MongoDB
Exercice complémentaire MongoDB avec le json "employés".
Envoyer le document Exercice_Simple_MongoDB.docx
Utilisez ce que l'on a vu pour réaliser les opérations demandées
N'hésitez pas à me demander de l'aide ou des informations. Le but est de tester les filtres MongoDB.
Petite démo d'utilisation de MongoDB avec NodeJS.
Documentation !!!
Documentation des commandes
Documentation !!!
Documentation !!!
Utilisation de MongoDB avec Node et MongoClient
Vous pouvez me poser des questions !
Envoyer nodejs-mongo-client.md
Utilisation de MongoDB avec Node (plus avancé)
Ce Workshop se fait en deux étapes :
Envoyer le code node-express-mongodb
+ exercice_nodejs_express_mongode.md
Il est également possible de créer des indexes, ils permettent d'optimiser l'accès aux données (attention aux contres performances en update/insert/delete)
Un index simple se créer sur une collection
db.collection.createIndex({"age": -1}, {"name": "idx_age"})
Un index automatique est créé sur l'id
A l'instar d'une base de données relationnelle, il est également possible de créer des indexes composés. Il doit aussi respecter la vectorisation des données.
Un index composé se créer sur une collection
db.dogs.createIndex(
{"name": 1,"age":1, "weight": 1},
{"name": "idx_name_age_weight"}
)
On peut créer un index unique
db.users.createIndex({ email: 1 }, { unique: true })
Un index unique force l'unicité des valeurs dans la collection, sinon une erreur est remontée lors d'une tentative d'insertion.
Stats utilisation !
Exemple de création et utilisation de vues
Les vues permettent de réaliser des sortes de collections intermédiaires utilisant les collections de bases (ou les autres vues) présentes sur la même base.
Petit exemple de création de vue :
db.createView(
"adoption",
"dogs",
[{ $project: { "_id": 0, "name": "$name", "age": "$age" }}]
)
Explication sharding
Le sharding permet de partager les documents sur un cluster de serveurs. Ceci permettant de paralléliser les traitements en plus de séparer les données.
On démarre d'un répliquât (comme vu avec CouchDB) puis un partitionnement des données est effectué.
Schéma sharding (application docker)
mongos
mongos
Users
60000
config servers
P
S
S
40002
40003
40001
P
S
S
50002
50003
50001
Shard2
P
S
S
Shard1
Cluster
Si on a encore assez de temps, on va aller voir rapidement un ancien sharding que j'ai pu mettre en place avec docker, je l'ai simplifié au maximum. Nous allons entrevoir rapidement les infos qui y sont présentes et comment l'utiliser.
Documentation !!!
J'ai pas vraiment de documentation à proposer malheureusement.
Documentation !!!
Documentation !!!
Ici, je vous propose de regarder le travail qui a été fait par quelqu'un d'autre car son travail est extrêmement bien fait !
Il n'est pas nécessaire que vous comprenez absolument tout, mais prenez le temps de suivre le README.md et de vous intéresser à ce qu'il se passe
ElasticSearch est une base de données NoSQL pouvant indexer des documents textes. On pourrait le comparer à un moteur de recherche, mais que l'on peut paramétrer pour qu’il colle exactement à vos besoins de recherche.
ElasticSearch, c’est donc un moteur de recherche capable de stocker une grande quantité de documents et que l’on peut interroger en temps réel.
Impression du fichier no_sql_theory.docx
Evaluation type QCM sur papier, les règles de notation seront inscrites sur le document d'évaluations
BON COURAGE !
(après c'est fini)
Envoyer le fichier no_sql_workshop.docx