Der endgültige Leitfaden für NoSQL-Datenbanken

Veröffentlicht: 2022-03-11

Es besteht kein Zweifel, dass sich die Art und Weise, wie Webanwendungen mit Daten umgehen, in den letzten zehn Jahren erheblich verändert hat. Es werden mehr Daten gesammelt und mehr Benutzer greifen gleichzeitig auf diese Daten zu als je zuvor. Dies bedeutet, dass Skalierbarkeit und Leistung für relationale Datenbanken, die schemabasiert sind, mehr denn je eine Herausforderung darstellen und daher schwieriger zu skalieren sind.

Die Entwicklung von NoSQL

Das Problem der SQL-Skalierbarkeit wurde von Web 2.0-Unternehmen mit enormen, wachsenden Daten- und Infrastrukturanforderungen wie Google, Amazon und Facebook erkannt. Sie entwickelten ihre eigenen Lösungen für das Problem – Technologien wie BigTable, DynamoDB und Cassandra.

Dieses wachsende Interesse führte zu einer Reihe von NoSQL-Datenbankverwaltungssystemen (DBMS) mit Schwerpunkt auf Leistung, Zuverlässigkeit und Konsistenz. Eine Reihe bestehender Indizierungsstrukturen wurde wiederverwendet und verbessert, um die Such- und Leseleistung zu verbessern.

Erstens gab es proprietäre (Closed Source) Arten von NoSQL-Datenbanken, die von großen Unternehmen entwickelt wurden, um ihre spezifischen Anforderungen zu erfüllen, wie Googles BigTable, das als erstes NoSQL-System gilt, und Amazons DynamoDB.

Der Erfolg dieser proprietären Systeme initiierte die Entwicklung einer Reihe ähnlicher Open-Source- und proprietärer Datenbanksysteme, von denen die beliebtesten Hypertable, Cassandra, MongoDB, DynamoDB, HBase und Redis sind.

Was macht NoSQL anders?

Ein wesentlicher Unterschied zwischen NoSQL-Datenbanken und herkömmlichen relationalen Datenbanken ist die Tatsache, dass NoSQL eine Form der unstrukturierten Speicherung ist.

Das bedeutet, dass NoSQL-Datenbanken keine feste Tabellenstruktur haben, wie sie in relationalen Datenbanken zu finden sind.

Vor- und Nachteile von NoSQL-Datenbanken

Vorteile

NoSQL-Datenbanken haben viele Vorteile gegenüber traditionellen, relationalen Datenbanken.

Ein wesentlicher Unterschied besteht darin, dass NoSQL-Datenbanken eine einfache und flexible Struktur haben. Sie sind schemafrei.

Im Gegensatz zu relationalen Datenbanken basieren NoSQL-Datenbanken auf Schlüssel-Wert-Paaren.

Einige Speichertypen von NoSQL-Datenbanken umfassen Spaltenspeicher, Dokumentspeicher, Schlüsselwertspeicher, Graphspeicher, Objektspeicher, XML-Speicher und andere Datenspeichermodi.

Normalerweise hat jeder Wert in der Datenbank einen Schlüssel. Einige NoSQL-Datenbankspeicher ermöglichen es Entwicklern auch, serialisierte Objekte in der Datenbank zu speichern, nicht nur einfache Zeichenfolgenwerte.

Open-Source-NoSQL-Datenbanken erfordern keine teuren Lizenzgebühren und können auf kostengünstiger Hardware ausgeführt werden, was ihre Bereitstellung kostengünstig macht.

Auch bei der Arbeit mit NoSQL-Datenbanken, egal ob Open Source oder proprietär, ist die Erweiterung einfacher und kostengünstiger als bei der Arbeit mit relationalen Datenbanken. Dies liegt daran, dass dies durch horizontales Skalieren und Verteilen der Last auf alle Knoten erfolgt und nicht durch die Art der vertikalen Skalierung, die normalerweise bei relationalen Datenbanksystemen durchgeführt wird, wodurch der Haupthost durch einen leistungsfähigeren ersetzt wird.

Nachteile

Natürlich sind NoSQL-Datenbanken nicht perfekt und nicht immer die richtige Wahl.

