Esc
 Naviguer  Ouvrir Esc Fermer
Aller au contenu

9.2 — NoSQL

🎯 Objectif : reconnaître les cas où une base NoSQL est meilleure que SQL, et choisir parmi les 5 grandes familles.

À l'issue de cet axe, tu sauras :

  • Distinguer document, clé-valeur, colonne large, graphe, recherche, vector
  • Choisir entre MongoDB et PostgreSQL+JSONB
  • Utiliser Redis pour cache, sessions, rate-limiting, queues
  • Comprendre les vector DBs (pgvector, Qdrant) pour la RAG
  • Connaître les pièges spécifiques à chaque famille

Confirmé 10 min prérequis : axe 8 lu

« 99 % des projets web devraient commencer par PostgreSQL. NoSQL n’est PAS un upgrade. »

PostgreSQL fait :

  • JSONB indexé GIN (équivalent MongoDB pour 80 % des cas)
  • Full-text search natif (équivalent Elasticsearch léger)
  • pgvector pour les embeddings (équivalent Pinecone)
  • LISTEN/NOTIFY pour pub/sub léger (équivalent Redis pub/sub)

Avant de choisir une NoSQL, demande-toi : « est-ce que Postgres fait déjà ça ? » Souvent oui.

Cela dit, certaines familles NoSQL excellent dans leur niche.

Stocke des documents JSON indépendants. Pas de schéma rigide, pas de jointure performante.

// Document MongoDB
{
_id: ObjectId("..."),
email: "alice@example.com",
name: "Alice",
addresses: [
{ type: "home", street: "1 rue X", city: "Lyon" },
{ type: "work", street: "2 avenue Y", city: "Paris" }
],
preferences: { theme: "dark", language: "fr" }
}
// Requêtes
db.users.findOne({ email: "alice@example.com" });
db.users.find({ "preferences.theme": "dark" });
db.users.updateOne(
{ _id },
{ $push: { addresses: { type: "office", street: "3 rue Z" } } }
);
Cas favorable MongoDBPourquoi
Schéma vraiment instable (vraiment, pas une excuse)Pas de migrations
Volumes massifs avec sharding horizontal natifSharding intégré, plus simple que pg_partman
Équipe déjà fluente MongoStack cohérente
Stockage de logs / eventsInsertion ultra-rapide

Sinon : PostgreSQL + JSONB. Tu as joins, transactions ACID, full SQL, et la flexibilité de JSONB pour les champs vraiment libres.

Redis est THE outil omniprésent. In-memory (rapide), persistant en option, structures riches.

CasPattern Redis
CacheSET user:42 "{...}" EX 300 (TTL 5 min)
Rate limitingINCR + EXPIRE, ou Redis modules dédiés
QueuesList avec LPUSH / BRPOP (BullMQ derrière)
Pub/SubSUBSCRIBE / PUBLISH
SessionsStockage clé → données utilisateur
Locks distribuésSET key value NX EX 30 (Redlock pattern)
LeaderboardsSorted Set avec ZADD / ZRANGEBYSCORE
StreamsXADD / XREAD (équivalent Kafka léger)
import Redis from 'ioredis';
const redis = new Redis();
async function getUser(id: number) {
const cached = await redis.get(`user:${id}`);
if (cached) return JSON.parse(cached);
const user = await db.user.findById(id); // PostgreSQL
await redis.set(`user:${id}`, JSON.stringify(user), 'EX', 300); // 5 min
return user;
}
  • KeyDB : fork Redis multi-thread (plus rapide sur multi-cœur).
  • Dragonfly : compatible Redis, écrit en C++, ×25 plus rapide en certains benchmarks.
  • Valkey : fork open source de Redis (Redis Labs ayant changé sa licence en 2024).

Pour de la recherche full-text complexe (typo-tolerance, ranking, filtres facetés), un moteur dédié bat tout.

SolutionStyleNote
MeilisearchOpen source, simple, rapideRecommandé 2026 pour les projets indie/PME
TypesenseConcurrent direct de MeilisearchBonne alternative
AlgoliaSaaS, premiumTrès polish, cher au-delà de quelques milliers de docs
ElasticsearchOpen source, ultra-puissant, complexePour gros volumes ou besoins avancés
OpenSearchFork Elasticsearch (AWS)Si tu es sur AWS
import { MeiliSearch } from 'meilisearch';
const client = new MeiliSearch({ host: 'http://localhost:7700' });
const index = client.index('products');
await index.addDocuments([
{ id: 1, name: 'Carnet rouge', description: '...', price: 9.90 }
]);
const results = await index.search('carnet rouge'); // typo-tolerant

