Be Software Architecture Wise
Be Wise Apps

Read in English · Leer en español · Auf Deutsch lesen

Section 7.2 sur 7.8 · Intermédiaire · 25 min de lecture

Choisir une base de données : relationnelle, documents, clé-valeur, colonnes, graphe et séries temporelles

Leçon vidéo

5 min · narré en anglais, avec sous-titres
Écouter seulement (audio)
Lire la transcription

Une base de données est l’une des parties d’un système les plus difficiles à remplacer. Dans cette leçon, vous allez découvrir ce que chaque type de base de données fait bien, et comment en choisir une sur la base de preuves.

Choisir une base de données, c’est comme choisir des rangements pour une maison. Un classeur à dossiers étiquetés convient aux papiers que l’on recoupe : c’est une base de données relationnelle. Une penderie de tenues complètes convient aux choses que l’on sort ensemble : c’est une base orientée documents. Une rangée de casiers numérotés est le plus rapide quand on connaît le numéro : c’est une base clé-valeur. Et un tableau de liège avec des fils tendus entre des punaises montre qui connaît qui : c’est un graphe. La plupart des maisons ont besoin d’un classeur et d’un ou deux meubles spécialisés, car chaque meuble supplémentaire demande de la place et quelqu’un qui sait s’en servir.

Pour les données métier, le relationnel reste le choix par défaut raisonnable, pour quatre raisons. D’abord, la base de données fait elle-même respecter les règles, par exemple qu’un paiement et ses écritures au grand livre soient validés ensemble. Ensuite, la flexibilité. Vous n’avez pas besoin de connaître toutes les questions futures quand vous concevez le schéma. Troisièmement, la maturité : des décennies d’outils de sauvegarde, de réplication et de supervision, et des ingénieurs qui la connaissent déjà. Quatrièmement, l’étendue. Les systèmes relationnels modernes stockent aussi du JSON, font de la recherche textuelle et trouvent des vecteurs similaires : une seule base bien exploitée couvre donc de nombreux besoins à une échelle modérée.

Chaque famille de bases de données organise les données différemment, et cette forme décide quelles requêtes sont peu coûteuses et lesquelles sont impossibles. Une base relationnelle range des lignes dans des tables à colonnes fixes, reliées par des clés et des jointures. Une base orientée documents conserve chaque enregistrement sous forme de document imbriqué, lu d’un bloc, comme la carte d’un restaurant. L’interroger sous une autre forme est plus difficile. Une base clé-valeur se contente de lire et d’écrire des valeurs par clé. Elle ne regarde jamais à l’intérieur de la valeur : elle est donc extrêmement rapide et facile à répartir sur plusieurs machines. Une base orientée graphe traite les relations comme des enregistrements à part entière, ce qui convient à la détection de fraude et aux recommandations. Une base de séries temporelles ajoute les mesures dans l’ordre chronologique et les interroge par plage. En dessous, trois autres encore. Les bases orientées colonnes larges gèrent des volumes d’écriture massifs, avec une table conçue pour chaque requête. Les moteurs de recherche classent le texte par pertinence. Les bases vectorielles trouvent les correspondances les plus proches par le sens.

Alors, comment choisir ? Par jeu de données, et non une seule fois pour tout le système. Commencez par la forme des données et les requêtes qui porteront sur elles. Puis la cohérence. Les soldes, les stocks et les réservations exigent des transactions. Pour des mentions « j’aime », quelques secondes de retard sont sans conséquence. Puis l’échelle, mesurée plutôt que devinée. Une base qui s’étend jusqu’aux pétaoctets n’apporte rien pour cinquante gigaoctets. Puis l’exploitation et les compétences de l’équipe. Qui va la sauvegarder, la mettre à niveau et la déboguer à trois heures du matin ? Une bonne habitude : notez les requêtes les plus importantes et leurs latences cibles avant de choisir, et testez avec des volumes réalistes, pas avec mille lignes sur un ordinateur portable.