Zum einen unterstützen die meisten NoSQL-Datenbanken keine Zuverlässigkeitsfunktionen , die von relationalen Datenbanksystemen nativ unterstützt werden. Diese Zuverlässigkeitsmerkmale können als Atomarität, Konsistenz, Isolation und Haltbarkeit zusammengefasst werden. Das bedeutet auch, dass NoSQL-Datenbanken, die diese Funktionen nicht unterstützen, Konsistenz gegen Leistung und Skalierbarkeit eintauschen.

Um Zuverlässigkeits- und Konsistenzfunktionen zu unterstützen, müssen Entwickler ihren eigenen proprietären Code implementieren, was das System komplexer macht.

Dies könnte die Anzahl der Anwendungen einschränken, die sich für sichere und zuverlässige Transaktionen auf NoSQL-Datenbanken verlassen können, wie z. B. Banksysteme.

Andere Formen der Komplexität, die in den meisten NoSQL-Datenbanken zu finden sind, umfassen die Inkompatibilität mit SQL-Abfragen. Dies bedeutet, dass eine manuelle oder proprietäre Abfragesprache erforderlich ist, was noch mehr Zeit und Komplexität hinzufügt.

NoSQL vs. relationale Datenbanken

Diese Tabelle bietet einen kurzen Funktionsvergleich zwischen NoSQL und relationalen Datenbanken:

Feature NoSQL-Datenbanken Relationale Datenbanken
Leistung Hoch Niedrig
Verlässlichkeit Arm Gut
Verfügbarkeit Gut Gut
Konsistenz Arm Gut
Datenspeicher Optimiert für große Datenmengen Mittelgroß bis groß
Skalierbarkeit Hoch Hoch (aber teurer)


Es ist zu beachten, dass die Tabelle einen Vergleich auf Datenbankebene zeigt, nicht die verschiedenen Datenbankverwaltungssysteme , die beide Modelle implementieren. Diese Systeme bieten ihre eigenen proprietären Techniken , um einige der Probleme und Mängel beider Systeme zu überwinden und in einigen Fällen die Leistung und Zuverlässigkeit erheblich zu verbessern.

NoSQL-Datenspeichertypen

Schlüsselwertspeicher

Beim Key-Value-Store-Typ wird eine Hash-Tabelle verwendet, in der ein eindeutiger Schlüssel auf ein Item zeigt.

Schlüssel können in logische Schlüsselgruppen organisiert werden, wobei Schlüssel nur innerhalb ihrer eigenen Gruppe eindeutig sein müssen. Dies ermöglicht identische Schlüssel in verschiedenen logischen Gruppen. Die folgende Tabelle zeigt ein Beispiel für einen Schlüsselwertspeicher, in dem der Schlüssel der Name der Stadt und der Wert die Adresse der Ulster University in dieser Stadt ist.

Taste Wert
"Belfast" {"Universität Ulster, Campus Belfast, York Street, Belfast, BT15 1ED"}
"Coleraine" {"University of Ulster, Coleraine Campus, Cromore Road, Co. Londonderry, BT52 1SA"}


Einige Implementierungen des Schlüsselwertspeichers bieten Caching-Mechanismen, die ihre Leistung erheblich verbessern.

Alles, was benötigt wird, um mit den in der Datenbank gespeicherten Artikeln umzugehen, ist der Schlüssel. Daten werden in Form eines Strings, JSON oder BLOB (Binary Large OBject) gespeichert.

Einer der größten Mängel bei dieser Art von Datenbank ist der Mangel an Konsistenz auf Datenbankebene. Dies kann von den Entwicklern mit ihrem eigenen Code hinzugefügt werden, aber wie bereits erwähnt, fügt dies mehr Aufwand, Komplexität und Zeit hinzu.

Die bekannteste NoSQL-Datenbank, die auf einem Key-Value-Store aufbaut, ist DynamoDB von Amazon.

Dokumentenspeicher

Dokumentspeicher ähneln Schlüsselwertspeichern darin, dass sie schemalos sind und auf einem Schlüsselwertmodell basieren. Beide haben daher viele der gleichen Vor- und Nachteile. Beiden fehlt es an Konsistenz auf Datenbankebene, was Anwendungen Platz macht, um mehr Zuverlässigkeits- und Konsistenzfunktionen bereitzustellen.

