Au-delà des bases de données#

Les bases de données, qu’elles soient relationnelles ou NoSQL, répondent à un besoin fondamental : stocker des données structurées et les retrouver par des requêtes. Mais dans un système réel, les données vivent aussi ailleurs. Elles sont indexées pour la recherche en texte intégral, archivées dans des lacs de données sous forme d’objets, répliquées entre appareils qui ne sont pas toujours connectés, ou inscrites dans des registres immuables où chaque modification est tracée à jamais. Ces paradigmes ne remplacent pas les bases de données : ils les complètent, chacun répondant à un besoin que les bases traditionnelles servent mal.

La recherche et l’indexation#

La recherche d’information (information retrieval) est un domaine qui précède l’informatique moderne. Dès les années 1960, Gerard Salton et son équipe à Cornell développent le système SMART (System for the Mechanical Analysis and Retrieval of Text), qui introduit les concepts fondamentaux encore utilisés aujourd’hui : la pondération des termes (TF-IDF), le modèle vectoriel de similarité entre documents, et l’évaluation de la pertinence par précision et rappel. Le mécanisme central est l’index inversé (inverted index) : plutôt que de parcourir chaque document pour y chercher un mot, on construit à l’avance une table qui associe chaque terme à la liste des documents qui le contiennent, exactement comme l’index à la fin d’un livre. Google, à sa fondation en 1998, n’est fondamentalement rien d’autre qu’un index inversé à l’échelle du web, enrichi par l’algorithme PageRank pour classer les résultats.

Dans le monde du logiciel d’entreprise, Elasticsearch (2010, Shay Banon) et Apache Solr, tous deux construits sur la bibliothèque Apache Lucene, sont les moteurs de recherche les plus utilisés. Ils offrent la tokenisation (découpage du texte en termes), la racinisation (stemming : « chercher », « cherche », « cherché » → « cherch »), le classement par pertinence (TF-IDF, BM25) et la recherche par facettes. Elasticsearch est aussi au cœur de la pile ELK (Elasticsearch, Logstash, Kibana) utilisée pour l’analyse de logs, qu’on retrouvera dans le module 5.

En Python, on peut illustrer le concept d’index inversé avec un simple dictionnaire, ce qui permet de comprendre le principe avant de passer à des systèmes distribués :

Le stockage objet#

Le stockage objet (object storage) est né d’un constat simple : les systèmes de fichiers traditionnels, avec leur hiérarchie de répertoires, ne passent pas à l’échelle du web. Quand on doit stocker des milliards de photos, de vidéos ou de fichiers de logs, la métaphore du dossier et du sous-dossier devient un goulot d’étranglement. Amazon S3 (Simple Storage Service), lancé en mars 2006, a proposé une alternative radicale : un espace de noms plat (flat namespace) où chaque objet est identifié par une clé unique (qui peut ressembler à un chemin, comme rapports/2025/ventes-q1.csv, mais qui n’est qu’une chaîne de caractères). Chaque objet contient les données brutes (blob), des métadonnées descriptives et sa clé d’identification. L’API de S3 est devenue un standard de facto, implémenté par des alternatives open source comme MinIO.

Dans l’architecture des systèmes de données, le stockage objet joue souvent le rôle de data lake (lac de données) : un réservoir brut où l’on déverse tout (logs, exports CSV, images, modèles entraînés) sans imposer de structure a priori. C’est l’opposé du data warehouse (entrepôt de données) vu dans la section précédente, où les données sont nettoyées et structurées selon un schéma rigide. Le pattern typique est de stocker les données brutes dans un lac (S3, MinIO), puis de les extraire, transformer et charger (ETL) vers un entrepôt orienté colonnes pour l’analyse. Cette complémentarité illustre un thème récurrent : il n’y a pas un seul bon endroit pour les données, mais plusieurs, chacun optimisé pour un usage différent.

En Python, on peut illustrer les concepts fondamentaux du stockage objet (espace de noms plat, métadonnées, opérations CRUD par clé) avec un simple dictionnaire :

Les données répliquées et les CRDTs#

Jusqu’ici, on a implicitement supposé que les données vivent dans un seul endroit faisant autorité : un serveur de base de données, un bucket S3, un moteur de recherche. Mais que se passe-t-il quand les données doivent exister simultanément sur plusieurs appareils qui ne sont pas toujours connectés ? C’est le défi de l’édition collaborative en temps réel (Google Docs, Figma) et des applications offline-first (qui fonctionnent hors ligne et se synchronisent plus tard). Le problème fondamental est la convergence : si Alice et Bob modifient chacun leur copie locale des mêmes données, comment garantir qu’après synchronisation, ils auront le même résultat, quel que soit l’ordre dans lequel les modifications arrivent ?

La réponse théorique est venue en 2011, quand Marc Shapiro, Nuno Preguiça, Carlos Baquero et Marek Zawirski ont formalisé les CRDT (Conflict-free Replicated Data Types), des structures de données mathématiquement conçues pour que la fusion de modifications concurrentes soit toujours possible sans conflit. L’intuition est élégante : on conçoit des opérations qui sont commutatives (l’ordre n’importe pas) et idempotentes (appliquer deux fois donne le même résultat). Un G-Counter (compteur croissant), par exemple, donne à chaque nœud son propre compteur ; la fusion prend le maximum de chaque compteur, et la valeur globale est la somme. Peu importe l’ordre de synchronisation, le résultat est toujours correct. Martin Kleppmann, l’auteur de Designing Data-Intensive Applications, travaille activement sur ce sujet : il est l’un des créateurs d’Automerge, une bibliothèque CRDT pour l’édition collaborative. Yjs est l’autre bibliothèque de référence dans ce domaine.