Passons à la plateforme de livraison de repas. Au pic, elle reçoit environ trois cents commandes par minute, compte vingt mille livreurs en ligne et traite deux mille recherches par seconde. L’équipe exploite déjà bien PostgreSQL. Les commandes et les paiements exigent des transactions et des règles strictes : ils vont donc dans PostgreSQL. Aucun argument pour autre chose. Les cartes ont une forme imbriquée, mais une base orientée documents ajouterait une seconde technologie sans satisfaire aucune exigence que PostgreSQL ne satisfait pas. Les positions des livreurs sont différentes : cinq mille écritures par seconde, et seule la dernière position compte, pendant environ trente secondes. Une base clé-valeur en mémoire avec expiration convient. La recherche reçoit un moteur de recherche, et l’analytique un entrepôt de données, tous deux alimentés par les systèmes de référence et reconstructibles à partir d’eux. Une base orientée graphe, une base de séries temporelles distincte et le SQL distribué ont tous été rejetés. Aucune exigence mesurée n’en a encore besoin.

Voici le résultat. Commandes et Cartes écrivent chacun dans leur propre base PostgreSQL : ce sont les deux seuls systèmes de référence. Les positions des livreurs vivent en mémoire et expirent au bout de trente secondes. Les perdre au redémarrage coûte un cycle de mise à jour. Le moteur de recherche est un index dérivé des cartes, alimenté par capture des données modifiées avec quelques secondes de retard. Et l’entrepôt de données a quelques heures de retard, par conception. Tout, sauf les deux systèmes de référence, est dérivé et peut être reconstruit.

Utiliser des stockages différents pour des données différentes s’appelle la persistance polyglotte. Elle découle naturellement de la base de données par service. Mais chaque type de base supplémentaire exige sa propre expertise, ses sauvegardes, sa supervision, ses mises à niveau et ses connaissances d’astreinte. Pour une petite équipe, cinq bases de données peuvent demander plus d’efforts que le produit. Dans son essai de deux mille quinze, Choose Boring Technology, Dan McKinley a soutenu qu’une entreprise ne dispose que de quelques jetons d’innovation pour des outils peu familiers. Justifiez donc chaque nouveau stockage par une exigence que les autres ne peuvent pas satisfaire. Et une erreur courante : laisser un index de recherche ou un cache devenir la seule copie de certaines données.

La section complète compare chaque famille et ajoute un guide de décision étape par étape. Ensuite, dans la section sept point trois, nous verrons les transactions et l’isolation. À très vite.

Ce qu’il faut savoir

Pourquoi ce choix mérite de l’attention

Une base de données est l’un des composants les plus difficiles à remplacer. Les applications sont réécrites autour de leurs données, et non l’inverse ; migrer des téraoctets de données vivantes pendant que l’activité continue peut prendre un an. Le choix du stockage est donc une porte à sens unique qui mérite une décision explicite, alors que beaucoup d’équipes le font par habitude ou par effet de mode.

Le chapitre 0 a présenté les bases de données relationnelles et les quatre familles NoSQL. Cette section va plus loin : ce que chaque famille fait vraiment bien, les catégories plus récentes (séries temporelles, recherche, vectorielle et SQL distribué), comment choisir sur la base de preuves plutôt que d’enthousiasme, et ce que coûte l’exploitation de plusieurs types à la fois. La réponse est rarement une seule base de données pour tout, et presque jamais une base différente pour chaque service.

Les modèles de données en un coup d’œil

Cinq modèles de données côte à côte : lignes de tables, documents imbriqués, valeurs opaques sous des clés, nœuds reliés par des arêtes, points horodatésRelationnelcmde | client | £1001 | 42 | 23.501002 | 77 | 11.00col. fixes, cléset jointuresDocument{ menu: 9,items: [{name, price, options:[..]}] }imbriqué, lud’un blocClé-valeurc:17blobc:18blobs:9ablobget et put par cléGrapherelations aupremier planSéries temp.ajout par date,lu par plageCol. largeslignes / clé de partitioncol. triées par ligneMoteur de rechercheindex inversé :mots vers documentsVectorielleembeddings : chercherles voisins proches
Chaque famille organise les données différemment, et cette forme décide quelles requêtes sont peu coûteuses et lesquelles sont impossibles.