Es gibt jedoch wesentliche Unterschiede zwischen den beiden.

In Dokumentspeichern stellen die Werte (Dokumente) eine Codierung für die gespeicherten Daten bereit. Diese Codierungen können XML, JSON oder BSON (binär codiertes JSON) sein.

Auch Abfragen basierend auf Daten können durchgeführt werden.

Die beliebteste Datenbankanwendung, die sich auf einen Dokumentenspeicher stützt, ist MongoDB.

Säulenspeicher

In einer Column Store-Datenbank werden Daten in Spalten gespeichert, im Gegensatz zu einer Speicherung in Zeilen, wie dies in den meisten Verwaltungssystemen für relationale Datenbanken der Fall ist.

Ein Spaltenspeicher besteht aus einer oder mehreren Spaltenfamilien, die bestimmte Spalten in der Datenbank logisch gruppieren. Ein Schlüssel wird verwendet, um eine Reihe von Spalten in der Datenbank zu identifizieren und darauf zu verweisen, mit einem Schlüsselraumattribut, das den Bereich dieses Schlüssels definiert. Jede Spalte enthält Tupel von Namen und Werten, geordnet und durch Kommas getrennt.

Column Stores haben schnellen Lese-/Schreibzugriff auf die gespeicherten Daten. In einem Spaltenspeicher werden Zeilen, die einer einzelnen Spalte entsprechen, als einzelner Platteneintrag gespeichert. Dies ermöglicht einen schnelleren Zugriff während Lese-/Schreibvorgängen.

Zu den beliebtesten Datenbanken, die den Column Store verwenden, gehören BigTable, HBase und Cassandra von Google.

Diagrammbasis

In einer Graph Base NoSQL-Datenbank wird eine gerichtete Graphstruktur verwendet, um die Daten darzustellen. Der Graph besteht aus Kanten und Knoten.

Formal ist ein Graph eine Darstellung einer Menge von Objekten, wobei einige Paare der Objekte durch Verknüpfungen verbunden sind. Die miteinander verbundenen Objekte werden durch mathematische Abstraktionen dargestellt, die Scheitelpunkte genannt werden, und die Verbindungen, die einige Scheitelpunktpaare verbinden, werden Kanten genannt. Eine Menge von Knoten und die sie verbindenden Kanten nennt man Graph.

Ein Diagramm über Diagramme. Oben in der Mitte befindet sich ein Kästchen namens "Diagramm", aus dem zwei Pfeile herausragen. Beide Pfeile werden "Aufzeichnungen" genannt; Einer zeigt auf ein Feld "Knoten" und der andere auf ein Feld "Beziehungen". Das Feld „Beziehungen“ hat einen „Organisieren“-Pfeil, der auf das Feld „Knoten“ zeigt. Sowohl „Knoten“ als auch „Beziehungen“ haben Pfeile namens „haben“, die auf ein letztes Kästchen zeigen, „Eigenschaften“. Mit anderen Worten, ein Diagramm zeichnet Beziehungen und Knoten auf, die beide Eigenschaften haben, und Beziehungen organisieren Knoten.

Dies veranschaulicht die Struktur einer graphbasierten Datenbank, die Kanten und Knoten verwendet, um Daten darzustellen und zu speichern. Diese Knoten sind durch einige Beziehungen untereinander organisiert, was durch Kanten zwischen den Knoten dargestellt wird. Sowohl die Knoten als auch die Beziehungen haben einige definierte Eigenschaften.

Graphdatenbanken werden am häufigsten in Anwendungen für soziale Netzwerke verwendet. Graphdatenbanken ermöglichen es Entwicklern, sich mehr auf die Beziehungen zwischen Objekten als auf die Objekte selbst zu konzentrieren. In diesem Zusammenhang ermöglichen sie in der Tat eine skalierbare und einfach zu bedienende Umgebung.

Derzeit sind InfoGrid und InfiniteGraph die beliebtesten Graphdatenbanken.

NoSQL-Datenbankverwaltungssysteme

Für einen kurzen Vergleich der Datenbanken bietet die folgende Tabelle einen kurzen Vergleich zwischen verschiedenen NoSQL-Datenbankverwaltungssystemen.

