NoSQL

Aus besserwiki.de

Eine NoSQL-Datenbank (ursprünglich "non-SQL" oder "nicht-relational") bietet einen Mechanismus für die Speicherung und den Abruf von Daten, die auf andere Weise als durch die in relationalen Datenbanken verwendeten tabellarischen Beziehungen modelliert sind. Solche Datenbanken gibt es seit den späten 1960er Jahren, aber der Name "NoSQL" wurde erst zu Beginn des 21. Jahrhunderts geprägt, ausgelöst durch die Bedürfnisse von Web 2.0-Unternehmen. NoSQL-Datenbanken werden zunehmend in Big Data- und Echtzeit-Webanwendungen eingesetzt. NoSQL-Systeme werden manchmal auch als "Not only SQL" bezeichnet, um zu betonen, dass sie SQL-ähnliche Abfragesprachen unterstützen oder neben SQL-Datenbanken in polyglott-persistenten Architekturen eingesetzt werden können.

Zu den Beweggründen für diesen Ansatz gehören die Einfachheit des Designs, die einfachere "horizontale" Skalierung auf Cluster von Rechnern (was bei relationalen Datenbanken ein Problem darstellt), die bessere Kontrolle über die Verfügbarkeit und die Begrenzung des objektrelationalen Impedanzfehlers. Die von NoSQL-Datenbanken verwendeten Datenstrukturen (z. B. Schlüssel-Wert-Paare, breite Spalten, Graphen oder Dokumente) unterscheiden sich von denen, die standardmäßig in relationalen Datenbanken verwendet werden, was einige Operationen in NoSQL schneller macht. Die besondere Eignung einer bestimmten NoSQL-Datenbank hängt von dem Problem ab, das sie lösen muss. Manchmal werden die von NoSQL-Datenbanken verwendeten Datenstrukturen auch als "flexibler" als relationale Datenbanktabellen angesehen.

Viele NoSQL-Speicher gehen Kompromisse bei der Konsistenz (im Sinne des CAP-Theorems) zu Gunsten von Verfügbarkeit, Partitionstoleranz und Geschwindigkeit ein. Zu den Hindernissen, die einer stärkeren Verbreitung von NoSQL-Speichern im Wege stehen, gehören die Verwendung von Abfragesprachen auf niedriger Ebene (z. B. anstelle von SQL), die fehlende Möglichkeit, Ad-hoc-Joins zwischen Tabellen durchzuführen, das Fehlen standardisierter Schnittstellen und die enormen früheren Investitionen in bestehende relationale Datenbanken. Die meisten NoSQL-Speicher verfügen nicht über echte ACID-Transaktionen, obwohl einige wenige Datenbanken diese zu einem zentralen Bestandteil ihres Designs gemacht haben.

Stattdessen bieten die meisten NoSQL-Datenbanken ein Konzept der "eventuellen Konsistenz", bei dem Datenbankänderungen "irgendwann" (in der Regel innerhalb von Millisekunden) an alle Knoten weitergegeben werden, so dass Datenabfragen möglicherweise nicht sofort aktualisierte Daten zurückgeben oder dazu führen, dass Daten gelesen werden, die nicht korrekt sind, ein Problem, das als "stale reads" bekannt ist. Außerdem kann es bei einigen NoSQL-Systemen zu verlorenen Schreibvorgängen und anderen Formen des Datenverlusts kommen. Einige NoSQL-Systeme bieten Konzepte wie das Write-Ahead-Logging, um Datenverluste zu vermeiden. Bei der verteilten Transaktionsverarbeitung über mehrere Datenbanken hinweg stellt die Datenkonsistenz eine noch größere Herausforderung dar, die sowohl für NoSQL- als auch für relationale Datenbanken schwierig ist. Relationale Datenbanken "erlauben keine datenbankübergreifenden Einschränkungen der referentiellen Integrität". Nur wenige Systeme unterstützen sowohl ACID-Transaktionen als auch X/Open XA-Standards für die verteilte Transaktionsverarbeitung. Interaktive relationale Datenbanken haben Techniken zur Analyse von Konformitätsrelationen als gemeinsames Merkmal. Beschränkungen innerhalb der Schnittstellenumgebung werden durch semantische Virtualisierungsprotokolle überwunden, so dass NoSQL-Dienste für die meisten Betriebssysteme zugänglich sind.

Bekannte Implementierungen sind Riak, Apache Cassandra, CouchDB, MongoDB und Redis.

Geschichte