Le relationnel : toujours le choix par défaut, pour de bonnes raisons

Une base de données relationnelle stocke les données dans des tables dotées de types, de clés et de contraintes déclarés, et répond à des requêtes SQL déclaratives, une idée issue de l’article d’Edgar Codd de 1970. Cinquante ans plus tard, elle reste le choix par défaut raisonnable pour les données métier, pour quatre raisons. D’abord, les transactions et les contraintes : la base de données garantit elle-même qu’un paiement et ses écritures au grand livre sont validés ensemble et qu’aucune commande ne pointe vers un client inexistant, si bien que ces règles n’ont pas à être réimplémentées, imparfaitement, dans chaque service. Ensuite, la flexibilité des requêtes : vous n’avez pas besoin de connaître toutes les questions futures quand vous concevez le schéma ; un nouveau rapport est une nouvelle requête, pas une nouvelle table. Troisièmement, la maturité : des décennies d’outils de sauvegarde, de réplication, de supervision, de migration et de diagnostic des performances, et des ingénieurs qui la connaissent déjà. Quatrièmement, l’étendue : les systèmes relationnels modernes stockent et indexent du JSON (le type jsonb de PostgreSQL), prennent en charge la recherche en texte intégral, les données géospatiales (PostGIS), le partitionnement temporel et la similarité vectorielle (l’extension pgvector), si bien qu’une seule base bien exploitée peut couvrir de nombreux besoins à une échelle modérée.

Les vraies limites sont précises. Les écritures sur un primaire unique sont bornées par une seule machine ; les très grandes tables exigent un partitionnement soigneux ; les modifications de schéma sur des tables énormes demandent de la technique (évolution des schémas) ; et certains schémas d’accès, comme les parcours de graphe profonds ou la recherche textuelle classée par pertinence, sont bien mieux servis par des moteurs spécialisés. Un seul serveur moderne doté de disques SSD rapides peut traiter des milliers de transactions par seconde et des téraoctets de données, ce qui couvre les besoins de la plupart des organisations.

Les familles non relationnelles

Une base de données orientée documents stocke chaque enregistrement sous forme de document autonome, généralement en JSON ou dans une forme binaire de celui-ci. Elle convient aux agrégats au sens de la conception pilotée par le domaine : des choses lues et écrites d’un bloc, comme la carte d’un restaurant avec ses rubriques, ses plats et ses groupes d’options. Lire un document, c’est une seule recherche, sans jointure. Le compromis apparaît quand les mêmes données doivent être interrogées sous une autre forme (tous les plats contenant des arachides, sur toutes les cartes) ou modifiées dans de nombreux documents à la fois ; les jointures et les transactions multidocuments existent dans les produits modernes, mais elles sont plus coûteuses et moins naturelles qu’en SQL.

Une base clé-valeur est un dictionnaire distribué : on range une valeur sous une clé, on la récupère. Comme la base ne regarde jamais à l’intérieur des valeurs, elle peut être extrêmement rapide et facile à partitionner. Redis et son fork open source Valkey conservent les données en mémoire avec une persistance optionnelle, et ajoutent des structures de données (ensembles triés, flux, index géospatiaux) et l’expiration ; Amazon DynamoDB est une base clé-valeur et documents managée et partitionnée. Elles conviennent aux sessions, aux paniers, aux compteurs de limitation de débit, aux feature flags, aux caches et à la dernière position de chaque livreur.