Speichertyp Abfragemethode Schnittstelle Programmiersprache Open Source Reproduzieren
Kassandra Säulenspeicher Sparsamkeits-API Sparsamkeit Java Jawohl Asynchron
MongoDB Dokumentenspeicher Mongo-Abfrage TCP/IP C++ Jawohl Asynchron
HyperTabelle Säulenspeicher HQL Sparsamkeit Java Jawohl Asynchron
CouchDB Dokumentenspeicher Karte verkleinern SICH AUSRUHEN Erlang Jawohl Asynchron
Großer Tisch Säulenspeicher Karte verkleinern TCP/IP C++ Nein Asynchron
HBase Säulenspeicher Karte verkleinern SICH AUSRUHEN Java Jawohl Asynchron


MongoDB verfügt über einen flexiblen Schemaspeicher, was bedeutet, dass gespeicherte Objekte nicht unbedingt dieselbe Struktur oder dieselben Felder haben müssen. MongoDB verfügt auch über einige Optimierungsfunktionen, die die Datensammlungen verteilen, was zu einer Verbesserung der Gesamtleistung und einem ausgewogeneren System führt.

Andere NoSQL-Datenbanksysteme wie Apache CouchDB sind ebenfalls Dokumentenspeicher-Datenbanken und teilen viele Funktionen mit MongoDB, mit der Ausnahme, dass auf die Datenbank über RESTful-APIs zugegriffen werden kann.

REST ist ein Architekturstil, der aus einem koordinierten Satz von Architekturbeschränkungen besteht, die auf Komponenten, Konnektoren und Datenelemente im World Wide Web angewendet werden. Es stützt sich auf ein zustandsloses, zwischenspeicherbares Client-Server-Kommunikationsprotokoll (z. B. das HTTP-Protokoll).

RESTful-Anwendungen verwenden HTTP-Anforderungen, um Daten zu veröffentlichen, zu lesen und zu löschen.

Was spaltenbasierte Datenbanken betrifft, so ist Hypertable eine in C++ geschriebene NoSQL-Datenbank und basiert auf BigTable von Google.

Hypertable unterstützt die Verteilung von Datenspeichern auf Knoten, um die Skalierbarkeit zu maximieren, genau wie MongoDB und CouchDB.

Eine der am weitesten verbreiteten NoSQL-Datenbanken ist Cassandra, die von Facebook entwickelt wurde.

Cassandra ist eine Spaltenspeicherdatenbank, die viele Funktionen enthält, die auf Zuverlässigkeit und Fehlertoleranz abzielen.

Anstatt einen eingehenden Blick auf jedes NoSQL-DBMS zu werfen, werden Cassandra und MongoDB, zwei der am häufigsten verwendeten NoSQL-Datenbankverwaltungssysteme, in den nächsten Unterabschnitten untersucht.

Kassandra

Cassandra ist ein von Facebook entwickeltes Datenbankverwaltungssystem.

Das Ziel hinter Cassandra war es, ein DBMS zu schaffen, das keinen Single Point of Failure hat und maximale Verfügbarkeit bietet.

Cassandra ist hauptsächlich eine Spaltenspeicherdatenbank. Einige Studien bezeichneten Cassandra als Hybridsystem, inspiriert von Googles BigTable, einer Spaltenspeicherdatenbank, und Amazons DynamoDB, einer Schlüsselwertdatenbank.

Dies wird durch die Bereitstellung eines Schlüsselwertsystems erreicht, aber die Schlüssel in Cassandra verweisen auf eine Reihe von Spaltenfamilien, wobei auf das verteilte Dateisystem BigTable von Google und die Verfügbarkeitsfunktionen von Dynamo (verteilte Hash-Tabelle) zurückgegriffen wird.

Cassandra wurde entwickelt, um riesige Datenmengen zu speichern, die auf verschiedene Knoten verteilt sind. Cassandra ist ein DBMS, das entwickelt wurde, um riesige Datenmengen zu verarbeiten, die auf viele Server verteilt sind, und gleichzeitig einen hochverfügbaren Dienst ohne Single Point of Failure bereitzustellen, was für einen großen Dienst wie Facebook unerlässlich ist.