En Python, on peut implémenter deux CRDTs fondamentaux pour illustrer comment la convergence automatique fonctionne :

Les registres immuables et la blockchain#

Un ledger (grand livre) est un registre chronologique et immuable de transactions, exactement comme le grand livre comptable utilisé depuis des siècles, où chaque écriture est datée, signée et ne peut être ni effacée ni modifiée après coup. En informatique, l’immuabilité est une propriété puissante : plutôt que de mettre à jour un solde en écrasant l’ancienne valeur (comme dans une base de données classique), un registre immuable conserve l’historique complet de toutes les opérations, et l’état courant se déduit en rejouant la séquence des transactions. C’est le principe de la comptabilité en partie double, mais c’est aussi celui de l’event sourcing, un pattern architectural décrit par Martin Fowler où l’on stocke les événements plutôt que l’état courant. Git, d’ailleurs, fonctionne exactement sur ce principe : chaque commit est un événement immuable, et l’état du code à un instant donné se reconstitue en rejouant l’historique.

La blockchain pousse cette idée un cran plus loin en la rendant distribuée et résistante à la falsification. Les transactions sont regroupées en blocs, chaque bloc contenant le hash cryptographique du bloc précédent, formant une chaîne dont toute modification rétroactive serait immédiatement détectable. Le livre blanc de Satoshi Nakamoto (2008), qui a introduit Bitcoin, a montré qu’il était possible de maintenir un tel registre sans autorité centrale, en utilisant un mécanisme de consensus (proof of work). Au-delà des cryptomonnaies, le concept de registre immuable avec vérification cryptographique trouve des applications en traçabilité (chaînes d’approvisionnement), en audit financier et en certification de documents. Amazon QLDB offre un ledger centralisé (sans consensus distribué) avec vérification cryptographique, utile quand on veut l’immuabilité sans la complexité d’une blockchain.

En Python, on peut implémenter un mini-ledger avec chaînage cryptographique pour illustrer les principes fondamentaux :

Le web sémantique : une grande ambition inachevée#

Au début des années 2000, Tim Berners-Lee, l’inventeur du World Wide Web, a proposé une vision ambitieuse : le web sémantique. L’idée était de transformer le web, conçu pour être lu par des humains, en un réseau de données structurées lisibles par des machines. Plutôt que de publier des pages HTML dont le contenu n’est compréhensible que visuellement, on décrirait les données avec des formats standardisés (RDF, OWL) et on les relierait entre elles par des identifiants universels (URI), créant un immense graphe de connaissances interrogeable par un langage de requêtes dédié (SPARQL). La promesse était séduisante : un agent logiciel pourrait, par exemple, trouver automatiquement un médecin disponible près de chez vous en croisant des données médicales, géographiques et d’agenda, toutes publiées dans des formats interopérables.

Dans la pratique, le web sémantique n’a jamais atteint la masse critique espérée. Les standards RDF et OWL se sont avérés complexes à maîtriser pour les développeurs ordinaires, et le coût d’annotation des données existantes était prohibitif. Publier une page HTML est simple ; la décrire dans un graphe RDF avec des ontologies formelles demande un effort considérable pour un bénéfice souvent incertain. Le web “réel” a évolué dans une direction différente : plutôt que des données sémantiquement riches et décentralisées, ce sont les grandes plateformes centralisées (Google, Facebook, Amazon) qui ont structuré l’information, chacune dans ses propres formats propriétaires. Le web sémantique est devenu un cas d’étude intéressant en génie logiciel : une architecture techniquement élégante qui n’a pas survécu au contact avec les réalités économiques et la friction d’adoption. C’est une illustration du principe YAGNI à l’échelle d’un écosystème : la complexité anticipée n’a pas trouvé preneur.

Certaines idées du web sémantique ont toutefois survécu sous des formes plus pragmatiques. Schema.org, lancé en 2011 par Google, Microsoft, Yahoo et Yandex, propose un vocabulaire commun pour annoter les pages web avec des métadonnées structurées : le type d’un contenu (recette, événement, produit, personne), ses propriétés et ses relations. Ces annotations, encodées en JSON-LD (JSON for Linked Data), sont invisibles pour l’utilisateur mais exploitées par les moteurs de recherche pour afficher des résultats enrichis (les “rich snippets” de Google : étoiles de notation, horaires, prix). JSON-LD a réussi là où RDF avait échoué : il s’intègre naturellement dans les pratiques existantes des développeurs web, puisqu’il s’agit simplement de JSON avec quelques conventions supplémentaires. Le projet Wikidata, la base de connaissances structurée de Wikipédia, est probablement la réalisation la plus fidèle de la vision originale du web sémantique, avec plus de 100 millions d’éléments reliés entre eux dans un graphe ouvert et interrogeable. L’héritage du web sémantique est donc réel, mais il a pris une forme que ses concepteurs n’avaient pas tout à fait anticipée : des standards légers adoptés par pragmatisme, plutôt qu’une infrastructure universelle adoptée par conviction.