Une base orientée colonnes larges (wide-column store) (Bigtable, Apache Cassandra, ScyllaDB, HBase) regroupe les lignes par clé de partition et les stocke triées par une clé de clustering au sein de chaque partition. Elle est conçue pour des volumes d’écriture massifs répartis sur de nombreux nœuds et centres de données. La discipline qu’elle exige est la modélisation orientée requêtes : vous concevez une table par requête, en dupliquant librement les données, car les requêtes qui ne partent pas de la clé de partition sont coûteuses, voire impossibles. Cassandra descend en partie de l’article Dynamo d’Amazon de 2007, dont les idées de réplication apparaissent dans deux sections plus loin.

Une base de données orientée graphe stocke des nœuds et des relations comme des enregistrements à part entière, et répond à des requêtes de parcours comme les clients à trois sauts au plus de ce réseau de fraude sans les jointures en cascade qui rendent ces requêtes lentes en SQL. Cypher, de Neo4j, est le langage de requête le plus connu, et l’ISO a publié en 2024 un langage de requête de graphe normalisé, GQL (ISO/IEC 39075). Les graphes excellent pour la détection de fraude, les recommandations et l’analyse de réseaux, et font généralement un mauvais stockage principal pour les données métier transactionnelles.

Séries temporelles, recherche et bases vectorielles

Une base de données de séries temporelles est optimisée pour des mesures horodatées qui arrivent dans l’ordre et sont rarement modifiées : métriques, relevés de capteurs, prix, historique de positions. Elle compresse fortement, partitionne par période, sous-échantillonne les données anciennes (garder chaque point pendant une semaine, des moyennes par minute pendant un an) et supprime à peu de frais les données expirées en éliminant des partitions temporelles entières. Parmi les exemples figurent InfluxDB, Prometheus (pour la supervision) et TimescaleDB, qui est une extension de PostgreSQL et montre qu’une base relationnelle peut souvent s’étendre pour convenir.

Un moteur de recherche comme Elasticsearch, OpenSearch ou Apache Solr (tous construits sur la bibliothèque Apache Lucene) maintient un index inversé des mots vers les documents qui les contiennent, avec une analyse du texte (racinisation, synonymes, tolérance aux fautes de frappe) et un classement par pertinence. Il répond à ramen vegan près de chez moi en quelques millisecondes. Il ne devrait presque jamais être un système de référence : les index sont rafraîchis en quasi temps réel plutôt que de façon transactionnelle, et la conception habituelle alimente le moteur de recherche à partir de la base de données propriétaire et reconstruit l’index à partir d’elle en cas de besoin.

Une base de données vectorielle stocke des embeddings, des listes de nombres qui représentent le sens de textes, d’images ou de produits, et trouve les éléments les plus proches d’un vecteur de requête. Une recherche exacte compare la requête à chaque vecteur ; ces bases utilisent donc des index de recherche approximative des plus proches voisins, comme les graphes HNSW, qui sacrifient un peu de rappel au profit de la vitesse. Elles alimentent la recherche sémantique, les recommandations et la récupération d’informations pour les grands modèles de langage, traitée dans la génération augmentée par récupération. Des produits dédiés existent (Milvus, Qdrant, Pinecone, Weaviate), mais pour des millions plutôt que des milliards de vecteurs, une extension d’une base existante comme pgvector suffit souvent.

SQL distribué

Les bases de données SQL distribuées, parfois appelées NewSQL (un terme forgé par l’analyste Matthew Aslett en 2011), conservent le modèle relationnel, SQL et les transactions ACID, mais partitionnent et répliquent automatiquement les données sur de nombreux nœuds, souvent dans plusieurs régions. Google Spanner, décrit dans un article de l’OSDI de 2012, utilise des horloges étroitement synchronisées (son API TrueTime, adossée au GPS et à des horloges atomiques) pour offrir des transactions cohérentes à l’échelle mondiale. CockroachDB, YugabyteDB et TiDB proposent des modèles similaires sur du matériel ordinaire ; CockroachDB utilise par défaut l’isolation sérialisable.