Zu den Hauptfunktionen von Cassandra gehören:

  • Kein Single-Point-of-Failure. Um dies zu erreichen, muss Cassandra auf einem Knoten-Cluster und nicht auf einem einzelnen Computer ausgeführt werden. Das bedeutet nicht, dass die Daten auf jedem Cluster gleich sind, aber die Verwaltungssoftware ist es. Wenn in einem der Knoten ein Fehler auftritt, sind die Daten auf diesem Knoten unzugänglich. Andere Knoten (und Daten) sind jedoch weiterhin zugänglich.
  • Distributed Hashing ist ein Schema, das Hash-Tabellenfunktionalität auf eine Weise bereitstellt, dass das Hinzufügen oder Entfernen eines Slots die Zuordnung von Schlüsseln zu Slots nicht wesentlich ändert. Dies bietet die Möglichkeit, die Last entsprechend ihrer Kapazität auf Server oder Knoten zu verteilen und so Ausfallzeiten zu minimieren.
  • Relativ einfach zu bedienendes Client Interface . Cassandra verwendet Apache Thrift für seine Client-Schnittstelle. Apache Thrift bietet einen sprachübergreifenden RPC-Client, aber die meisten Entwickler bevorzugen Open-Source-Alternativen, die auf Apple Thrift aufbauen, wie z. B. Hector.
  • Andere Verfügbarkeitsfunktionen. Eines der Features von Cassandra ist die Datenreplikation. Im Grunde spiegelt es Daten auf andere Knoten im Cluster. Die Replikation kann zufällig oder spezifisch erfolgen, um den Datenschutz zu maximieren, indem sie beispielsweise in einem Knoten in einem anderen Rechenzentrum platziert wird. Ein weiteres Feature in Cassandra ist die Partitionierungsrichtlinie. Die Partitionierungsrichtlinie entscheidet, wo auf welchem ​​Knoten der Schlüssel abgelegt wird. Dies kann auch zufällig oder der Reihe nach erfolgen. Wenn Sie beide Arten von Partitionierungsrichtlinien verwenden, kann Cassandra ein Gleichgewicht zwischen Lastenausgleich und Optimierung der Abfrageleistung finden.
  • Konsistenz. Funktionen wie die Replikation erschweren die Konsistenz. Dies liegt daran, dass alle Knoten zu jedem Zeitpunkt mit den neusten Werten, bzw. zum Zeitpunkt des Auslösens eines Lesevorgangs, aktuell sein müssen. Schließlich versucht Cassandra jedoch, ein Gleichgewicht zwischen Replikationsaktionen und Lese-/Schreibaktionen aufrechtzuerhalten, indem sie dem Entwickler diese Anpassbarkeit bietet.
  • Lese-/Schreibaktionen. Der Client sendet eine Anfrage an einen einzelnen Cassandra-Knoten. Der Knoten speichert die Daten gemäß der Replikationsrichtlinie im Cluster. Jeder Knoten führt zuerst die Datenänderung im Commit-Protokoll durch und aktualisiert dann die Tabellenstruktur mit der Änderung, beides synchron. Der Lesevorgang ist ebenfalls sehr ähnlich, eine Leseanforderung wird an einen einzelnen Knoten gesendet, und dieser einzelne Knoten ist derjenige, der gemäß der Partitionierungs-/Platzierungsrichtlinie bestimmt, welcher Knoten die Daten enthält.

MongoDB

MongoDB ist eine schemafreie, dokumentenorientierte Datenbank, die in C++ geschrieben ist. Die Datenbank ist dokumentenspeicherbasiert, was bedeutet, dass sie Werte (als Dokumente bezeichnet) in Form von codierten Daten speichert.

Die Wahl des codierten Formats in MongoDB ist JSON. Dies ist leistungsstark, denn selbst wenn die Daten in JSON-Dokumenten verschachtelt sind, sind sie dennoch abfragbar und indexierbar .

In den folgenden Unterabschnitten werden einige der wichtigsten Funktionen beschrieben, die in MongoDB verfügbar sind.

Scherben

