đïž Bases de DonnĂ©es â concepts, modĂšles, SQL/NoSQL, transactions, index, perf, rĂ©plication & ops
Une base de donnĂ©es est un systĂšme de stockage et de requĂȘtage qui garantit (Ă divers degrĂ©s) : durabilitĂ©, cohĂ©rence, concurrence, performance et sĂ©curitĂ©. On choisit une BD en fonction du modĂšle de donnĂ©es, du workload (OLTP/OLAP), des contraintes (latence, dispo, conformitĂ©) et du budget opĂ©rationnel (backup, upgrades, rĂ©plication, tuning).
Définition & taxonomie
DBMS, schéma, tables/collections, transactions. OLTP vs OLAP. Row-store vs column-store. ACID vs BASE.
OLTPOLAPACIDModÚles de données
Relationnel, document, key-value, wide-column, graph, time-series, search. Quand choisir quoi.
RelationalDocumentGraphSQL & conception
SchĂ©ma, normalisation, contraintes, clĂ©s, types, relations, ORM, migrations. ModĂ©liser pour requĂȘter.
SchemaConstraintsORMTransactions & concurrence
ACID, isolation, verrous, MVCC, deadlocks, phénomÚnes (dirty read, phantom), 2PL vs MVCC.
MVCCLocksDeadlocksIndex & structures
B-Tree, Hash, GIN/GiST, bitmap, covering index. Cardinalité, sélectivité, coût write vs read.
B-TreeGINCoveringOptimizer & plans
Explain plan, statistics, join order, scans, sorts, cost model. Pourquoi une requĂȘte âtombeâ.
EXPLAINStatsJoinsStockage, WAL & recovery
Pages, buffers, redo/undo, WAL/redo log, checkpoints, crash recovery, corruption, fsync, I/O patterns.
WALCheckpointRecoveryRéplication & HA
Sync vs async, RPO/RTO, failover, quorum, split brain. Read replicas, sharding, multi-region.
RPO/RTOFailoverQuorumBackup & restore
Full/incr, snapshots, PITR, logical vs physical, tests réguliers, runbooks, encryption, retention.
PITRSnapshotsRestoreSécurité & compliance
AuthN/AuthZ, RBAC, chiffrement, secrets, audit, masking, least privilege. Multi-tenant, GDPR.
RBACEncryptionAuditOps, perf & tuning
Monitoring, capacity, autovacuum/bloat, cache hit ratio, connection pools, slow queries, SLO.
MonitoringTuningSLOCheat-sheet âDBA / backendâ
RĂšgles dâor, index, transactions, plans, rĂ©plication, backup, anti-patterns, checklist incident.
ChecklistIncidentAnti-patternsMental model : âmodĂšle + workload + garanties + opsâ
OLTP vs OLAP (problĂšme #1 des systĂšmes)
| Dimension | OLTP | OLAP |
|---|---|---|
| Usage | transactions courtes | requĂȘtes longues, scans |
| ModÚle | normalisé | dé-normalisé, star schema |
| Stockage | row-store | souvent column-store |
| Index | sélectifs | partitioning + column pruning |
3 axes décisionnels (pratiques)
1) Cohérence vs disponibilité (CAP)
En rĂ©seau partitionnĂ© : tu dois choisir âCâ ou âAâ en pratique (et contrĂŽler le comportement).
2) Perf reads vs writes
Index accélÚre read, ralentit write. Constraints protÚgent, mais coûtent.
3) Ops & fiabilité
Une BD âfacileâ = backup/restore testĂ©s + monitoring + upgrades + runbooks.
RĂšgle dâor
La plupart des pannes/perfs viennent de :
- mauvais modĂšle / requĂȘtes non indexĂ©es
- stats/planificateur
- contention (locks) / saturation I/O
- absence de plan backup/restore
- réplication mal comprise (RPO/RTO)
Quâest-ce quâun DBMS ?
Un DBMS est un moteur qui gĂšre : stockage (pages/fichiers), concurrence (locks/MVCC), rĂ©cupĂ©ration (WAL/redo), requĂȘtage (optimizer), sĂ©curitĂ© (auth/RBAC) et outils dâexploitation.
Row-store
OptimisĂ© OLTP : Ă©crire/lire une ligne complĂšte vite (PostgreSQL, MySQL, OracleâŠ)
Column-store
OptimisĂ© OLAP : lire seulement les colonnes nĂ©cessaires (BigQuery, ClickHouse, SnowflakeâŠ)
ACID (et pourquoi câest important)
| Propriété | Idée | Exemple |
|---|---|---|
| Atomicity | tout ou rien | transaction rollback |
| Consistency | invariants respectés | constraints |
| Isolation | transactions âcomme seulesâ | levels |
| Durability | persistĂ© mĂȘme crash | WAL + fsync |
Beaucoup de systĂšmes NoSQL se rapprochent dâACID aujourdâhui, mais pas toujours partout (multi-doc, cross-partitionâŠ).
CAP (version utile)
Si partition réseau :
- C (consistency) ou A (availability) : tu choisis comportement
En pratique :
- CP : préfÚre cohérence (peut refuser)
- AP : préfÚre disponibilité (cohérence éventuelle)
OLTP vs OLAP : ne pas mélanger sans précautions
OLTP : petits writes/reads, beaucoup de connexions, index + contention
OLAP : scans, aggregations, partitions, columnar, compression
Mix :
- réplicas dédiés
- ETL vers warehouse
- workload management
Comparatif âquand choisir quoiâ
| ModĂšle | Forces | Faiblesses | Quand |
|---|---|---|---|
| Relationnel | transactions, joins, contraintes | scale horizontal plus complexe | OLTP métier |
| Document | schéma flexible, objets imbriqués | joins limités | payloads, CMS |
| Key-Value | latence trĂšs basse | requĂȘtes limitĂ©es | cache, sessions |
| Wide-column | scale massif, write heavy | modélisation stricte par accÚs | events, logs |
| Graph | relations complexes | perf dépend modÚle | fraude, réseau |
| Time-series | ingest + agrégations temps | pas généraliste | metrics/IoT |
| Search | full-text + ranking | consistance différente | recherche |
Le bon modĂšle = celui qui colle au pattern dâaccĂšs (requĂȘtes). Beaucoup dâĂ©checs viennent dâun modĂšle choisi âĂ la modeâ.
Relationnel : pourquoi ça reste dominant
- schéma explicite
- contraintes (PK/FK/unique/check)
- transactions + isolation
- optimizer mature
- reporting + SQL universel
Document : flexibilité
- documents JSON (collections)
- index sur champs
- atomicité souvent par document
- bon pour structures imbriquées
Risques :
- schĂ©ma âcachĂ©â => dette
- duplication => incohérences
SpĂ©cialisĂ©es : âle bon outil au bon endroitâ
Key-Value : Redis-like (cache)
Search : Elastic-like (full text)
Time-series : Influx/Timescale-like (metrics)
Graph : Neo4j-like (relations)
Wide-column : Cassandra-like (scale)
Concevoir un schĂ©ma : partir des requĂȘtes
Approche pragmatique :
1) lister les 10 requĂȘtes les plus frĂ©quentes/critique
2) modĂ©liser pour rendre ces requĂȘtes naturelles
3) ajouter contraintes + index
4) valider avec EXPLAIN + tests charge
Normalisation (résumé)
- 1NF : valeurs atomiques.
- 2NF : pas de dépendance partielle (clé composite).
- 3NF : pas de dépendance transitive.
En OLTP : normalisation aide la cohérence. En OLAP : dénormalisation améliore performance.
Contraintes : âpayer un peuâ pour Ă©viter le chaos
| Contrainte | But | Coût |
|---|---|---|
| PK/Unique | unicité | write |
| FK | intégrité relationnelle | locks/validation |
| CHECK | rÚgles métier | validation |
ORM : productivité vs transparence
Avantages :
- productivité CRUD
- migrations + modĂšle unique
Risques :
- N+1 queries
- joins implicites
- mauvais plans invisibles
Pratiques :
- profiler SQL
- expliciter préfetch/join
- indexer selon requĂȘtes
Isolation levels (vision simple)
| Niveau | ProtÚge contre | Coût |
|---|---|---|
| Read Committed | dirty reads | faible |
| Repeatable Read | non-repeatable reads | plus |
| Serializable | phantoms + anomalies | élevé (retries) |
Locks : pourquoi ça bloque
Sources de contention :
- transactions longues
- scans + updates
- hotspots (mĂȘme row)
- index manquants sur FK
Solutions :
- réduire durée transactions
- indexer correctement
- partitioning, batching
MVCC : multi-version concurrency control
Idée :
- lecteurs ne bloquent pas écrivains (souvent)
- versions (tuples) -> nettoyage (vacuum)
Impacts :
- bloat si vacuum mal réglé
- visibilité via snapshots
Deadlocks : cercle dâattente
Pattern :
T1 lock(A) -> veut B
T2 lock(B) -> veut A
=> deadlock, un est tué
Prévention :
- ordre d'accĂšs stable
- transactions courtes
- index + éviter scans lockants
B-Tree : le standard OLTP
B-Tree :
- range queries (>, <, BETWEEN)
- tri (ORDER BY) si compatible
- index sur (a,b,c) utilisable par préfixe : a, (a,b), (a,b,c)
Cardinalité / sélectivité
Index utile si :
- filtre réduit fortement le résultat
- ou couvre ORDER BY / JOIN
Index peu utile si :
- colonne faible cardinalité (ex: bool)
=> sauf bitmap/partiel selon moteur
Covering index (include)
Idée :
- l'index contient toutes les colonnes nécessaires
=> éviter lookup table (heap fetch)
Gain :
- lectures I/O réduites
Coût :
- index plus gros, writes plus lents
Chaque index a un coût
| Action | Impact |
|---|---|
| INSERT | maj de tous les index |
| UPDATE | maj index si colonnes concernées |
| DELETE | tombstones/cleanup |
Trop dâindex = writes lents + vacuum/maintenance plus lourde.
Lire un plan (méthode)
1) Identifier l'opération la plus coûteuse (scan/sort/hash)
2) Vérifier cardinalités estimées vs réelles (si dispo)
3) Vérifier accÚs : index scan vs seq scan
4) Regarder joins : nested loop / hash join / merge join
5) Corriger : index / stats / rewrite query
Statistics : le fuel de lâoptimizer
Si stats fausses :
- mauvais join order
- mauvais choix index
Solutions :
- analyze/vacuum
- histogram/extended stats (selon moteur)
Joins : rĂšgles simples
| Join | Quand | PiĂšge |
|---|---|---|
| Nested loop | petit à indexé | explose si gros |
| Hash join | gros datasets | mémoire |
| Merge join | déjà trié | sort coûteux sinon |
Anti-patterns requĂȘtes
- SELECT * sur tables larges.
- Fonctions sur colonnes indexĂ©es (empĂȘche usage index) :
WHERE lower(email)=... - OR multiples sans index adaptés.
- JOIN sans condition (cartésien involontaire).
- N+1 queries (cÎté ORM).
WAL / redo log : la durabilité
Principe :
- écrire d'abord le log (WAL)
- appliquer ensuite aux pages data
Crash recovery :
- rejouer WAL -> état cohérent
Checkpoint :
- limite WAL Ă rejouer
Les perfs write sont souvent limitĂ©es par WAL (fsync), pas par la table elle-mĂȘme.
Buffers & I/O pattern
- buffer cache : garder pages chaudes
- read-ahead : scans
- random I/O : index lookups
- sequential I/O : scans + backups
Tuning :
- mémoire, checkpoint, IO scheduler
- stockage : NVMe, RAID, SAN
Sync vs async
| Mode | Avantage | Inconvénient |
|---|---|---|
| Async | latence basse | perte possible (RPO>0) |
| Sync | RPOâ0 | latence + risque indispo |
RPO/RTO
RPO : combien de données je peux perdre ?
RTO : combien de temps je peux ĂȘtre down ?
Choix architecture = arbitrage business.
Split brain & quorum
Split brain : 2 primaires en mĂȘme temps
=> corruption logique
Prévention :
- leader election (quorum)
- fencing (STONITH)
- consensus store (etcd/raft)
Sharding (scale horizontal)
Sharding = partitionner données sur plusieurs nodes
Défis :
- transactions cross-shard
- joins compliqués
- rebalancing
Souvent :
- commencer par read replicas + caching
- shard seulement si nécessité
Le vrai test dâun backup = restore
Checklist :
- backup full + incr planifiés
- encryption + rotation
- PITR (WAL/redo archives)
- restore automatisé (staging)
- runbook + rĂŽles
âOn a des backupsâ sans test restore = on nâa pas de backups.
Logical vs physical
| Type | Avantage | Inconvénient |
|---|---|---|
| Logical (dump) | portable | lent sur gros volumes |
| Physical | rapide restore | couplé version/format |
| Snapshot | instantané | cohérence dépend intégration |
AuthN/AuthZ
- Auth : qui est l'utilisateur ? (cert, password, IAM)
- AuthZ : que peut-il faire ? (roles, grants)
Principe :
- least privilege
- séparation read/write/admin
Chiffrement : at rest & in transit
- TLS entre app â DB.
- Chiffrement disque / tablespaces.
- Gestion secrets (vault), rotation.
Audit & traçabilité
- journaliser accĂšs admin
- tracer opérations sensibles
- alerter sur anomalies
- conserver logs selon policy
Multi-tenant : piĂšges
- Isolation logique (schemas) vs physique (instances).
- Quotas (CPU/IO) pour éviter noisy neighbor.
- Row-level security si disponible.
Monitoring (minimum vital)
- CPU / RAM / IOPS / latency disk
- connexions (pool saturation)
- locks + deadlocks
- replication lag
- cache hit ratio
- top queries (p95)
Perf : 10 leviers
- Index adaptĂ©s aux requĂȘtes (et pas trop).
- Plans corrects (stats Ă jour).
- Connection pooling (éviter 10k connexions).
- Cache (buffer) dimensionné.
- Batching writes, éviter transactions longues.
- Partitioning si gros volumes.
- Réduire I/O (covering index, compression).
- Eviter N+1 cÎté ORM.
- Workload séparation (read replica/warehouse).
- Hardware/stockage adapté (NVMe/IOPS).
Maintenance : Ă©viter la âsurpriseâ
- vacuum/compaction (selon moteur)
- bloat tracking
- reindex / analyze
- upgrades planifiés (test)
- capacity planning (croissance)
Incident playbook (résumé)
1) Identifier symptĂŽme : latency, errors, locks, disk full
2) Protéger : limiter traffic, read-only, circuit breaker
3) Diagnostiquer : top queries, locks, IO, replication lag
4) Mitiger : kill query, add index, scale read, failover
5) Postmortem : cause -> action (monitoring, code, ops)
Jours 1â7 : cadrage
- Workload : OLTP/OLAP, reads/writes, p95 latency, throughput.
- Données : taille, croissance, access patterns, retention.
- Garanties : ACID, RPO/RTO, multi-region ?
- Sécurité : RBAC, TLS, encryption, audit.
- Ops : équipe, runbooks, budget, tooling.
Jours 8â15 : design & POC
- SchĂ©ma + 10 requĂȘtes critiques.
- Index + contraintes essentielles.
- Tests charge (baseline).
- Plan backup/restore (test restore).
Jours 16â30 : prod minimal
- Mettre réplication + failover (quorum si besoin).
- Mettre monitoring (locks, IO, lag, slow queries).
- Mettre connection pool (app).
- Mettre process dâupgrade (staging, runbook).
- Documenter incidents + postmortems.
Objectif : une base restorable, monitorĂ©e, sĂ©curisĂ©e, et dimensionnĂ©e â avant dâĂȘtre ârapideâ.
DoD (production)
- restore testé (PITR)
- monitoring + alerting
- runbooks incident
- réplication + failover validés
- perf baseline (p95)
- sécurité (TLS, RBAC, secrets)
- plan upgrade/patch
RĂšgles dâor
- Index selon les requĂȘtes, pas selon lâintuition.
- Transactions courtes â moins de locks.
- Backups testĂ©s (restore) â survie.
- Stats Ă jour â plans stables.
- Pool de connexions â DB respire.
Anti-patterns
- DB utilisée comme queue (sans raison).
- âSELECT *â en prod sur tables larges.
- Absence de FK/constraints âpour la perfâ.
- Index partout (writes lents).
- Pas de PITR/restore test.
Checklist incident (express)
1) Disk full ? (WAL/logs)
2) Locks/deadlocks ? (top blockers)
3) CPU / IO saturés ?
4) Replication lag ?
5) Top queries (p95) + plan
6) Pool saturation ?
7) Mitigation : limiter traffic, kill query, add index, failover
Index quick tips
- indexer colonnes de JOIN et WHERE
- composite index : ordre = filtres les plus sélectifs
- covering index si read heavy
- éviter index sur colonnes trÚs low-cardinality
- supprimer index inutilisés (à prouver)