Le prix à payer tient à la physique et à l’exploitation. Une transaction qui doit être approuvée par des répliques dans plusieurs régions attend un aller-retour de consensus : les écritures d’une seule ligne prennent donc de quelques millisecondes à des dizaines ou des centaines de millisecondes, au lieu de bien moins d’une milliseconde. La planification des requêtes entre partitions est plus subtile, les coûts sont plus élevés, et moins d’ingénieurs connaissent les modes de défaillance. Le SQL distribué est le bon outil quand vous avez réellement besoin de transactions relationnelles au-delà de la capacité d’un seul serveur ou entre régions (un grand livre mondial de paiements, une banque multirégion), et un outil coûteux quand un seul primaire PostgreSQL avec des répliques suffirait.

Comparaison des familles de bases de données

FamilleModèle de données et requêtesPoints fortsFaiblessesExemples
RelationnelTables, clés, SQL avec jointures et agrégatsTransactions et contraintes, requêtes ad hoc flexibles, outils matures, largement connuesLimite de mise à l’échelle verticale pour les écritures sur un nœud ; schéma rigide qui exige des migrationsPostgreSQL, MySQL, SQL Server, Oracle
DocumentDocuments de type JSON, requêtes sur les champs et les valeurs imbriquéesAdaptation naturelle aux agrégats lus d’un bloc ; structure flexibleJointures et transactions entre documents plus faibles ou plus coûteuses ; schéma imposé dans le codeMongoDB, Couchbase, Firestore
Clé-valeurValeur opaque par clé ; get, put, deleteTrès rapides, simples, faciles à partitionnerAucune requête portant sur les valeurs ; modélisation à la charge de l’applicationRedis, Valkey, DynamoDB, etcd
Col. largesLignes regroupées par clé de partition, triées par clé de clusteringDébit d’écriture énorme, mise à l’échelle horizontale linéaire, multi-centres de donnéesTables construites par requête ; jointures et requêtes ad hoc limitéesApache Cassandra, ScyllaDB, HBase, Bigtable
GrapheNœuds et arêtes dotés de propriétés ; requêtes de parcoursRequêtes sur des relations à plusieurs sautsPlus difficiles à partitionner ; écosystème plus restreintNeo4j, Amazon Neptune
Séries temp.Points horodatés, étiquettes ; requêtes par plage et agrégationsCompression, rétention, sous-échantillonnagePeu adaptées aux mises à jour générales et aux relationsInfluxDB, TimescaleDB, Prometheus
Moteur de rechercheIndex inversé sur des documents ; requêtes textuelles classées par pertinenceRecherche en texte intégral, correspondance approximative, facettesPas un système de référence ; rafraîchissement en quasi temps réelElasticsearch, OpenSearch, Apache Solr
VectorielleEmbeddings ; recherche approximative des plus proches voisinsSimilarité sémantique pour la récupération d’informations et les recommandationsRésultats approximatifs ; coût de construction de l’index ; outils encore jeunespgvector, Milvus, Qdrant, Pinecone
SQL distribuéModèle relationnel, SQL, partitionné et répliquéTransactions et SQL avec mise à l’échelle horizontale et résistance à la perte d’une régionLatence d’écriture, coût et complexité opérationnelle plus élevésGoogle Spanner, CockroachDB, YugabyteDB, TiDB

Choisir : les critères qui comptent

Choisissez par jeu de données, pas par système. Pour chaque jeu de données important, rassemblez des preuves sur six critères et consignez la décision dans un ADR.

Forme des données. Sont-elles naturellement tabulaires avec de nombreuses relations, un agrégat autonome, un réseau, une série temporelle, du texte libre ou des vecteurs ? Schémas d’accès. Quelles requêtes s’exécutent, à quelle fréquence, avec quels objectifs de latence, et combien sont ad hoc ? Lectures ou écritures majoritaires ? Toujours par clé, ou selon de nombreux attributs ? Besoins de cohérence. Les données exigent-elles des transactions sur plusieurs éléments et des contraintes (soldes, stocks, réservations), ou quelques secondes de retard sont-elles sans conséquence (mentions « j’aime », recommandations) ? Voir les modèles de cohérence. Échelle. Volume de données actuel et prévu, écritures par seconde et croissance, mesurés et non devinés ; une base qui s’étend jusqu’aux pétaoctets n’apporte rien pour 50 gigaoctets. Exploitation. Qui va l’exploiter : sauvegardes, mises à niveau, failover, supervision, correctifs de sécurité ? Existe-t-il un service managé dans votre cloud, et combien coûte-t-il à vos volumes ? Compétences de l’équipe. Que connaît déjà l’équipe assez bien pour déboguer à 3 heures du matin ? Une technologie mal connue comporte des modes de défaillance inconnus.