Sharding ist das Partitionieren und Verteilen von Daten über mehrere Maschinen (Knoten). Ein Shard ist eine Sammlung von MongoDB-Knoten, im Gegensatz zu Cassandra, wo Knoten symmetrisch verteilt sind. Die Verwendung von Shards bedeutet auch die Möglichkeit, horizontal über mehrere Knoten hinweg zu skalieren. Für den Fall, dass eine Anwendung einen einzelnen Datenbankserver verwendet, kann sie mit sehr wenigen Änderungen am ursprünglichen Anwendungscode in einen Sharding-Cluster konvertiert werden, da das Sharding von MongoDB durchgeführt wird. Oftware ist fast vollständig von den öffentlichen APIs entkoppelt, die der Clientseite ausgesetzt sind.

Mongo-Abfragesprache

Wie bereits erwähnt, verwendet MongoDB eine RESTful-API. Um bestimmte Dokumente aus einer DB-Sammlung abzurufen, wird ein Abfragedokument erstellt, das die Felder enthält, mit denen die gewünschten Dokumente übereinstimmen sollen.

Aktionen

In MongoDB gibt es eine Gruppe von Servern, die als Router bezeichnet werden. Jeder fungiert als Server für einen oder mehrere Clients. In ähnlicher Weise enthält der Cluster eine Gruppe von Servern, die als Konfigurationsserver bezeichnet werden. Jeder enthält eine Kopie der Metadaten, die angibt, welcher Shard welche Daten enthält. Lese- oder Schreibaktionen werden von den Clients an einen der Router-Server im Cluster gesendet und von diesem Server automatisch mit Hilfe der Konfigurationsserver an die entsprechenden Shards weitergeleitet, die die Daten enthalten.

Ähnlich wie bei Cassandra verfügt ein Shard in MongoDB über ein Datenreplikationsschema, das einen Replikatsatz jedes Shards erstellt, der genau dieselben Daten enthält. Es gibt zwei Arten von Replikationsschemata in MongoDB: Master-Slave-Replikation und Replica-Set-Replikation. Replica-Set bietet mehr Automatisierung und eine bessere Fehlerbehandlung, während Master-Slave manchmal den Eingriff des Administrators erfordert. Unabhängig vom Replikationsschema fungiert zu jedem Zeitpunkt in einem Replikatsatz nur ein Shard als primäres Shard, alle anderen Replikat-Shards sind sekundäre Shards. Alle Schreib- und Lesevorgänge gehen zum primären Shard und werden dann (falls erforderlich) gleichmäßig auf die anderen sekundären Shards im Satz verteilt.

In der folgenden Grafik sehen wir die oben erläuterte MongoDB-Architektur, die die Router-Server in Grün, die Konfigurationsserver in Blau und die Shards zeigt, die die MongoDB-Knoten enthalten.

Vier nummerierte Shards enthalten jeweils 3 „Mondgott“-Knoten. Shard4 ist grau gefärbt und mit „replica set“ gekennzeichnet. Shard1 ist mit einer Gruppe von drei blauen „C1 mongod“-Knoten mit der Bezeichnung „config server“ verbunden; Die Gruppe und jeder der Shards ist mit einer Reihe grüner „Mongos“-Knoten verbunden. Diese Reihe ist wiederum mit einer Reihe von Clients verbunden.

Es sollte beachtet werden, dass das Sharding (oder die gemeinsame Nutzung der Daten zwischen den Shards) in MongoDB vollständig automatisch erfolgt, was die Ausfallrate reduziert und MongoDB zu einem hochskalierbaren Datenbankverwaltungssystem macht.

Indizierungsstrukturen für NoSQL-Datenbanken

Indizierung ist der Vorgang, bei dem ein Schlüssel mit dem Speicherort eines entsprechenden Datensatzes in einem DBMS verknüpft wird. Es gibt viele indizierende Datenstrukturen, die in NoSQL-Datenbanken verwendet werden. In den folgenden Abschnitten werden einige der gebräuchlicheren Methoden kurz erörtert; nämlich B-Tree-Indizierung, T-Tree-Indizierung und O2-Tree-Indizierung.

B-Baum-Indizierung

B-Tree ist eine der häufigsten Indexstrukturen in DBMS.

In B-Bäumen können interne Knoten innerhalb eines vordefinierten Bereichs eine variable Anzahl von untergeordneten Knoten haben.

