Ich sehe eine Menge Verwirrung über den Platz und den Zweck der vielen neuen Datenbanklösungen („NoSQL-Datenbanken“) im Vergleich zu den relationalen Datenbanklösungen, die es seit vielen Jahren gibt. Lassen Sie mich daher versuchen, die Unterschiede und die besten Anwendungsfälle für beide zu erklären.
Zunächst lassen sich diese Datenbanklösungen in zwei Gruppen einteilen:
1) Relationale Datenbanken, die auch als relationale Datenbankmanagementsysteme (RDBMS) oder SQL-Datenbanken bezeichnet werden können. Die bekanntesten davon sind Microsoft SQL Server, Oracle Database, MySQL und IBM DB2. Diese RDBMS werden meist in großen Unternehmensszenarien eingesetzt, mit Ausnahme von MySQL, das meist zur Speicherung von Daten für Webanwendungen verwendet wird, typischerweise als Teil des beliebten LAMP-Stacks (Linux, Apache, MySQL, PHP/Python/Perl).
2) Nicht-relationale Datenbanken, auch NoSQL-Datenbanken genannt, zu den beliebtesten gehören MongoDB, DocumentDB, Cassandra, Coachbase, HBase, Redis und Neo4j. Diese Datenbanken werden in der Regel in vier Kategorien eingeteilt: Key-Value-Stores, Graph-Stores, Column-Stores und Document-Stores (siehe Typen von NoSQL-Datenbanken).
Alle relationalen Datenbanken können für die Verwaltung transaktionsorientierter Anwendungen (OLTP) verwendet werden, und die meisten nicht-relationalen Datenbanken, die zu den Kategorien Document-Stores und Column-Stores gehören, können auch für OLTP verwendet werden, was die Verwirrung noch vergrößert. OLTP-Datenbanken können als „operative“ Datenbanken betrachtet werden, die durch häufige, kurze Transaktionen gekennzeichnet sind, die Aktualisierungen beinhalten und eine kleine Datenmenge betreffen und bei denen die Gleichzeitigkeit von Tausenden von Transaktionen sehr wichtig ist (Beispiele hierfür sind Bankanwendungen und Online-Reservierungen). Da die Integrität der Daten sehr wichtig ist, unterstützen sie ACID-Transaktionen (Atomicity, Consistency, Isolation, Durability). Dies steht im Gegensatz zu Data Warehouses, die als „analytische“ Datenbanken gelten, die sich durch lange, komplexe Abfragen auszeichnen, die eine große Datenmenge betreffen und viele Ressourcen erfordern. Aktualisierungen sind selten. Ein Beispiel ist die Analyse der Umsätze des letzten Jahres.
Relationale Datenbanken arbeiten in der Regel mit strukturierten Daten, während nicht-relationale Datenbanken in der Regel mit halbstrukturierten Daten (z.B. XML, JSON) arbeiten.
Schauen wir uns jede Gruppe genauer an:
Relationale Datenbanken
Eine relationale Datenbank ist auf der Grundlage des relationalen Datenmodells organisiert, wie es 1970 von E.F. Codd vorgeschlagen wurde. Dieses Modell organisiert die Daten in einer oder mehreren Tabellen (oder „Relationen“) mit Zeilen und Spalten, wobei jede Zeile einen eindeutigen Schlüssel hat. Im Allgemeinen hat jeder Entitätstyp, der in einer Datenbank beschrieben wird, seine eigene Tabelle, wobei die Zeilen die Instanzen dieses Entitätstyps und die Spalten die dieser Instanz zugeordneten Werte darstellen. Da jede Zeile in einer Tabelle ihren eigenen eindeutigen Schlüssel hat, können Zeilen in einer Tabelle mit Zeilen in anderen Tabellen verknüpft werden, indem der eindeutige Schlüssel der Zeile, mit der sie verknüpft werden soll, gespeichert wird (wobei dieser eindeutige Schlüssel als „Fremdschlüssel“ bezeichnet wird). Codd zeigte, dass Datenbeziehungen beliebiger Komplexität mit Hilfe dieses einfachen Konzepts dargestellt werden können.
Fast alle relationalen Datenbanksysteme verwenden SQL (Structured Query Language) als Sprache für die Abfrage und Pflege der Datenbank.
Die Gründe für die Dominanz relationaler Datenbanken sind: Einfachheit, Robustheit, Flexibilität, Leistung, Skalierbarkeit und Kompatibilität bei der Verwaltung generischer Daten.
Um all dies bieten zu können, müssen relationale Datenbanken jedoch intern unglaublich komplex sein. Eine relativ einfache SELECT-Anweisung kann beispielsweise Dutzende von möglichen Abfrageausführungspfaden haben, die ein Abfrageoptimierer zur Laufzeit auswertet. All dies bleibt den Benutzern verborgen, aber unter der Haube bestimmt das RDBMS den besten „Ausführungsplan“ zur Beantwortung von Anfragen, indem es Dinge wie kostenbasierte Algorithmen einsetzt.
Bei großen Datenbanken, insbesondere solchen, die für Webanwendungen verwendet werden, ist die Skalierbarkeit das Hauptanliegen. Da immer mehr Anwendungen in Umgebungen mit massiven Arbeitslasten (z. B. Amazon) erstellt werden, können sich ihre Skalierungsanforderungen sehr schnell ändern und sehr groß werden. Relationale Datenbanken lassen sich gut skalieren, aber in der Regel nur, wenn die Skalierung auf einem einzigen Server erfolgt („Scale-up“). Wenn die Kapazität dieses einzelnen Servers erreicht ist, müssen Sie „ausskalieren“ und die Last auf mehrere Server verteilen, was zu einer so genannten verteilten Datenverarbeitung führt. An diesem Punkt beginnt die Komplexität relationaler Datenbanken Probleme mit ihrem Skalierungspotenzial zu verursachen. Wenn Sie versuchen, Hunderte oder Tausende von Servern zu skalieren, wird die Komplexität überwältigend. Die Eigenschaften, die relationale Datenbanken so attraktiv machen, sind dieselben, die auch ihre Eignung als Plattformen für große verteilte Systeme drastisch einschränken.
Nicht-relationale Datenbanken
Eine NoSQL-Datenbank bietet einen Mechanismus für die Speicherung und den Abruf von Daten, der auf andere Weise als die in relationalen Datenbanken verwendeten tabellarischen Beziehungen modelliert ist.
Motivationen für diesen Ansatz sind unter anderem:
- Einfachheit des Designs. Man muss sich nicht mit dem „Impedance Mismatch“ zwischen dem objektorientierten Ansatz zum Schreiben von Anwendungen und den schema-basierten Tabellen und Zeilen einer relationalen Datenbank auseinandersetzen. Beispielsweise können alle Informationen zu Kundenbestellungen in einem Dokument gespeichert werden, anstatt viele Tabellen miteinander zu verknüpfen, so dass weniger Code geschrieben, debuggt und gewartet werden muss
- Bessere „horizontale“ Skalierung auf Cluster von Rechnern, was das Problem löst, wenn die Zahl der gleichzeitigen Benutzer für Anwendungen, die über das Web und mobile Geräte zugänglich sind, in die Höhe schießt. Die Verwendung von Dokumenten erleichtert die Skalierung, da alle Informationen zu einer Kundenbestellung an einem Ort gespeichert sind und nicht auf mehrere Tabellen verteilt werden müssen. NoSQL-Datenbanken verteilen die Daten automatisch auf die Server, ohne dass Änderungen an der Anwendung erforderlich sind (Auto-Sharding), d. h. sie verteilen die Daten nativ und automatisch auf eine beliebige Anzahl von Servern, ohne dass die Anwendung die Zusammensetzung des Serverpools kennen muss. Daten und Abfragelast werden automatisch auf die Server verteilt, und wenn ein Server ausfällt, kann er schnell und transparent ersetzt werden, ohne dass die Anwendung unterbrochen wird
- Bessere Kontrolle der Verfügbarkeit. Server können ohne Ausfallzeiten der Anwendung hinzugefügt oder entfernt werden. Die meisten NoSQL-Datenbanken unterstützen die Datenreplikation, d. h. die Speicherung mehrerer Kopien von Daten im gesamten Cluster oder sogar in verschiedenen Rechenzentren, um eine hohe Verfügbarkeit und Disaster Recovery zu gewährleisten
- Einfache Erfassung aller Arten von Daten „Big Data“, einschließlich unstrukturierter und halbstrukturierter Daten. Ermöglichung einer flexiblen Datenbank, die einfach und schnell jede neue Art von Daten aufnehmen kann und nicht durch Änderungen der Inhaltsstruktur gestört wird. Der Grund dafür ist, dass Dokumentendatenbanken keine Schemata verwenden, so dass Sie den JSON-Dokumenten beliebig viele Felder hinzufügen können, ohne vorher Änderungen definieren zu müssen (Schema-on-read statt Schema-on-write). Sie können Dokumente mit einer anderen Anzahl von Feldern haben als andere Dokumente. Zum Beispiel kann ein Patientendatensatz Felder enthalten, die Allergien
- Geschwindigkeit auflisten oder nicht. Die von NoSQL-Datenbanken verwendeten Datenstrukturen (z. B. JSON-Dokumente) unterscheiden sich von denen, die standardmäßig in relationalen Datenbanken verwendet werden. Dadurch sind viele Operationen in NoSQL-Datenbanken schneller als in relationalen Datenbanken, da keine Tabellen verknüpft werden müssen (auf Kosten eines größeren Speicherplatzes aufgrund der Duplizierung von Daten – aber Speicherplatz ist heutzutage so billig, dass dies normalerweise kein Problem darstellt). In der Tat unterstützen die meisten NoSQL-Datenbanken nicht einmal Joins
- Kosten. NoSQL-Datenbanken verwenden in der Regel Cluster aus billigen Standardservern, während RDBMS in der Regel auf teure proprietäre Server und Speichersysteme angewiesen sind. Außerdem können die Lizenzen für RDBMS-Systeme recht teuer sein, während viele NoSQL-Datenbanken quelloffen und daher kostenlos sind
Die besondere Eignung einer bestimmten NoSQL-Datenbank hängt von dem Problem ab, das sie lösen muss.
NoSQL-Datenbanken werden zunehmend in Big-Data- und Echtzeit-Webanwendungen eingesetzt. Sie wurden mit der Einführung des Webs populär, als Datenbanken von maximal ein paar hundert Benutzern in einer internen Unternehmensanwendung zu Tausenden oder Millionen von Benutzern in einer Webanwendung wurden. NoSQL-Systeme werden auch als „Not only SQL“ bezeichnet, um zu betonen, dass sie auch SQL-ähnliche Abfragesprachen unterstützen können.
Viele NoSQL-Speicher gehen Kompromisse bei der Konsistenz (im Sinne des CAP-Theorems) zugunsten von Verfügbarkeit und Partitionstoleranz ein. Zu den Gründen, die der Einführung von NoSQL-Speichern im Wege stehen, gehören die Verwendung von Abfragesprachen auf niedriger Ebene, das Fehlen standardisierter Schnittstellen und hohe Investitionen in vorhandenes SQL. Außerdem verfügen die meisten NoSQL-Speicher nicht über echte ACID-Transaktionen oder unterstützen Transaktionen nur unter bestimmten Umständen und auf bestimmten Ebenen (z. B. auf Dokumentenebene). Schließlich sind RDBMS in der Regel viel einfacher zu bedienen, da sie über eine grafische Benutzeroberfläche verfügen, während viele NoSQL-Lösungen eine Befehlszeilenschnittstelle verwenden.
Vergleich der beiden
Eine der schwerwiegendsten Einschränkungen relationaler Datenbanken ist, dass jedes Element nur ein Attribut enthalten kann. Nehmen wir das Beispiel einer Bank: Jeder Aspekt der Beziehung zwischen einem Kunden und einer Bank wird als separate Zeile in separaten Tabellen gespeichert. So befinden sich die Stammdaten des Kunden in einer Tabelle, die Kontodaten in einer anderen Tabelle, die Darlehensdaten in einer weiteren Tabelle, die Geldanlagen in einer anderen Tabelle und so weiter. Alle diese Tabellen sind durch Beziehungen wie Primär- und Fremdschlüssel miteinander verbunden.
Nicht-relationale Datenbanken, insbesondere die Schlüssel-Wert-Speicher oder Schlüssel-Wert-Paare einer Datenbank, unterscheiden sich grundlegend von diesem Modell. Schlüssel-Wert-Paare ermöglichen es, mehrere zusammengehörige Elemente in einer „Zeile“ von Daten in derselben Tabelle zu speichern. Wir setzen das Wort „Zeile“ in Anführungszeichen, weil eine Zeile hier nicht wirklich dasselbe ist wie eine Zeile in einer relationalen Tabelle. In einer nicht-relationalen Tabelle für dieselbe Bank würde beispielsweise jede Zeile die Daten des Kunden sowie seine Konto-, Kredit- und Anlagedaten enthalten. Alle Daten, die sich auf einen Kunden beziehen, würden bequem in einem einzigen Datensatz gespeichert.
Dies scheint eine offensichtlich überlegene Methode zum Speichern von Daten zu sein, aber sie hat einen großen Nachteil: Schlüssel-Wert-Speicher können im Gegensatz zu relationalen Datenbanken keine Beziehungen zwischen Datenelementen erzwingen. In unserer Key-Value-Datenbank würden beispielsweise die Kundendaten (Name, Sozialversicherungsnummer, Adresse, Kontonummer, Kreditbearbeitungsnummer usw.) alle in einem einzigen Datensatz gespeichert (anstatt in mehreren Tabellen, wie im relationalen Modell). Die Transaktionen des Kunden (Kontoabhebungen, Kontoeinzahlungen, Kreditrückzahlungen, Bankgebühren usw.) würden ebenfalls als ein einziger Datensatz gespeichert.
Im relationalen Modell gibt es eine eingebaute und narrensichere Methode, um die Geschäftslogik und die Regeln auf der Datenbankebene zu gewährleisten und durchzusetzen, z.B. dass eine Abhebung dem richtigen Bankkonto belastet wird, und zwar durch Primärschlüssel und Fremdschlüssel. Bei Key-Value-Speichern liegt diese Verantwortung direkt bei der Anwendungslogik, und viele Leute fühlen sich nicht wohl dabei, diese entscheidende Verantwortung nur der Anwendung zu überlassen. Dies ist ein Grund, warum relationale Datenbanken auch weiterhin verwendet werden.
Bei webbasierten Anwendungen, die Datenbanken verwenden, hat der Aspekt der strikten Durchsetzung der Geschäftslogik jedoch oft nicht die höchste Priorität. Höchste Priorität hat die Fähigkeit, eine große Anzahl von Benutzeranfragen zu bedienen, bei denen es sich in der Regel um reine Leseanfragen handelt. Auf einer Website wie eBay beispielsweise stöbern die meisten Benutzer einfach nur und sehen sich die eingestellten Artikel an (reine Lesevorgänge). Nur ein Bruchteil dieser Benutzer gibt tatsächlich Gebote ab oder reserviert die Artikel (Lese- und Schreibvorgänge). Und bedenken Sie, dass es sich um Millionen, manchmal Milliarden von Seitenaufrufen pro Tag handelt. Die Administratoren der eBay-Website sind eher an einer schnellen Reaktionszeit interessiert, um den Benutzern ein schnelleres Laden der Seite zu ermöglichen, als an den traditionellen Prioritäten der Durchsetzung von Geschäftsregeln oder der Gewährleistung eines Gleichgewichts zwischen Lese- und Schreibvorgängen.
Relationale Modelldatenbanken können so optimiert und eingerichtet werden, dass sie umfangreiche Nur-Lese-Operationen im Rahmen von Data Warehousing ausführen und so potenziell eine große Anzahl von Benutzern bedienen können, die eine große Datenmenge abfragen, insbesondere wenn sie relationale MPP-Architekturen wie Analytics Platform System, Teradata, Oracle Exadata oder IBM Netezza verwenden, die alle eine Skalierung unterstützen. Wie bereits erwähnt, unterscheiden sich Data Warehouses von typischen Datenbanken dadurch, dass sie für komplexere Analysen von Daten verwendet werden. Dies unterscheidet sie von Transaktionsdatenbanken (OLTP), deren Haupteinsatzgebiet die Unterstützung operativer Systeme und die tägliche Berichterstattung in kleinem Umfang ist.
Die eigentliche Herausforderung besteht jedoch in der mangelnden Skalierbarkeit des relationalen Modells, wenn es um OLTP-Anwendungen oder Lösungen mit vielen einzelnen Schreibvorgängen geht, was die Domäne der relationalen SMP-Architekturen ist. Hier können nicht-relationale Modelle wirklich glänzen. Sie können ihre Datenlasten problemlos auf Dutzende, Hunderte und in Extremfällen (z. B. Google-Suche) sogar Tausende von Servern verteilen. Da jeder Server nur einen kleinen Prozentsatz der gesamten Benutzeranfragen bearbeitet, ist die Antwortzeit für jeden einzelnen Benutzer sehr gut. Dieses Modell der verteilten Datenverarbeitung kann zwar auch für relationale Datenbanken entwickelt werden, ist aber sehr mühsam zu implementieren, vor allem, wenn viele Schreibvorgänge anfallen (z. B. OLTP) und Techniken wie Sharding erforderlich sind, die in der Regel einen erheblichen Programmieraufwand außerhalb der Geschäftslogik der Anwendung erfordern. Der Grund dafür ist, dass das relationale Modell auf Datenintegrität auf allen Ebenen besteht, die auch dann gewahrt bleiben muss, wenn auf die Daten von mehreren verschiedenen Servern zugegriffen wird und sie verändert werden. Dies ist der Grund dafür, dass das nicht-relationale Modell die bevorzugte Architektur für Webanwendungen wie Cloud-Computing und soziale Netzwerke ist.
Zusammenfassend lässt sich sagen, dass RDBMS bei hohen Transaktionslasten (Millionen von Lese- und Schreibvorgängen) nicht horizontal skalieren können, während NoSQL-Datenbanken hohe Transaktionslasten bewältigen können, allerdings auf Kosten der Datenintegrität und der Joins.
Denken Sie daran, dass viele Lösungen eine Kombination aus relationalen und nicht-relationalen Datenbanken verwenden werden (siehe Was ist Polyglot Persistence?).
Auch kann es sein, dass Sie die Leistung einer nicht-relationalen Datenbank nicht benötigen und stattdessen die Speicherung von Dateien im HDFS und die Verwendung von Apache Hive ausreichen (Apache Hive ist eine Data-Warehouse-Infrastruktur, die auf Hadoop aufbaut und Datenzusammenfassung, -abfrage und -analyse über eine SQL-ähnliche Sprache namens HiveQL ermöglicht).
Und um mit einer Anmerkung zu enden, die zur Verwirrung beiträgt, haben wir eine weitere Kategorie namens NewSQL gebildet: NewSQL ist eine Klasse moderner RDBMS, die die gleiche skalierbare Leistung von NoSQL-Systemen für OLTP-Lese-/Schreib-Arbeitslasten bieten und gleichzeitig die ACID-Garantien eines traditionellen relationalen Datenbanksystems aufrechterhalten sollen. Der Nachteil ist, dass sie sich nicht für OLAP-ähnliche Abfragen eignen und für Datenbanken mit einer Größe von mehr als einigen Terabytes ungeeignet sind. Beispiele sind VoltDB, NuoDB, MemSQL, SAP HANA, Splice Machine, Clustrix und Altibase.
Ein Bild, das die Kategorien zeigt, in die viele der Produkte passen:
Eine ausgezeichnete Grafik, die zeigt, wie all die Technologien in die Azure-Cloud passen, stammt aus Understanding NoSQL on Microsoft Azure:
Eine NoSQL-Lösung bietet sich unterm Strich an, wenn Sie eine OLTP-Anwendung mit Tausenden von Nutzern und einer sehr großen Datenbank haben, die eine Scale-Out-Lösung erfordert und/oder JSON-Daten verwendet, insbesondere wenn diese JSON-Daten verschiedene Strukturen haben. Sie haben auch den Vorteil der hohen Verfügbarkeit, da NoSQL-Lösungen mehrere Kopien der Daten speichern. Bedenken Sie jedoch, dass Sie für die Leistung möglicherweise die Datenkonsistenz opfern, ebenso wie die Möglichkeit, Daten zu verknüpfen, SQL zu verwenden und schnelle Massenaktualisierungen durchzuführen.
Weitere Informationen:
MySQL vs. MongoDB
MySQL vs. MongoDB MongoDB: Relationale und nicht-relationale Datenbanken im Vergleich
10 Dinge, die Sie über NoSQL-Datenbanken wissen sollten
Einführung in Datenbanken
Unterschied zwischen SQL und NoSQL: Vergleich
SQL vs. NoSQL-Datenbank Unterschiede erklärt mit wenigen Beispielen
NoSQL, NewSQL, oder RDBMS: How To Choose
NewSQL – RDBMS on Steroids
NoSQL vs NewSQL Datenbanken Wählen Sie das richtige Werkzeug für den richtigen Job
SQL vs NoSQL: Sie wollen standardmäßig einen relationalen Speicher haben
Oracle verteidigt relationale DBs gegen NoSQL-Konkurrenten
NoSQL auf Microsoft Azure verstehen
Meet the Avant-Garde of New Relational Databases
SQL oder NoSQL? Das ist die Datenbankfrage
CAP-Theorem: Revisited
Was ist wirklich neu an NewSQL?
MongoDB vs MySQL: Eine vergleichende Studie über Datenbanken
SQL- und NoSQL-Datenbankmerkmale und Unterschiede