Deux habitudes améliorent le choix. Notez les cinq ou dix requêtes les plus importantes avec leurs latences cibles avant de choisir, et testez le candidat avec des volumes de données réalistes ; bien des déceptions viennent d’une base évaluée sur un ordinateur portable avec mille lignes. Et séparez le système de référence des stockages dérivés : le système de référence exige les garanties les plus fortes et la technologie la plus prudente, tandis que les stockages dérivés (index de recherche, caches, modèles de lecture) peuvent être spécialisés précisément parce qu’ils peuvent être reconstruits.

Guide de décision

Guide de décision : quel type de stockage pour ces données ?

Posez ces questions pour chaque jeu de données (et non une seule fois pour tout le système), dans cet ordre. Arrêtez-vous au premier oui qui convient ; si vous arrivez au bout, le choix relationnel par défaut s’applique.

  1. Ces données sont-elles un système de référence qui exige des transactions sur plusieurs lignes, des contraintes ou des requêtes ad hoc (commandes, paiements, comptes, réservations) ?
    OuiUtilisez une base de données relationnelle. Ne cherchez plus loin que si vous pouvez montrer qu’elle ne peut pas satisfaire une exigence mesurée d’échelle ou de latence.
    NonContinuez : les données sont peut-être dérivées, spécialisées ou d’un volume extrêmement élevé.
  2. S’agit-il d’une copie dérivée d’un système de référence pour servir une requête particulière (recherche en texte intégral, recommandations, recherche par similarité) ?
    OuiUtilisez le stockage spécialisé pour cette requête (moteur de recherche, graphe ou index vectoriel), alimenté par le système de référence et reconstructible à partir de lui.
    NonContinuez.
  3. Les données sont-elles lues et écrites élément par élément, par clé, sans requête portant sur plusieurs éléments (sessions, paniers, dernières positions, feature flags) ?
    OuiUne base clé-valeur convient, souvent en mémoire avec expiration. Décidez de ce qui se passe si elle est perdue.
    NonContinuez.
  4. S’agit-il d’un flux, essentiellement en ajout, de mesures horodatées interrogées par plage temporelle (métriques, relevés de capteurs, historique de positions) ?
    OuiUne base de données de séries temporelles, ou des tables partitionnées par période dans une base relationnelle pour des volumes modérés.
    NonContinuez.
  5. Le volume d’écriture ou la taille des données dépassera-t-il ce qu’un seul serveur bien réglé peut gérer, avec un accès toujours par une clé connue ?
    OuiUne base orientée colonnes larges ou clé-valeur conçue pour le partitionnement (Cassandra, DynamoDB), avec des tables conçues autour des requêtes.
    NonContinuez.
  6. Avez-vous besoin de transactions relationnelles et de SQL entre régions ou au-delà de la capacité d’un seul serveur ?
    OuiEnvisagez le SQL distribué (Spanner, CockroachDB, YugabyteDB), en acceptant une latence d’écriture et un coût d’exploitation plus élevés.
    NonRestez sur le choix relationnel par défaut, et réexaminez-le quand une exigence mesurée change.

La persistance polyglotte et son coût

La persistance polyglotte consiste à utiliser des technologies de stockage différentes pour des données différentes au sein d’un même système, choisies selon l’usage qui est fait des données. Martin Fowler a popularisé le terme en 2011, en attribuant à Scott Leberknight sa première utilisation. Elle découle naturellement de la base de données par service : chaque propriétaire peut choisir le bon outil.