Ein wesentlicher Unterschied zu anderen Baumstrukturen wie AVL besteht darin, dass B-Tree es Knoten ermöglicht, eine variable Anzahl von untergeordneten Knoten zu haben, was weniger Baumausgleich, aber mehr Platzverschwendung bedeutet.

Der B+-Tree ist eine der beliebtesten Varianten von B-Trees. Der B+-Baum ist eine Verbesserung gegenüber dem B-Baum, der erfordert, dass sich alle Schlüssel in den Blättern befinden.

T-Baum-Indizierung

Die Datenstruktur von T-Trees wurde durch die Kombination von Merkmalen von AVL-Trees und B-Trees entworfen.

AVL-Bäume sind eine Art von selbstausgleichenden binären Suchbäumen, während B-Bäume unausgeglichen sind und jeder Knoten eine unterschiedliche Anzahl von Kindern haben kann.

In einem T-Baum ist die Struktur dem AVL-Baum und dem B-Baum sehr ähnlich.

Jeder Knoten speichert mehr als ein {Schlüsselwert, Zeiger}-Tupel. Außerdem wird die binäre Suche in Kombination mit den Mehrfach-Tupel-Knoten verwendet, um eine bessere Speicherung und Leistung zu erzielen.

Ein T-Baum hat drei Arten von Knoten: Einen T-Knoten mit einem rechten und einem linken Kind, einen Blattknoten ohne Kinder und einen Halbblattknoten mit nur einem Kind.

Es wird angenommen, dass T-Bäume eine bessere Gesamtleistung als AVL-Bäume haben.

O2-Tree-Indizierung

Der O2-Baum ist im Grunde eine Verbesserung gegenüber Rot-Schwarz-Bäumen, einer Form eines binären Suchbaums, bei dem die Blattknoten die Tupel {Schlüsselwert, Zeiger} enthalten.

O2-Tree wurde vorgeschlagen, um die Leistung aktueller Indizierungsmethoden zu verbessern. Ein O2-Baum der Ordnung m (m ≥ 2), wobei m der Mindestgrad des Baums ist, erfüllt die folgenden Eigenschaften:

  • Jeder Knoten ist entweder rot oder schwarz. Die Wurzel ist schwarz.
  • Jeder Blattknoten ist schwarz gefärbt und besteht aus einem Block oder einer Seite, die Paare aus „Schlüsselwert, Datensatzzeiger“ enthält.
  • Wenn ein Knoten rot ist, dann sind seine beiden Kinder schwarz.
  • Für jeden internen Knoten enthalten alle einfachen Pfade vom Knoten zu den untergeordneten Blattknoten die gleiche Anzahl schwarzer Knoten. Jeder interne Knoten enthält einen einzelnen Schlüsselwert.
  • Blattknoten sind Blöcke, die zwischen ⌈m/2⌉ und m „Schlüsselwert, Datensatzzeiger“-Paare haben.
  • Wenn ein Baum einen einzigen Knoten hat, muss es sich um ein Blatt handeln, das die Wurzel des Baums darstellt, und es kann zwischen 1 und m Schlüsseldaten enthalten.
  • Blattknoten sind in Vorwärts- und Rückwärtsrichtung doppelt verknüpft.

Hier sehen wir einen direkten Leistungsvergleich zwischen O2-Tree, T-Tree, B+-Tree, AVL-Tree und Red-Black Tree:

Ein Diagramm, das „Gesamtzeit in Sekunden“ (0–250) auf der Y-Achse mit „Aktualisierungsverhältnis“ (0–100) auf der X-Achse vergleicht. Die fünf Baumtypen beginnen alle mit Gesamtzeiten unter 100 auf der linken Seite und erhöhen sich dann auf der rechten Seite. O2-Tree, T-Tree und AVL-Tree steigen langsamer als die anderen beiden nach rechts, wobei AVL-Tree bei etwa 125 endet, O2-Tree bei etwa 75 endet und T-Tree irgendwo dazwischen liegt. Rot-Schwarz-Baum und B+-Baum haben mehr Höhen und Tiefen, und beide enden oben rechts nahe beieinander, wobei Rot-Schwarz-Baum dort einen etwas höheren Wert hat.

Die Reihenfolge des verwendeten T-Baums, B+-Baums und O2-Baums war m = 512.

