Unterschied zwischen dokumentbasierten und schlüssel- / wertbasierten Datenbanken?

97

Ich weiß, dass es drei verschiedene, beliebte Arten von Nicht-SQL-Datenbanken gibt.

  • Schlüssel / Wert: Redis, Tokyo Cabinet, Memcached
  • ColumnFamily: Cassandra, HBase
  • Dokument: MongoDB, CouchDB

Ich habe lange Blogs darüber gelesen, ohne so viel zu verstehen.

Ich kenne relationale Datenbanken und verstehe dokumentbasierte Datenbanken wie MongoDB / CouchDB.

Könnte mir jemand sagen, was die Hauptunterschiede zwischen diesen und den beiden ersteren auf der Liste sind?

Never_had_a_name
quelle
4
Es gibt fünf: (1) Schlüsselwertspeicher: Oracle Coherence, Redis, Kyoto Cabinet (2) BigTable-Datenbanken: Apache HBase, Apache Cassandra (3) Dokumentendatenbanken: MongoDB, CouchDB (4) Volltextsuchmaschinen: Apache Lucene, Apache Solr (5) Graph-Datenbanken: neo4j, FlockDB, siehe nosql-Datenmodellierungstechniken
Gary Gauh

Antworten:

74

Die Hauptunterschiede sind das Datenmodell und die Abfragefunktionen.

Schlüsselwertspeicher

Der erste Typ ist sehr einfach und bedarf wahrscheinlich keiner weiteren Erklärung.

Datenmodell: mehr als Schlüsselwertspeicher

Obwohl es einige Debatten über den richtigen Namen für Datenbanken wie Cassandra gibt, möchte ich sie als Spaltenfamiliengeschäfte bezeichnen . Obwohl Schlüssel-Wert-Paare ein wesentlicher Bestandteil von Cassandra sind, ist dies nicht nur darauf beschränkt. Sie können Schlüssel-Wert-Paare verschachteln, sodass sich ein Schlüssel auf mehrere Unterschlüssel-Wert-Paare beziehen kann.

Sie können Schlüssel-Wert-Paare jedoch nicht unbegrenzt verschachteln. Sie sind auf drei Ebenen (Spaltenfamilien) oder vier Verschachtelungsebenen (Supersäulenfamilien) beschränkt. Für den Fall, dass der Begriff Spaltenfamilie nicht klingelt, siehe WTF ist ein SuperColumn- Artikel. Dies ist eine gute Erklärung für das Datenmodell von Cassandra.

Dokumentdatenbanken wie CouchDB und MongoDB speichern ganze Dokumente in Form von JSON-Objekten . Sie können sich diese Objekte als verschachtelte Schlüssel-Wert-Paare vorstellen. Im Gegensatz zu Cassandra können Sie Schlüssel-Wert-Paare so oft verschachteln, wie Sie möchten. JSON unterstützt auch Arrays und versteht verschiedene Datentypen wie Zeichenfolgen, Zahlen und Boolesche Werte.

Abfragen

Ich glaube, Spaltenfamiliengeschäfte können nur per Schlüssel oder durch Schreiben von Funktionen zur Kartenreduzierung abgefragt werden. Sie können die Werte nicht wie in einer SQL-Datenbank abfragen. Wenn Ihre Anwendung komplexere Abfragen benötigt, muss Ihre Anwendung Indizes erstellen und verwalten, um auf die gewünschten Daten zugreifen zu können.

Dokumentdatenbanken unterstützen auch Abfragen nach Schlüssel- und Kartenreduzierungsfunktionen, ermöglichen es Ihnen jedoch auch, grundlegende Abfragen nach Wert durchzuführen, z. B. "Geben Sie mir alle Benutzer mit mehr als 10 Beiträgen". Dokumentendatenbanken sind auf diese Weise flexibler.

Niels van der Rest
quelle
2
In Schlüsselwertspeichern wie redit können Sie also keine verschachtelten Schlüsselwerte speichern: Werte? Und Ihrer Beschreibung nach klingt das Speichern einer ganzen Datenbank (von RDBMS) in Cassandra nicht sehr klug, da es keine flexible Abfrage zulässt und eine begrenzte Verschachtelungstiefe aufweist, habe ich Recht?
nie_had_a_name
7
@ajsie: Richtige Schlüssel-Wert-Speicher unterstützen keine verschachtelten Schlüssel-Wert-Paare. Die meisten von ihnen unterstützen jedoch spezielle Werte, wie z. B. Listen. Cassandra unterscheidet sich stark von einem RDBMS, da beide sehr unterschiedliche Probleme lösen sollen. RDBMS-Systeme zielen auf relationale Daten ab, die komplexe Abfragen erfordern, während Cassandra auf die Verarbeitung enormer Mengen größtenteils nicht relationaler Daten abzielt. Natürlich ist es möglich , eine RDBMS-Datenbank nach Cassandra zu verschieben, aber nicht sehr klug. Jeder von ihnen hat seinen eigenen Gebrauch.
Niels van der Rest
Ist also jede Dokumentendatenbank auch ein Schlüssel- und Wertspeicher, in dem der Wert einfach ein JSON wie {value: base64 (val)} ist?
GroovyDotCom
@GroovyDotCom: Ja, Sie können eine Dokumentendatenbank zum Speichern einfacher Schlüssel- / Wertobjekte verwenden.
Niels van der Rest
15

Ayende hat eine nette Erklärung bezüglich des Unterschieds zwischen Schlüsselwert- und Dokumentendatenbank gegeben:

Eine Dokumentendatenbank ist im Kern ein Schlüssel- / Wertspeicher mit einer Hauptausnahme. Anstatt nur einen Blob darin zu speichern, erfordert ein Dokument db, dass die Daten in einem Format gespeichert werden , das die Datenbank verstehen kann (z. B. JSON, XML usw.). In den meisten Dokumentdatenbanken bedeutet dies, dass wir jetzt Abfragen zu den Dokumentdaten zulassen können.

Ashraf Alam
quelle