Le coût est facile à sous-estimer. Chaque type de base de données supplémentaire exige sa propre expertise, ses procédures de sauvegarde et de restauration, sa supervision, sa planification de la capacité, son durcissement de sécurité, son cycle de mises à niveau et ses connaissances d’astreinte. Les données circulent désormais entre les stockages : il faut donc des pipelines (CDC, événements) et raisonner sur le retard et les défaillances de chacun. La cohérence entre stockages est au mieux une cohérence à terme. Pour une petite équipe, cinq bases de données peuvent demander plus d’efforts que le produit. Une règle raisonnable consiste à justifier chaque nouveau stockage par une exigence que les stockages existants ne peuvent manifestement pas satisfaire, et à préférer des services managés pour les stockages spécialisés.

Exemple commenté

Exemple commenté : les stockages de la plateforme de livraison de repas

La plateforme opère dans 40 villes. Au pic du soir, elle reçoit environ 300 commandes par minute, compte 20 000 livreurs en ligne, sert 50 000 cartes de restaurants et fait l’objet d’environ 2000 recherches par seconde. L’équipe de 35 ingénieurs exploite déjà bien PostgreSQL.

Commandes et paiementsSystème de référence ; transactions sur plusieurs lignes (commande, lignes, autorisation de paiement) ; règles strictes ; requêtes ad hoc du support. Environ 5 nouvelles commandes par seconde au pic (quelques dizaines d’écritures de lignes). PostgreSQL, avec une réplique pour le failover. Aucun argument pour autre chose.
CartesLectures majoritaires, hiérarchiques (rubriques, plats, groupes d’options), modifiées par les restaurants quelques milliers de fois par jour. Les prix doivent être exactement ceux qu’enregistre la commande. PostgreSQL, avec un noyau relationnel (restaurant, plat, prix) et du jsonb pour les options variables. Une base orientée documents conviendrait à la forme des données, mais ajouterait une seconde technologie sans satisfaire aucune exigence que PostgreSQL ne satisfait pas.
Positions des livreurs20 000 livreurs qui envoient chacun une position toutes les 4 secondes, cela fait 5000 écritures par seconde, dont seule la dernière par livreur compte pour l’affectation, et seulement pendant environ 30 secondes. Base clé-valeur en mémoire (Redis ou Valkey) avec requêtes géospatiales et expiration au bout de 30 secondes. La perdre au redémarrage coûte un cycle de mise à jour. Un échantillon de points (disons un toutes les 30 secondes) part vers l’entrepôt de données pour l’analytique.
Recherche de restaurants et de platsTexte intégral, tolérance aux fautes de frappe, filtres par lieu, horaires d’ouverture et étiquettes alimentaires, classement par pertinence. Moteur de recherche (OpenSearch), alimenté à partir de la base des cartes par capture des données modifiées, et reconstructible à partir d’elle. Accepte quelques secondes de retard après une modification de carte.
AnalytiqueChiffre d’affaires hebdomadaire, délais de livraison par ville, taux d’utilisation des livreurs : de gros parcours et agrégats sur des mois d’historique. Entrepôt de données dans le cloud, alimenté par CDC et par des événements, avec quelques heures de retard par conception. Voir analytique et streaming.
RejetésUne base orientée graphe pour les recommandations (pas encore nécessaire ; à réexaminer sur preuves), une base de séries temporelles distincte pour les positions (l’échantillon de l’entrepôt répond aux questions posées) et le SQL distribué (les commandes de toute la plateforme, environ 5 par seconde au pic, tiennent largement sur un seul primaire ; il n’y a aucune exigence de transaction multirégion).

Le résultat : deux systèmes de référence sur une technologie bien connue, plus trois stockages spécialisés et dérivés. Chaque technologie supplémentaire est justifiée par une exigence que le choix par défaut ne peut pas satisfaire : 5000 écritures éphémères par seconde, et une recherche textuelle classée par pertinence.