PostgreSQL fait du full-text search aussi avec tsvector — suffisant jusqu’à ~quelques millions de documents et des besoins simples.

Stocke nœuds + relations + propriétés. Excellents pour des données hautement connectées.

// Cypher (langage de requête Neo4j)
MATCH (alice:Person {name: 'Alice'})
-[:FRIEND]-(:Person)
-[:LIKES]->(p:Product)
RETURN p.name, COUNT(*) AS recommendations
ORDER BY recommendations DESC
LIMIT 10;
  • Recommandations (“amis d’amis qui ont aimé”).
  • Réseaux sociaux complexes.
  • GPS / pathfinding sur villes.
  • Détection de fraude (suivi de chaînes d’opérations).
  • Knowledge graphs (Wikidata).

Pour les apps web classiques : PostgreSQL avec CTE récursives suffit en général.

C’est la nouveauté explosée depuis ChatGPT. Stocke des vecteurs (embeddings de texte/images) et permet la recherche de similarité.

Cas d’usage : RAG (Retrieval-Augmented Generation)

Section intitulée « Cas d’usage : RAG (Retrieval-Augmented Generation) »
1. Tu as 10 000 docs → tu génères un embedding par doc avec OpenAI/Anthropic
2. Tu stockes (vector, doc_id) dans une vector DB
3. Question utilisateur → embedding de la question
4. Recherche les 5 vecteurs les plus proches → top 5 docs pertinents
5. Tu envoies ces 5 docs au LLM en contexte
OutilStyleQuand préférer
pgvectorExtension PostgreSQLTu as déjà Postgres, < 10 M vecteurs, simplicité maximale
QdrantStandalone, RustPerformances, fonctionnalités avancées (filtres + similarité)
WeaviateStandalone, GoHybride vector + traditional, multi-tenant
PineconeSaaS managéSi tu acceptes le SaaS et veux scale-to-zero
Redis + RediSearchSi tu as déjà RedisSolution intégrée
SupabasePostgres + pgvector + UIAll-in-one indie hacker
CREATE EXTENSION vector;
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536) -- dimension de l'embedding (OpenAI ada-002)
);
CREATE INDEX documents_embedding_idx ON documents
USING hnsw (embedding vector_cosine_ops);
-- Recherche des 5 plus proches
SELECT id, content, 1 - (embedding <=> $1) AS similarity
FROM documents
ORDER BY embedding <=> $1
LIMIT 5;

L’opérateur <=> est la distance cosine.

Pour des données temporelles massives (IoT, métriques, logs).

TimescaleDBInfluxDB
Base sous-jacentePostgreSQL (extension)Standalone
AvantageSQL standard, transactions ACIDOptimisé time-series, agrégations rapides

Pour 99 % des apps web : tu n’en as pas besoin. Pour des logs ou métriques internes à grande échelle : utile.

Si tu…Choisis
Démarres une nouvelle app web (cas général)PostgreSQL
As besoin de cache, queue, rate-limitRedis (à côté de Postgres)
Veux une recherche full-text avec typo-toleranceMeilisearch (ou pg full-text search si simple)
Construis une app de recommandation graphe complexeNeo4j (ou Postgres avec CTE récursives)
Construis une RAG / chatbot docpgvector (ou Qdrant si > 10 M vecteurs)
Stockes des logs / métriques massifsTimescaleDB ou ClickHouse
Schéma vraiment instable + sharding natifMongoDB
Single-page app, scriptsSQLite (souvent oublié, parfait suffisant)
Tu construis un blog. 90 % des requêtes affichent un post avec ses commentaires. PostgreSQL ou MongoDB ?
Tu veux faire du cache + rate-limit + une queue de jobs. Outil idéal ?
Tu construis un assistant qui répond depuis 5000 docs internes. Architecture moderne ?

Suite : 9.3 — ORM & query builders — comment ne pas tomber dans les pièges N+1.