Read in English · Leer en español · Lire en français
Abschnitt 7.2 von 7.8 · Mittelstufe · 25 Min. Lesezeit
Die Wahl einer Datenbank: relational, Dokument, Key-Value, Spalten, Graph und Zeitreihen
Videolektion
5 Min. · auf Englisch gesprochen, mit UntertitelnNur anhören (Audio)
Transkript lesen
Eine Datenbank gehört zu den am schwersten austauschbaren Teilen eines Systems. In dieser Lektion lernen Sie, wofür jede Art von Datenbank gut ist und wie Sie anhand von Belegen eine auswählen.
Eine Datenbank zu wählen ist wie die Wahl von Stauraum für eine Wohnung. Ein Aktenschrank mit beschrifteten Mappen eignet sich für Unterlagen, die Sie abgleichen: eine relationale Datenbank. Ein Kleiderschrank mit kompletten Outfits eignet sich für Dinge, die Sie zusammen herausnehmen: ein Dokumentenspeicher. Eine Reihe nummerierter Schließfächer ist am schnellsten, wenn Sie die Nummer kennen: ein Key-Value-Store. Und eine Pinnwand mit Fäden zwischen den Nadeln zeigt, wer wen kennt: ein Graph. Die meisten Wohnungen brauchen einen Aktenschrank plus ein oder zwei Spezialmöbel, denn jedes zusätzliche Stück braucht Platz und jemanden, der weiß, wie es funktioniert.
Für Geschäftsdaten bleibt relational aus vier Gründen der vernünftige Standard. Erstens setzt die Datenbank selbst die Regeln durch, etwa dass eine Zahlung und ihre Hauptbucheinträge gemeinsam committet werden. Zweitens Flexibilität. Sie müssen beim Entwurf des Schemas nicht jede künftige Frage kennen. Drittens Reife: Jahrzehnte an Werkzeugen für Backup, Replikation und Monitoring sowie Fachleute, die sie schon kennen. Viertens Bandbreite. Moderne relationale Systeme speichern auch JSON, durchsuchen Text und finden ähnliche Vektoren, sodass eine gut betriebene Datenbank in moderatem Umfang viele Anforderungen abdeckt.
Jede Datenbankfamilie organisiert Daten anders, und diese Form entscheidet, welche Abfragen günstig und welche unmöglich sind. Eine relationale Datenbank hält Zeilen in Tabellen mit festen Spalten, verknüpft über Schlüssel und Joins. Ein Dokumentenspeicher hält jeden Datensatz als verschachteltes Dokument, das als Ganzes gelesen wird, etwa die Speisekarte eines Restaurants. Ihn in einer anderen Form abzufragen ist schwieriger. Ein Key-Value-Store legt Werte einfach per Schlüssel ab und ruft sie ab. Er schaut nie in den Wert hinein, deshalb ist er extrem schnell und leicht auf Maschinen zu verteilen. Eine Graphdatenbank behandelt Beziehungen als vollwertige Datensätze, was zu Betrugserkennung und Empfehlungen passt. Eine Zeitreihendatenbank hängt Messwerte in zeitlicher Reihenfolge an und fragt sie nach Bereichen ab. Darunter stehen drei weitere. Wide-Column-Stores bewältigen massive Schreibvolumina, mit einer Tabelle pro Abfrage. Suchmaschinen ranken Text nach Relevanz. Vektorspeicher finden die nach Bedeutung nächstgelegenen Treffer.
Wie also wählen Sie? Pro Datenbestand, nicht einmal für das ganze System. Beginnen Sie mit der Form der Daten und den Abfragen, die darauf laufen werden. Dann die Konsistenz. Kontostände, Lagerbestand und Buchungen brauchen Transaktionen. Bei Likes sind ein paar Sekunden Veralterung harmlos. Dann die Größenordnung, gemessen statt geraten. Ein Speicher, der auf Petabytes skaliert, ist bei fünfzig Gigabyte kein Vorteil. Dann Betrieb und Teamkenntnisse. Wer wird ihn sichern, upgraden und um drei Uhr morgens debuggen? Eine gute Gewohnheit: Schreiben Sie vor der Wahl die wichtigsten Abfragen und ihre Ziellatenzen auf, und testen Sie mit realistischen Volumina, nicht mit tausend Zeilen auf einem Laptop.
Nun zur Essenslieferplattform. In der Spitze nimmt sie etwa dreihundert Bestellungen pro Minute an, hat zwanzigtausend Kuriere online und zweitausend Suchanfragen pro Sekunde. Das Team betreibt PostgreSQL bereits gut. Bestellungen und Zahlungen brauchen Transaktionen und strenge Regeln, also kommen sie in PostgreSQL. Es gibt keinen Grund für etwas anderes. Speisekarten haben eine verschachtelte Form, aber ein Dokumentenspeicher würde eine zweite Technologie hinzufügen, ohne eine Anforderung zu erfüllen, die PostgreSQL verfehlt. Kurierstandorte sind anders: fünftausend Schreibvorgänge pro Sekunde, und nur die letzte Position zählt, etwa dreißig Sekunden lang. Ein In-Memory-Key-Value-Store mit Ablaufzeit passt. Die Suche bekommt eine Suchmaschine und Analytics ein Data Warehouse, beide aus den Systems of Record gespeist und daraus neu aufbaubar. Eine Graphdatenbank, eine separate Zeitreihendatenbank und Distributed SQL wurden alle verworfen. Keine gemessene Anforderung braucht sie bisher.
Hier ist das Ergebnis. Bestellungen und Speisekarten schreiben jeweils in ihre eigene PostgreSQL-Datenbank: die einzigen beiden Systems of Record. Kurierpositionen liegen im Arbeitsspeicher und laufen nach dreißig Sekunden ab. Sie bei einem Neustart zu verlieren kostet einen Aktualisierungszyklus. Die Suchmaschine ist ein abgeleiteter Index der Speisekarten, gespeist per Change Data Capture mit wenigen Sekunden Verzögerung. Und das Data Warehouse ist konstruktionsbedingt Stunden alt. Alles außer den beiden Systems of Record ist abgeleitet und lässt sich neu aufbauen.
Unterschiedliche Speicher für unterschiedliche Daten zu nutzen nennt man polyglotte Persistenz. Sie folgt natürlich aus Datenbank pro Service. Aber jeder zusätzliche Datenbanktyp braucht eigene Expertise, Backups, Monitoring, Upgrades und Wissen in der Rufbereitschaft. Für ein kleines Team können fünf Datenbanken mehr Aufwand kosten als das Produkt. In seinem Essay „Choose Boring Technology“ von 2015 argumentierte Dan McKinley, dass ein Unternehmen nur wenige Innovation Tokens für unvertraute Werkzeuge bekommt. Begründen Sie also jeden neuen Speicher durch eine Anforderung, die die anderen nicht erfüllen können. Und ein häufiger Fehler: einen Suchindex oder Cache zur einzigen Kopie bestimmter Daten werden zu lassen.
Der vollständige Abschnitt vergleicht jede Familie und ergänzt eine Entscheidungshilfe Schritt für Schritt. Als Nächstes betrachten wir in Abschnitt sieben Punkt drei Transaktionen und Isolation. Bis gleich.
Was Sie wissen müssen
- Relationale Datenbanken bleiben der Standard für Geschäftsdaten, weil sie Transaktionen, Constraints, flexible Abfragen, ausgereifte Werkzeuge und weit verbreitete Kenntnisse bieten und inzwischen auch JSON-, Text-, Geo- und Vektordaten in moderatem Umfang verarbeiten.
- Dokument-, Key-Value-, Wide-Column-, Graph-, Zeitreihen-, Such- und Vektorspeicher machen jeweils bestimmte Zugriffsmuster günstig und andere teuer; ihre Stärke liegt als spezialisierte oder abgeleitete Speicher.
- Distributed SQL (Spanner, CockroachDB, YugabyteDB, TiDB) behält SQL und Transaktionen bei und skaliert über Knoten und Regionen, um den Preis von Schreiblatenz, Geld und betrieblicher Komplexität.
- Wählen Sie pro Datenbestand anhand von Belegen: Datenform, Zugriffsmuster, Konsistenzbedarf, gemessene Größenordnung, Betriebsaufwand und Teamkenntnisse; schreiben Sie die wichtigsten Abfragen und Volumina zuerst auf.
- Trennen Sie Systems of Record, die die konservativste Technologie brauchen, von abgeleiteten Speichern wie Suchindizes und Caches, die spezialisiert sein können, weil sie sich neu aufbauen lassen.
- Polyglotte Persistenz erlaubt jedem Datenbestand einen passenden Speicher, aber jede zusätzliche Technologie bringt dauerhafte betriebliche und kognitive Kosten mit sich; McKinleys „Choose Boring Technology“ (2015) plädiert dafür, Innovation sparsam einzusetzen.
Warum die Wahl Sorgfalt verdient
Eine Datenbank gehört zu den am schwersten austauschbaren Komponenten. Anwendungen werden um ihre Daten herum neu geschrieben, nicht umgekehrt; Terabytes an Live-Daten zu migrieren, während das Geschäft weiterläuft, kann ein Jahr dauern. Die Wahl des Speichers ist deshalb eine Einwegtür, die eine explizite Entscheidung verdient, während viele Teams sie aus Gewohnheit oder nach Mode treffen.
Kapitel 0 hat relationale Datenbanken und die vier NoSQL-Familien eingeführt. Dieser Abschnitt geht weiter: wofür jede Familie wirklich gut ist, die neueren Kategorien (Zeitreihen, Suche, Vektoren und Distributed SQL), wie man nach Belegen statt nach Begeisterung wählt und was es kostet, mehrere Arten zugleich zu betreiben. Die Antwort ist selten eine Datenbank für alles und fast nie eine andere Datenbank für jeden Service.
Datenmodelle auf einen Blick
Relational: weiterhin der Standard, aus guten Gründen
Eine relationale Datenbank speichert Daten in Tabellen mit deklarierten Typen, Schlüsseln und Constraints und beantwortet deklarative SQL-Abfragen, eine Idee aus Edgar Codds Paper von 1970. Fünfzig Jahre später ist sie aus vier Gründen weiterhin der vernünftige Standard für Geschäftsdaten. Erstens Transaktionen und Constraints: Die Datenbank selbst garantiert, dass eine Zahlung und ihre Hauptbucheinträge gemeinsam committet werden und dass keine Bestellung auf einen fehlenden Kunden verweist, sodass diese Regeln nicht in jedem Service unvollkommen neu implementiert werden müssen. Zweitens Flexibilität bei Abfragen: Sie müssen beim Entwurf des Schemas nicht jede künftige Frage kennen; ein neuer Bericht ist eine neue Abfrage, keine neue Tabelle. Drittens Reife: Jahrzehnte an Werkzeugen für Backup, Replikation, Monitoring, Migration und Performance-Diagnose sowie Fachleute, die sie schon kennen. Viertens Bandbreite: Moderne relationale Systeme speichern und indizieren JSON (jsonb in PostgreSQL), unterstützen Volltextsuche, Geodaten (PostGIS), Zeitpartitionierung und Vektorähnlichkeit (die Erweiterung pgvector), sodass eine gut betriebene Datenbank in moderatem Umfang viele Anforderungen abdecken kann.
Die echten Grenzen sind konkret. Schreibvorgänge auf einem einzelnen Primary sind durch eine Maschine begrenzt; sehr große Tabellen brauchen sorgfältige Partitionierung; Schemaänderungen an riesigen Tabellen brauchen Technik (Schemaevolution); und manche Zugriffsmuster, etwa tiefe Graphtraversierungen oder relevanzbasierte Textsuche, bedienen spezialisierte Engines deutlich besser. Ein einzelner moderner Server mit schnellen SSDs kann Tausende Transaktionen pro Sekunde und Terabytes an Daten bewältigen, was den Bedarf der meisten Organisationen abdeckt.
Die nicht relationalen Familien
Eine Dokumentendatenbank speichert jeden Datensatz als in sich geschlossenes Dokument, meist JSON oder eine binäre Form davon. Sie passt zu Aggregaten im Sinne des Domain-Driven Design: Dingen, die als Ganzes gelesen und geschrieben werden, etwa die Speisekarte eines Restaurants mit ihren Rubriken, Gerichten und Optionsgruppen. Ein Dokument zu lesen ist ein einziger Zugriff ohne Joins. Die Abwägung zeigt sich, wenn dieselben Daten in einer anderen Form abgefragt (alle Gerichte mit Erdnüssen über alle Speisekarten hinweg) oder in vielen Dokumenten zugleich geändert werden müssen; Joins und dokumentübergreifende Transaktionen gibt es in modernen Produkten, aber sie sind teurer und weniger natürlich als in SQL.
Ein Key-Value-Store ist ein verteiltes Wörterbuch: einen Wert unter einem Schlüssel ablegen, ihn wieder abrufen. Weil der Speicher nie in die Werte hineinschaut, kann er extrem schnell und leicht zu partitionieren sein. Redis und sein Open-Source-Fork Valkey halten Daten im Arbeitsspeicher mit optionaler Persistenz und bieten zusätzlich Datenstrukturen (Sorted Sets, Streams, Geo-Indizes) und Ablaufzeiten; Amazon DynamoDB ist ein verwalteter, partitionierter Key-Value- und Dokumentenspeicher. Sie eignen sich für Sessions, Warenkörbe, Zähler für Rate Limiting, Feature-Flags, Caches und die letzte Position jedes Kuriers.
Ein Wide-Column-Store (Bigtable, Apache Cassandra, ScyllaDB, HBase) gruppiert Zeilen nach einem Partition Key und speichert sie innerhalb jeder Partition nach einem Clustering Key sortiert. Er ist für massive Schreibvolumina ausgelegt, verteilt über viele Knoten und Rechenzentren. Die Disziplin, die er verlangt, ist Query-First-Modellierung: Sie entwerfen eine Tabelle pro Abfrage und duplizieren Daten großzügig, weil Abfragen, die nicht beim Partition Key ansetzen, teuer oder unmöglich sind. Cassandra stammt zum Teil von Amazons Dynamo-Paper von 2007 ab, dessen Replikationsideen im übernächsten Abschnitt vorkommen.
Eine Graphdatenbank speichert Knoten und Beziehungen als vollwertige Datensätze und beantwortet Traversierungsabfragen wie Kunden innerhalb von drei Schritten von diesem Betrugsring
ohne die kaskadierenden Joins, die solche Abfragen in SQL langsam machen. Cypher von Neo4j ist die bekannteste Abfragesprache, und die ISO hat 2024 eine standardisierte Graphabfragesprache veröffentlicht, GQL (ISO/IEC 39075). Graphen eignen sich hervorragend für Betrugserkennung, Empfehlungen und Netzwerkanalyse und sind meist ein schlechter Primärspeicher für transaktionale Geschäftsdaten.
Zeitreihen-, Such- und Vektorspeicher
Eine Zeitreihendatenbank ist für Messwerte mit Zeitstempel optimiert, die der Reihe nach eintreffen und selten aktualisiert werden: Metriken, Sensorwerte, Preise, Standortverläufe. Sie komprimiert stark, partitioniert nach Zeit, verdichtet alte Daten (jeden Punkt eine Woche lang behalten, Minutenmittelwerte ein Jahr lang) und löscht abgelaufene Daten günstig, indem sie ganze Zeitpartitionen verwirft. Beispiele sind InfluxDB, Prometheus (für Monitoring) und TimescaleDB, eine PostgreSQL-Erweiterung, die zeigt, wie oft sich eine relationale Datenbank passend dehnen lässt.
Eine Suchmaschine wie Elasticsearch, OpenSearch oder Apache Solr (alle auf der Bibliothek Apache Lucene aufgebaut) pflegt einen invertierten Index von Wörtern zu den Dokumenten, die sie enthalten, mit Textanalyse (Stammformreduktion, Synonyme, Tippfehlertoleranz) und Relevanzranking. Sie beantwortet veganes Ramen in meiner Nähe
in Millisekunden. Sie sollte fast nie ein System of Record sein: Indizes werden nahezu in Echtzeit statt transaktional aufgefrischt, und das übliche Design speist die Suchmaschine aus der besitzenden Datenbank und baut den Index bei Bedarf daraus neu auf.
Eine Vektordatenbank speichert Embeddings, Zahlenlisten, die die Bedeutung von Texten, Bildern oder Produkten darstellen, und findet die Elemente, die einem Abfragevektor am nächsten liegen. Eine exakte Suche vergleicht die Abfrage mit jedem Vektor, deshalb nutzen diese Speicher Indizes für approximative Nächste-Nachbarn-Suche wie HNSW-Graphen und tauschen ein wenig Trefferquote gegen Geschwindigkeit. Sie treiben semantische Suche, Empfehlungen und das Retrieval für große Sprachmodelle an, behandelt in Retrieval-Augmented Generation. Es gibt eigene Produkte (Milvus, Qdrant, Pinecone, Weaviate), aber für Millionen statt Milliarden von Vektoren genügt oft eine Erweiterung einer bestehenden Datenbank wie pgvector.
Distributed SQL
Distributed-SQL-Datenbanken, manchmal NewSQL genannt (ein Begriff, den der Analyst Matthew Aslett 2011 prägte), behalten das relationale Modell, SQL und ACID-Transaktionen bei, partitionieren und replizieren Daten aber automatisch über viele Knoten, oft über Regionen hinweg. Google Spanner, beschrieben in einem OSDI-Paper von 2012, nutzt eng synchronisierte Uhren (seine TrueTime-API, gestützt auf GPS und Atomuhren), um global konsistente Transaktionen zu bieten. CockroachDB, YugabyteDB und TiDB bieten ähnliche Modelle auf gewöhnlicher Hardware; CockroachDB nutzt standardmäßig serialisierbare Isolation.
Der Preis sind Physik und Betrieb. Eine Transaktion, der Replikas in mehreren Regionen zustimmen müssen, wartet auf einen Konsens-Roundtrip, sodass einzelne Zeilenschreibvorgänge Millisekunden bis zu Dutzenden oder Hunderten Millisekunden dauern statt deutlich unter einer Millisekunde. Abfrageplanung über Partitionen hinweg ist subtiler, die Kosten sind höher, und weniger Fachleute kennen die Fehlerbilder. Distributed SQL ist das richtige Werkzeug, wenn Sie wirklich relationale Transaktionen jenseits der Kapazität eines Servers oder über Regionen hinweg brauchen (ein globales Zahlungshauptbuch, eine Bank in mehreren Regionen), und ein teures, wenn ein einzelner PostgreSQL-Primary mit Replikas genügen würde.
Vergleich der Datenbankfamilien
| Klasse | Datenmodell und Abfrage | Stärken | Schwächen | Beispiele |
|---|---|---|---|---|
| Relational | Tabellen, Schlüssel, SQL mit Joins und Aggregationen | Transaktionen und Constraints, flexible Ad-hoc-Abfragen, ausgereifte Werkzeuge, weithin bekannt | Vertikale Skalierungsgrenze für Schreibvorgänge auf einem Knoten; starres Schema erfordert Migrationen | PostgreSQL, MySQL, SQL Server, Oracle |
| Dokument | JSON-ähnliche Dokumente, Abfragen auf Felder und verschachtelte Werte | Natürliche Passform für Aggregate, die als Ganzes gelesen werden; flexible Struktur | Joins und dokumentübergreifende Transaktionen schwächer oder teurer; Schema im Code durchgesetzt | MongoDB, Couchbase, Firestore |
| Key-Value | Opaker Wert pro Schlüssel; get, put, delete | Sehr schnell, einfach, leicht zu partitionieren | Keine Abfragen über Werte; Modellierungslast bei der Anwendung | Redis, Valkey, DynamoDB, etcd |
| Wide-Column | Zeilen nach Partition Key gruppiert, nach Clustering Key sortiert | Enormer Schreibdurchsatz, lineare horizontale Skalierung, mehrere Rechenzentren | Tabellen pro Abfrage gebaut; begrenzte Joins und Ad-hoc-Abfragen | Apache Cassandra, ScyllaDB, HBase, Bigtable |
| Graph | Knoten und Kanten mit Eigenschaften; Traversierungsabfragen | Beziehungsabfragen über mehrere Schritte | Schwerer zu partitionieren; kleineres Ökosystem | Neo4j, Amazon Neptune |
| Zeitreihen | Punkte mit Zeitstempel, Tags; Bereichs- und Verdichtungsabfragen | Kompression, Aufbewahrungsfristen, Downsampling | Schwach bei allgemeinen Aktualisierungen und Beziehungen | InfluxDB, TimescaleDB, Prometheus |
| Suchmaschine | Invertierter Index über Dokumente; relevanzgewichtete Textabfragen | Volltextsuche, unscharfe Suche, Facetten | Kein System of Record; Auffrischung nahezu in Echtzeit | Elasticsearch, OpenSearch, Apache Solr |
| Vektor | Embeddings; approximative Nächste-Nachbarn-Suche | Semantische Ähnlichkeit für Retrieval und Empfehlungen | Näherungsweise Ergebnisse; Kosten für den Indexaufbau; junge Werkzeuge | pgvector, Milvus, Qdrant, Pinecone |
| Distributed SQL | Relationales Modell, SQL, partitioniert und repliziert | Transaktionen und SQL mit horizontaler Skalierung und Überleben über Regionen hinweg | Höhere Schreiblatenz, Kosten und betriebliche Komplexität | Google Spanner, CockroachDB, YugabyteDB, TiDB |
Die Wahl: Kriterien, die zählen
Wählen Sie pro Datenbestand, nicht pro System. Sammeln Sie für jeden wichtigen Datenbestand Belege zu sechs Kriterien und halten Sie die Entscheidung in einem ADR fest.
Datenform. Sind die Daten von Natur aus tabellarisch mit vielen Beziehungen, ein in sich geschlossenes Aggregat, ein Netzwerk, eine Zeitreihe, freier Text oder Vektoren? Zugriffsmuster. Welche Abfragen laufen, wie oft, mit welchen Latenzzielen, und wie viele davon sind ad hoc? Überwiegend lesend oder schreibend? Immer per Schlüssel oder nach vielen Attributen? Konsistenzbedarf. Brauchen die Daten Transaktionen über mehrere Elemente und Constraints (Kontostände, Lagerbestand, Buchungen), oder sind ein paar Sekunden Veralterung harmlos (Likes, Empfehlungen)? Siehe Konsistenzmodelle. Größenordnung. Aktuelle und prognostizierte Datenmenge, Schreibvorgänge pro Sekunde und Wachstum, gemessen, nicht geraten; ein Speicher, der auf Petabytes skaliert, ist bei 50 Gigabyte kein Vorteil. Betrieb. Wer wird ihn betreiben: Backups, Upgrades, Failover, Monitoring, Sicherheitspatches? Gibt es einen Managed Service in Ihrer Cloud, und was kostet er bei Ihren Volumina? Teamkenntnisse. Was kennt das Team schon gut genug, um es um 3 Uhr nachts zu debuggen? Unvertraute Technologie bringt unbekannte Fehlerbilder mit sich.
Zwei Gewohnheiten verbessern die Wahl. Schreiben Sie die fünf oder zehn wichtigsten Abfragen mit ihren Ziellatenzen vor der Wahl auf, und testen Sie den Kandidaten mit realistischen Datenmengen; viele Enttäuschungen stammen von einem Speicher, der auf einem Laptop mit tausend Zeilen getestet wurde. Und trennen Sie das System of Record von abgeleiteten Speichern: Das System of Record braucht die stärksten Garantien und die konservativste Technologie, während abgeleitete Speicher (Suchindizes, Caches, Read Models) gerade deshalb spezialisiert sein können, weil sie sich neu aufbauen lassen.
Entscheidungshilfe
Entscheidungshilfe: Welche Art von Speicher für diese Daten?
Stellen Sie diese Fragen für jeden Datenbestand (nicht einmal für das ganze System), in dieser Reihenfolge. Halten Sie beim ersten passenden Ja an; erreichen Sie das Ende, bleibt es beim relationalen Standard.
- Sind diese Daten ein System of Record, das Transaktionen über mehrere Zeilen, Constraints oder Ad-hoc-Abfragen braucht (Bestellungen, Zahlungen, Konten, Buchungen)?JaNutzen Sie eine relationale Datenbank. Suchen Sie nur weiter, wenn Sie zeigen können, dass sie eine gemessene Anforderung an Größenordnung oder Latenz nicht erfüllen kann.NeinWeiter: Die Daten sind womöglich abgeleitet, spezialisiert oder haben extrem hohes Volumen.
- Ist es eine aus einem System of Record abgeleitete Kopie, die eine spezielle Abfrage bedient (Volltextsuche, Empfehlungen, Ähnlichkeitssuche)?JaNutzen Sie für diese Abfrage den spezialisierten Speicher (Suchmaschine, Graph- oder Vektorindex), gespeist aus dem System of Record und daraus neu aufbaubar.NeinWeiter.
- Wird es als einzelnes Element per Schlüssel gelesen und geschrieben, ohne Abfragen über Elemente hinweg (Sessions, Warenkörbe, letzte Positionen, Feature-Flags)?JaEin Key-Value-Store passt, oft im Arbeitsspeicher mit Ablaufzeit. Legen Sie fest, was geschieht, wenn er verloren geht.NeinWeiter.
- Ist es ein überwiegend anhängender Strom von Messwerten mit Zeitstempel, der nach Zeitbereich abgefragt wird (Metriken, Sensorwerte, Standortverlauf)?JaEine Zeitreihendatenbank oder, bei moderaten Volumina, zeitpartitionierte Tabellen in einer relationalen Datenbank.NeinWeiter.
- Werden Schreibvolumen oder Datenmenge übersteigen, was ein gut abgestimmter Server bewältigen kann, bei Zugriff immer über einen bekannten Schlüssel?JaEin Wide-Column- oder Key-Value-Store, der für Partitionierung ausgelegt ist (Cassandra, DynamoDB), mit Tabellen, die um die Abfragen herum entworfen sind.NeinWeiter.
- Brauchen Sie relationale Transaktionen und SQL über Regionen hinweg oder jenseits der Kapazität eines Servers?JaErwägen Sie Distributed SQL (Spanner, CockroachDB, YugabyteDB) und nehmen Sie höhere Schreiblatenz und Betriebskosten in Kauf.NeinBleiben Sie beim relationalen Standard und prüfen Sie erneut, wenn sich eine gemessene Anforderung ändert.
Polyglotte Persistenz und ihre Kosten
Polyglotte Persistenz bedeutet, innerhalb eines Systems unterschiedliche Speichertechnologien für unterschiedliche Daten zu nutzen, gewählt danach, wie die Daten verwendet werden. Martin Fowler machte den Begriff 2011 bekannt und schrieb seine erste Verwendung Scott Leberknight zu. Er folgt natürlich aus Datenbank pro Service: Jeder Eigentümer kann das richtige Werkzeug wählen.
Die Kosten werden leicht unterschätzt. Jeder zusätzliche Datenbanktyp braucht eigene Expertise, eigene Verfahren für Backup und Wiederherstellung, Monitoring, Kapazitätsplanung, Sicherheitshärtung, einen eigenen Upgrade-Zyklus und Wissen in der Rufbereitschaft. Daten bewegen sich nun zwischen Speichern, also brauchen Sie Pipelines (CDC, Events) und müssen Verzögerung und Ausfall jeder einzelnen bedenken. Konsistenz zwischen Speichern ist bestenfalls eventual. Für ein kleines Team können fünf Datenbanken mehr Aufwand verschlingen als das Produkt. Eine vernünftige Regel ist, jeden neuen Speicher durch eine Anforderung zu begründen, die die bestehenden nachweislich nicht erfüllen können, und für die spezialisierten Managed Services zu bevorzugen.
Ausgearbeitetes Beispiel
Ausgearbeitetes Beispiel: Speicher für die Essenslieferplattform
Die Plattform ist in 40 Städten tätig. In der Abendspitze nimmt sie etwa 300 Bestellungen pro Minute an, hat 20.000 Kuriere online, liefert 50.000 Restaurant-Speisekarten aus und wird etwa 2000-mal pro Sekunde durchsucht. Das Team aus 35 Entwicklungsfachleuten betreibt PostgreSQL bereits gut.
| Bestellungen und Zahlungen | System of Record; Transaktionen über mehrere Zeilen (Bestellung, Positionen, Zahlungsautorisierung); strenge Regeln; Ad-hoc-Abfragen durch den Support. Etwa 5 neue Bestellungen pro Sekunde in der Spitze (ein paar Dutzend Zeilenschreibvorgänge). PostgreSQL mit einem Replikat für Failover. Kein Grund für etwas anderes. |
|---|---|
| Speisekarten | Überwiegend lesend, hierarchisch (Rubriken, Gerichte, Optionsgruppen), von Restaurants einige tausend Mal am Tag bearbeitet. Preise müssen genau dem entsprechen, was die Bestellung festhält. PostgreSQL mit einem relationalen Kern (Restaurant, Gericht, Preis) und jsonb für variable Optionen. Ein Dokumentenspeicher würde zur Form passen, aber eine zweite Technologie hinzufügen, ohne eine Anforderung zu erfüllen, die PostgreSQL verfehlt. |
| Kurierstandorte | 20.000 Kuriere, die jeweils alle 4 Sekunden eine Position senden, ergeben 5000 Schreibvorgänge pro Sekunde, von denen für die Disposition nur die jeweils letzte pro Kurier zählt, und das nur etwa 30 Sekunden lang. In-Memory-Key-Value-Store (Redis oder Valkey) mit Geoabfragen und 30 Sekunden Ablaufzeit. Ihn bei einem Neustart zu verlieren kostet einen Aktualisierungszyklus. Eine Stichprobe von Punkten (etwa einer alle 30 Sekunden) geht für Analytics ins Warehouse. |
| Suche nach Restaurants und Gerichten | Volltext, tippfehlertolerant, gefiltert nach Standort, Öffnungszeiten und Ernährungs-Tags, nach Relevanz gerankt. Suchmaschine (OpenSearch), gespeist aus der Speisekarten-Datenbank per Change Data Capture und daraus neu aufbaubar. Akzeptiert nach einer Speisekartenänderung einige Sekunden Verzögerung. |
| Analytics | Wochenumsatz, Lieferzeiten nach Stadt, Auslastung der Kuriere: große Scans und Aggregationen über Monate an Historie. Cloud-Data-Warehouse, gespeist durch CDC und Events, konstruktionsbedingt Stunden alt. Siehe Analytics und Streaming. |
| Verworfen | Eine Graphdatenbank für Empfehlungen (noch nicht nötig; mit Belegen neu prüfen), eine separate Zeitreihendatenbank für Standorte (die Stichprobe im Warehouse beantwortet die gestellten Fragen) und Distributed SQL (die Bestellungen der gesamten Plattform, etwa 5 pro Sekunde in der Spitze, passen bequem auf einen Primary; es gibt keine Anforderung an regionsübergreifende Transaktionen). |
Das Ergebnis sind zwei Systems of Record auf einer bewährten Technologie plus drei spezialisierte, abgeleitete Speicher. Jede zusätzliche Technologie ist durch eine Anforderung begründet, die der Standard nicht erfüllen kann: 5000 kurzlebige Schreibvorgänge pro Sekunde und relevanzgerankte Textsuche.
Die Abfragen und Zahlen zuerst aufzuschreiben machte die Entscheidungen fast offensichtlich und gab dem Team eine Aufzeichnung der Annahmen, die es neu prüfen kann, wenn sich die Volumina ändern.
Die resultierende Speicherlandschaft
Häufige Fehler
Lebenslaufgetriebene Entscheidungen: einen Speicher wählen, weil er neu ist oder weil ein großes Unternehmen ihn nutzt, ohne die Anforderung, die ihn dort rechtfertigte. Für eingebildete Größenordnungen wählen: für eine Milliarde Nutzer entwerfen bei einem Produkt mit tausend und vom ersten Tag an die Komplexitätssteuer zahlen. Einen abgeleiteten Speicher als System of Record nutzen: ein Suchindex oder Cache, der zur einzigen Kopie von Daten wird, mit schwächerer Dauerhaftigkeit, als irgendjemand ahnte. Die Abfrageseite ignorieren: einen Key-Value- oder Wide-Column-Store wählen und dann feststellen, dass das Geschäft Ad-hoc-Berichte und Filter braucht, die er nicht bedienen kann. Den Betrieb unterschätzen: vergessen, dass jemand ihn aus dem Backup wiederherstellen, ohne Ausfallzeit upgraden und unter Last diagnostizieren muss. Und schließlich die Wahl als endgültige Wahrheit behandeln: Halten Sie die Annahmen fest (Volumina, Abfragen, Teamkenntnisse), damit die Entscheidung neu geprüft werden kann, wenn sie sich ändern.
Prüfen Sie Ihr Verständnis
Warum sollte eine Suchmaschine in der Regel nicht das System of Record sein?
Ihr Index wird nahezu in Echtzeit statt transaktional aufgefrischt, und ihre Dauerhaftigkeitsgarantien sind schwächer; sie sollte aus der besitzenden Datenbank gespeist und bei Bedarf daraus neu aufgebaut werden.
Nennen Sie zwei Anzeichen dafür, dass ein Wide-Column-Store gut passen könnte.
Sehr hohes Schreibvolumen jenseits eines Servers und ein Zugriff, der immer bei einem bekannten Partition Key ansetzt, sodass sich Tabellen pro Abfrage entwerfen lassen.
Wofür steht ein „Innovation Token“ in McKinleys Essay?
Für eine von wenigen Gelegenheiten, die ein Unternehmen hat, unvertraute Technologie einzuführen, die jeweils unbekannte Fehlerbilder und dauerhafte Betriebskosten mit sich bringt.
Wann ist Distributed SQL seine Kosten wert?
Wenn Sie relationale Transaktionen und SQL jenseits der Kapazität eines Servers oder über Regionen hinweg brauchen, etwa für ein globales Hauptbuch; nicht, wenn ein einzelner Primary mit Replikas die Anforderungen erfüllt.
Quellen und weiterführende Literatur
Haben Sie eine Frage zu diesem Abschnitt? ArchitectBot, der KI-Lernassistent des Kurses, antwortet zuerst aus dem Kurs.
Fragen: „Unser Team möchte MongoDB für einen neuen Bestellservice nutzen, weil es flexibler ist. Wie entscheide ich, ob das im Vergleich zu PostgreSQL eine gute Idee ist?“