Noter d’abord les requêtes et les chiffres a rendu les décisions presque évidentes, et a donné à l’équipe une trace des hypothèses à réexaminer quand les volumes changeront.

Le paysage de stockage qui en résulte

Stockages de la plateforme de livraison de repas : commandes et paiements dans PostgreSQL (système de référence), cartes dans PostgreSQL en JSONB, positions des livreurs dans une base clé-valeur en mémoire, moteur de recherche et entrepôt de données alimentés par CDCCommandesCartesSuivi livreursAPI rech.PostgreSQLcmdes, paiementssystème de réf.PostgreSQLcartes en JSONBsystème de réf.KV en mémoiredernière positionTTL 30 sMoteur de rech.index dérivédes cartesCDC (quelques secondes de retard)échantillon de pointsEntrepôtanalytique, en différéCDCDeux systèmes de référence ; tout le reste est dérivé et reconstructible
Les commandes et les cartes ont chacune un seul système de référence relationnel ; l’index de recherche, l’entrepôt de données et le stockage des positions sont dérivés ou jetables.

Erreurs courantes

Les choix dictés par le CV : choisir un stockage parce qu’il est nouveau ou parce qu’une grande entreprise l’utilise, sans l’exigence qui le justifiait chez elle. Choisir pour une échelle imaginaire : concevoir pour un milliard d’utilisateurs un produit qui en a mille, et payer la taxe de complexité dès le premier jour. Utiliser un stockage dérivé comme système de référence : un index de recherche ou un cache qui devient la seule copie des données, avec une durabilité plus faible que personne ne l’imaginait. Ignorer le côté requêtes : choisir une base clé-valeur ou orientée colonnes larges, puis découvrir que le métier a besoin de rapports ad hoc et de filtres qu’elle ne peut pas fournir. Sous-estimer l’exploitation : oublier que quelqu’un devra la restaurer à partir d’une sauvegarde, la mettre à niveau sans interruption de service et la diagnostiquer sous charge. Enfin, traiter le choix comme une vérité définitive : consignez les hypothèses (volumes, requêtes, compétences de l’équipe) pour que la décision puisse être réexaminée quand elles changent.

Vérifiez votre compréhension

Pourquoi un moteur de recherche ne devrait-il généralement pas être le système de référence ?

Son index est rafraîchi en quasi temps réel plutôt que de façon transactionnelle, et ses garanties de durabilité sont plus faibles ; il devrait être alimenté à partir de la base de données propriétaire et reconstruit à partir d’elle en cas de besoin.

Donnez deux signes indiquant qu’une base orientée colonnes larges peut être un bon choix.

Un volume d’écriture très élevé, au-delà d’un seul serveur, et un accès qui part toujours d’une clé de partition connue, de sorte que les tables peuvent être conçues par requête.

Que représente un « jeton d’innovation » dans l’essai de McKinley ?

L’une des rares occasions dont dispose une entreprise pour adopter une technologie peu familière, chacune apportant des modes de défaillance inconnus et un coût opérationnel durable.

Quand le SQL distribué vaut-il son coût ?

Quand vous avez besoin de transactions relationnelles et de SQL au-delà de la capacité d’un seul serveur ou entre régions, comme pour un grand livre mondial ; pas quand un seul primaire avec des répliques satisfait les exigences.

Suivant · 7.3TransactionsCe que garantit réellement ACID, les anomalies que permettent les niveaux d’isolation, comment fonctionnent le MVCC et l’isolation par instantané, pourquoi les noms des niveaux sont trompeurs, et quand utiliser le verrouillage, les vérifications de version ou les transactions sérialisables.Continuer →

Sources et lectures complémentaires

Une question sur cette section ? ArchitectBot, l’assistant d’étude IA du cours, répond d’abord à partir du cours.

Demander : « Notre équipe veut utiliser MongoDB pour un nouveau service de commandes parce que c’est plus flexible. Comment décider si c’est une bonne idée par rapport à PostgreSQL ? »