Der Begriff NoSQL, noch im Sinne von no SQL, wurde erstmals für eine 1998 erschienene einfache Open-Source-Datenbank verwendet, die keine SQL-Zugriffsmöglichkeit bereitstellte. Carlo Strozzi, der Entwickler dieser Datenbank, unterscheidet allerdings die NoSQL-Datenbank von der NoSQL-Bewegung insofern, als erstere eine Datenbank ist, welche auf die Verwendung der Sprache SQL verzichtet, während letztere ein Konzept ist, das vom relationalen Modell Abstand nimmt.

Der Begriff NoSQL im Sinne von Not only SQL wurde Anfang 2009 von Johan Oskarsson für ein Treffen über verteilte strukturierte Datenspeicher neu eingeführt. Der Name war ein Versuch einer gemeinsamen Begriffsfindung für die wachsende Zahl an nicht relationalen, verteilten Datenspeichersystemen, die meist auch auf ACID-Eigenschaften verzichteten.

Dieses Thema ist nicht ganz neu. Die Bestrebung, Daten ohne die Einschränkungen des relationalen Modells zu speichern, war bereits früher unter dem Titel dokumentenorientierte Datenbank bekannt. Insofern sind alle Vertreter dieser Thematik auch als NoSQL-Systeme zu betrachten.

Obwohl sich NoSQL-Systeme kontinuierlich verbreiten, wird der Markt nach wie vor deutlich von relationalen Systemen dominiert (Stand 2020).

Typen und Beispiele

Es gibt verschiedene Möglichkeiten, NoSQL-Datenbanken zu klassifizieren, mit unterschiedlichen Kategorien und Unterkategorien, von denen sich einige überschneiden. Im Folgenden finden Sie eine nicht erschöpfende Klassifizierung nach Datenmodell mit Beispielen:

Typ Bemerkenswerte Beispiele für diesen Typ
Schlüssel-Wert-Cache Apache Ignite, Couchbase, Coherence, eXtreme Scale, Hazelcast, Infinispan, Memcached, Redis, Velocity
Key-Value-Speicher Azure Cosmos DB, ArangoDB, Amazon DynamoDB, Aerospike, Couchbase
Key-Value-Speicher (eventuell konsistent) Azure Cosmos DB, Oracle NoSQL-Datenbank, Riak, Voldemort
Key-Value-Speicher (geordnet) FoundationDB, InfinityDB, LMDB, MemcacheDB
Tupel-Speicher Apache River, GigaSpaces, Tarantool, TIBCO ActiveSpaces, OpenLink Virtuoso
Triplestore AllegroGraph, MarkLogic, Ontotext-OWLIM, Oracle NoSQL-Datenbank, Profium Sense, Virtuoso Universal Server
Objekt-Datenbank Objectivity/DB, Perst, ZopeDB, db4o, GemStone/S, InterSystems Caché, JADE, ObjectDatabase++, ObjectDB, ObjectStore, ODABA, Realm, OpenLink Virtuoso, Versant Object Database, ZODB
Dokumentenspeicher Azure Cosmos DB, ArangoDB, BaseX, Clusterpoint, Couchbase, CouchDB, DocumentDB, eXist-db, IBM Domino, MarkLogic, MongoDB, RavenDB, Qizx, RethinkDB, Elasticsearch, OrientDB
Breiter Spaltenspeicher Azure Cosmos DB, Amazon DynamoDB, Bigtable, Cassandra, Google Cloud Datastore, HBase, Hypertable, ScyllaDB
Native Multimodell-Datenbank ArangoDB, Azure Cosmos DB, OrientDB, MarkLogic, Apache Ignite, Couchbase, FoundationDB, MarkLogic, Oracle Database
Graph-Datenbank Azure Cosmos DB, AllegroGraph, ArangoDB, InfiniteGraph, Apache Giraph, MarkLogic, Neo4J, OrientDB, Virtuoso
Mehrwerte-Datenbank D3 Pick-Datenbank, Extensible Storage Engine (ESE/NT), InfinityDB, InterSystems Caché, jBASE Pick-Datenbank, mvBase Rocket Software, mvEnterprise Rocket Software, Northgate Information Solutions Reality (die ursprüngliche Pick/MV-Datenbank), OpenQM, Revelation Software's OpenInsight (Windows) und Advanced Revelation (DOS), UniData Rocket U2, UniVerse Rocket U2

Key-Value-Speicher