Die Zeit wird für Such-, Einfügungs- und Löschoperationen mit Aktualisierungsverhältnissen aufgezeichnet, die zwischen 0 % und 100 % für einen Index von 50 Millionen Datensätzen variieren, wobei die Operationen dazu führen, dass dem Index weitere 50 Millionen Datensätze hinzugefügt werden.

Es ist klar, dass B-Tree und T-Tree mit einer Aktualisierungsrate von 0-10% besser abschneiden als O2-Tree. Mit zunehmender Aktualisierungsrate schneidet der O2-Tree-Index jedoch deutlich besser ab als die meisten anderen Datenstrukturen, wobei die B-Tree- und Red-Black-Tree-Strukturen am meisten leiden.

Der Fall für NoSQL?

Eine kurze Einführung in NoSQL-Datenbanken, die die Schlüsselbereiche hervorhebt, in denen traditionelle relationale Datenbanken zu kurz kommen, führt zum ersten Takeaway:

Obwohl relationale Datenbanken Konsistenz bieten, sind sie nicht für hohe Leistung in Anwendungen optimiert, in denen häufig umfangreiche Daten gespeichert und verarbeitet werden.

NoSQL-Datenbanken erfreuten sich aufgrund ihrer hohen Leistung, hohen Skalierbarkeit und einfachen Zugänglichkeit großer Beliebtheit; es fehlen ihnen jedoch noch Funktionen, die für Konsistenz und Zuverlässigkeit sorgen.

Glücklicherweise gehen einige NoSQL-DBMS diese Herausforderungen an, indem sie neue Funktionen zur Verbesserung der Skalierbarkeit und Zuverlässigkeit anbieten.

Nicht alle NoSQL-Datenbanksysteme sind leistungsfähiger als relationale Datenbanken.

MongoDB und Cassandra haben bei Schreib- und Löschvorgängen eine ähnliche und in den meisten Fällen bessere Leistung als relationale Datenbanken.

Es besteht kein direkter Zusammenhang zwischen dem Speichertyp und der Leistung eines NoSQL-DBMS. NoSQL-Implementierungen unterliegen Änderungen, sodass die Leistung variieren kann.

Daher sollten Leistungsmessungen über Datenbanktypen in verschiedenen Studien immer mit den neuesten Versionen der Datenbanksoftware aktualisiert werden, damit diese Zahlen genau sind.

Ich kann zwar kein endgültiges Urteil über die Leistung abgeben, aber hier sind ein paar Punkte, die Sie beachten sollten:

  • Herkömmliche B-Baum- und T-Baum-Indizierung wird üblicherweise in traditionellen Datenbanken verwendet.
  • Eine Studie bot Verbesserungen und Erweiterungen durch die Kombination der Merkmale mehrerer Indizierungsstrukturen, um den O2-Tree zu entwickeln.
  • Der O2-Tree übertraf in den meisten Tests andere Strukturen, insbesondere bei riesigen Datensätzen und hohen Aktualisierungsraten.
  • Die B-Tree-Struktur lieferte die schlechteste Leistung aller in diesem Artikel behandelten Indizierungsstrukturen.

Weitere Arbeiten können und sollten durchgeführt werden, um die Konsistenz von NoSQL-DBMSs zu verbessern. Die Integration beider Systeme, NoSQL und relationale Datenbanken, ist ein Bereich, der weiter erforscht werden muss.

Schließlich ist es wichtig zu beachten, dass NoSQL eine gute Ergänzung zu bestehenden Datenbankstandards ist, jedoch mit einigen wichtigen Einschränkungen. NoSQL tauscht Zuverlässigkeits- und Konsistenzfunktionen gegen reine Leistung und Skalierbarkeit. Dies macht es zu einer spezialisierten Lösung, da die Anzahl der Anwendungen, die auf NoSQL-Datenbanken zurückgreifen können, begrenzt bleibt.

Die Oberseite? Spezialisierung bietet vielleicht nicht viel Flexibilität, aber wenn Sie eine spezialisierte Arbeit so schnell und effizient wie möglich erledigen möchten, brauchen Sie kein Schweizer Taschenmesser. Sie benötigen NoSQL.

Verwandt: Business-Intelligence-Plattform: Lernprogramm zur Verwendung der MongoDB-Aggregationspipeline