Key-Value (KV)-Speicher verwenden das assoziative Array (auch Map oder Dictionary genannt) als grundlegendes Datenmodell. In diesem Modell werden die Daten als eine Sammlung von Schlüssel-Wert-Paaren dargestellt, so dass jeder mögliche Schlüssel höchstens einmal in der Sammlung vorkommt.

Das Key-Value-Modell ist eines der einfachsten nicht-trivialen Datenmodelle, und reichhaltigere Datenmodelle werden oft als Erweiterung dieses Modells implementiert. Das Schlüssel-Wert-Modell kann zu einem diskret geordneten Modell erweitert werden, bei dem die Schlüssel in lexikografischer Reihenfolge verwaltet werden. Diese Erweiterung ist insofern rechenintensiv, als sie selektive Schlüsselbereiche effizient abrufen kann.

Schlüssel-Wert-Speicher können Konsistenzmodelle verwenden, die von eventueller Konsistenz bis zur Serialisierbarkeit reichen. Einige Datenbanken unterstützen die Ordnung von Schlüsseln. Es gibt verschiedene Hardware-Implementierungen, und einige Benutzer speichern Daten im Arbeitsspeicher (RAM), während andere sie auf Solid-State-Laufwerken (SSD) oder rotierenden Festplatten (auch Festplattenlaufwerk genannt) speichern.

Dokumentenspeicher

Das zentrale Konzept eines Dokumentenspeichers ist das eines "Dokuments". Auch wenn sich die Details dieser Definition bei den dokumentenorientierten Datenbanken unterscheiden, gehen sie alle davon aus, dass Dokumente Daten (oder Informationen) in einigen Standardformaten oder -kodierungen kapseln und kodieren. Zu den gebräuchlichen Kodierungen gehören XML, YAML und JSON sowie binäre Formen wie BSON. Dokumente werden in der Datenbank über einen eindeutigen Schlüssel adressiert, der das jeweilige Dokument repräsentiert. Ein weiteres Merkmal einer dokumentenorientierten Datenbank ist eine API oder Abfragesprache zum Abrufen von Dokumenten auf der Grundlage ihres Inhalts.

Verschiedene Implementierungen bieten unterschiedliche Möglichkeiten, Dokumente zu organisieren und/oder zu gruppieren:

  • Sammlungen
  • Schlagwörter
  • Nicht sichtbare Metadaten
  • Verzeichnis-Hierarchien

Im Vergleich zu relationalen Datenbanken können Sammlungen als analog zu Tabellen und Dokumente als analog zu Datensätzen betrachtet werden. Aber sie unterscheiden sich: Jeder Datensatz in einer Tabelle hat die gleiche Abfolge von Feldern, während Dokumente in einer Sammlung völlig unterschiedliche Felder haben können.

Graph

Graphdatenbanken sind für Daten gedacht, deren Beziehungen sich gut als Graph darstellen lassen, der aus Elementen besteht, die durch eine endliche Anzahl von Beziehungen verbunden sind. Beispiele für solche Daten sind soziale Beziehungen, öffentliche Verkehrsverbindungen, Straßenkarten, Netzwerktopologien usw.

Graphdatenbanken und ihre Abfragesprache
Bezeichnung Sprache(n) Anmerkungen
AllegroGraph SPARQL RDF-Tripel-Speicher
Amazon Neptun Gremlin, SPARQL Graph-Datenbank
ArangoDB AQL, JavaScript, GraphQL Multi-Modell-DBMS Dokument, Graph-Datenbank und Key-Value-Speicher
Azure Cosmos DB Gremlin Graph-Datenbank
DEX/Sparksee C++, Java, C#, Python Graph-Datenbank
FlockDB Scala Graph-Datenbank
IBM Db2 SPARQL RDF-Dreifachspeicher, hinzugefügt in DB2 10
InfiniteGraph Java Graph-Datenbank
JanusGraph Java Graph-Datenbank
MarkLogic Java, JavaScript, SPARQL, XQuery Multi-Modell-Dokumenten-Datenbank und RDF-Tripel-Speicher
Neo4j Chiffre Graph-Datenbank
OpenLink Virtuoso C++, C#, Java, SPARQL Hybrid aus Middleware und Datenbank-Engine
Oracle SPARQL 1.1 RDF Triple Store hinzugefügt in 11g
OrientDB Java, SQL Multi-Modell-Datenbank für Dokumente und Graphen
OWLIM Java, SPARQL 1.1 RDF-Tripel-Speicher
Profium Sense Java, SPARQL RDF-Tripel-Speicher
RedisGraph Chiffre Graph-Datenbank
Sqrrl Unternehmen Java Graph-Datenbank
TerminusDB JavaScript, Python, Datalog Quelloffener RDF-Triple-Speicher und Dokumentenspeicher

Leistung

Die Leistung von NoSQL-Datenbanken wird in der Regel anhand des Durchsatzes bewertet, der als Operationen/Sekunde gemessen wird. Bei der Leistungsbewertung muss auf die richtigen Benchmarks geachtet werden, wie z. B. Produktionskonfigurationen, Parameter der Datenbanken, erwartetes Datenvolumen und gleichzeitige Benutzerarbeitslasten.

Ben Scofield bewertete verschiedene Kategorien von NoSQL-Datenbanken wie folgt:

Datenmodell Leistung Skalierbarkeit Flexibilität Komplexität Funktionsumfang
Key-Value-Speicher hoch hoch hoch keine variabel (keine)
Spaltenorientierter Speicher hoch hoch mäßig niedrig minimal
Dokumentorientierter Speicher hoch variabel (hoch) hoch niedrig variabel (niedrig)
Graph-Datenbank variabel variabel hoch hoch Graphentheorie
Relationale Datenbank variabel variabel niedrig mäßig relationale Algebra

Leistungs- und Skalierbarkeitsvergleiche werden in der Regel mit dem YCSB-Benchmark durchgeführt.

Umgang mit relationalen Daten

Da die meisten NoSQL-Datenbanken nicht in der Lage sind, Joins in Abfragen durchzuführen, muss das Datenbankschema im Allgemeinen anders gestaltet werden. Es gibt drei Haupttechniken für den Umgang mit relationalen Daten in einer NoSQL-Datenbank. (Siehe Tabelle Join und ACID-Unterstützung für NoSQL-Datenbanken, die Joins unterstützen).

Mehrere Abfragen

Anstatt alle Daten mit einer Abfrage abzurufen, ist es üblich, mehrere Abfragen durchzuführen, um die gewünschten Daten zu erhalten. NoSQL-Abfragen sind oft schneller als herkömmliche SQL-Abfragen, so dass die Kosten für zusätzliche Abfragen akzeptabel sein können. Wenn eine übermäßige Anzahl von Abfragen erforderlich wäre, ist einer der beiden anderen Ansätze besser geeignet.

Caching, Replikation und nicht-normalisierte Daten

Anstatt nur Fremdschlüssel zu speichern, ist es üblich, tatsächliche Fremdwerte zusammen mit den Daten des Modells zu speichern. So kann beispielsweise jeder Blog-Kommentar neben einer Benutzerkennung auch den Benutzernamen enthalten, so dass ein einfacher Zugriff auf den Benutzernamen möglich ist, ohne dass eine weitere Abfrage erforderlich ist. Ändert sich jedoch ein Benutzername, muss dieser nun an vielen Stellen in der Datenbank geändert werden. Daher funktioniert dieser Ansatz besser, wenn Lesevorgänge viel häufiger vorkommen als Schreibvorgänge.

Verschachtelung von Daten

Bei Dokumentendatenbanken wie MongoDB ist es üblich, mehr Daten in einer kleineren Anzahl von Sammlungen unterzubringen. In einer Blogging-Anwendung könnte man zum Beispiel Kommentare innerhalb des Blogpost-Dokuments speichern, so dass man mit einem einzigen Abruf alle Kommentare erhält. Bei diesem Ansatz enthält also ein einziges Dokument alle Daten, die Sie für eine bestimmte Aufgabe benötigen.

ACID- und Join-Unterstützung

Eine Datenbank wird als unterstützend für ACID-Eigenschaften (Atomicity, Consistency, Isolation, Durability) oder Join-Operationen gekennzeichnet, wenn die Dokumentation für die Datenbank dies behauptet. Dies bedeutet jedoch nicht notwendigerweise, dass die Fähigkeit vollständig unterstützt wird, ähnlich wie bei den meisten SQL-Datenbanken.

Datenbank ACID Verknüpfungen
Aerospike Ja Nein
Apache Ignite Ja Ja
ArangoDB Ja Ja
Amazon DynamoDB Ja Nein
Couchbase Ja Ja
CouchDB Ja Ja
IBM Db2 Ja Ja
InfinityDB Ja Nein
LMDB Ja Nein
MarkLogic Ja Ja
MongoDB Ja Ja
OrientDB Ja Ja