Warum sollte ich eine dokumentbasierte Datenbank anstelle einer relationalen Datenbank verwenden?

187

Warum sollte ich eine dokumentbasierte Datenbank wie CouchDB anstelle einer relationalen Datenbank verwenden? Gibt es typische Arten von Anwendungen oder Domänen, in denen die dokumentbasierte Datenbank besser geeignet ist als die relationale Datenbank?

Bartosz Blimke
quelle
Möglicherweise ähnelt eine dokumentenorientierte Datenbank in gewisser Weise einer EAV-Datenbank (Entity-Attribut-Value).
ChrisW

Antworten:

167

Wahrscheinlich solltest du nicht :-)

Die zweitwichtigste Antwort ist, dass Sie sie verwenden sollten, wenn Ihre Daten nicht relational sind. Dies äußert sich normalerweise darin, dass es nicht einfach ist, Ihre Daten als eine Reihe von Spalten zu beschreiben. Ein gutes Beispiel ist eine Datenbank, in der Sie tatsächlich Papierdokumente speichern, z. B. durch Scannen von Büropost. Bei den Daten handelt es sich um das gescannte PDF, und Sie haben einige Metadaten, die immer vorhanden sind (gescannt, gescannt, Dokumenttyp), und viele mögliche Metadatenfelder, die irgendwann vorhanden sind (Kundennummer, Lieferantennummer, Bestellnummer, bis OCRed Volltext usw.). Normalerweise wissen Sie nicht im Voraus, welche Metadatenfelder Sie in den nächsten zwei Jahren hinzufügen werden. Dinge wie CouchDB funktionieren für diese Art von Daten viel besser als relationale Datenbanken.

Ich persönlich liebe auch die Tatsache, dass ich für CouchDB keine Client-Bibliotheken außer einem HTTP-Client benötige, der heutzutage in fast jeder Programmiersprache enthalten ist.

Die wahrscheinlich am wenigsten offensichtliche Antwort: Wenn Sie mit einem RDBMS keine Schmerzen haben, bleiben Sie dabei. Wenn Sie Ihr RDBMS immer umgehen müssen, um Ihre Arbeit zu erledigen, ist eine dokumentenorientierte Datenbank möglicherweise einen Blick wert.

Eine ausführlichere Liste finden Sie in diesem Beitrag von Richard Jones .

max
quelle
1
Ich habe in zwei Jahren noch nie ein Datenbankschema gesehen, das dem ursprünglichen Schema ähnelt, mit dem wir begonnen haben. Wenn also alles gleich ist (was es nicht ist ...), sollten Sie immer eine schemenlose Datenbank verwenden = eine dokumentorientierte; was ich denke, ist ein ziemlich irreführender Name ...
ᆼ ᆺ ᆼ
2
@ int3 Wenn Sie Ihre Daten nicht als Spaltensatz beschreiben können, wie sollen Sie dann intelligente Abfragen zu diesen Daten schreiben?
Clay Smith
46

CouchDB (von ihrer Website )

  • Ein Dokumentdatenbankserver, auf den über eine RESTful JSON-API zugegriffen werden kann. Im Allgemeinen wird auf relationale Datenbanken nicht einfach über REST-Services zugegriffen, sondern es wird eine viel komplexere SQL-API benötigt. Oft sind diese APIs (JDBC, ODBC usw.) recht komplex. REST ist ganz einfach.

  • Ad-hoc und schemafrei mit flachem Adressraum. Relationale Datenbanken haben ein komplexes, festes Schema. Sie definieren Tabellen, Spalten, Indizes, Sequenzen, Ansichten und andere Dinge. Couch erfordert nicht diese komplexe, teure und fragile Vorausplanung.

  • Verteilt mit robuster, inkrementeller Replikation mit bidirektionaler Konflikterkennung und -verwaltung. Einige kommerzielle SQL-Produkte bieten dies an. Aufgrund der SQL-API und der festen Schemata ist dies komplex, schwierig und teuer. Für Couch erscheint es einfach und kostengünstig.

  • Abfragefähig und indexfähig, mit einer tabellenorientierten Berichts-Engine, die Javascript als Abfragesprache verwendet. SQL und relationale Datenbanken auch. Hier gibt es nichts Neues.

So. Warum CouchDB?

  • REST ist einfacher als JDBC oder ODBC.
  • Kein Schema ist einfacher als das Schema.
  • Verteilt auf eine Weise, die einfach und kostengünstig erscheint.
S.Lott
quelle
12
Obwohl ich ein großer Fan von NoSQL-Datenbanken bin, ist die erste Behauptung (REST ist einfacher als JDBC) sehr zweifelhaft.
6 ᆺ ᆼ
2
Das REST-Protokoll scheint mir ziemlich einfach zu sein, da es nur HTTP ist: zustandslos, wenige Methoden usw. usw. Vielleicht ist JDBC (unter der Haube) einfach; es scheint nicht einfacher zu sein, nur weil man einen Zustand hat.
S.Lott
5
@ S.Lott Sollte die Antwort nicht "allgemeiner" sein, anstatt nur auf CouchDb ausgerichtet zu sein?
Pacerier
"fragile Vorausplanung" vs was? Nach meiner Erfahrung ist die Alternative No-Planning, was zu Spaghetti-Datenstrukturen führt, die aus einer Laune heraus modifiziert werden.
Tejay Cardon
26

Zum dummen Speichern und Bereitstellen von Daten anderer Server.

In den letzten Wochen habe ich mit einer Lifestream-App gespielt, die meine Feeds (lecker, flickr, github, twitter ...) abfragt und in couchdb speichert. Das Schöne an couchdb ist, dass ich die Originaldaten ohne Overhead in ihrer ursprünglichen Struktur behalten kann. Ich habe jedem Dokument ein Klassenfeld hinzugefügt, in dem der Quellserver gespeichert ist, und für jede Quelle eine Javascript-Renderklasse geschrieben.

Wenn Ihr Server mit einem anderen Server kommuniziert, ist ein schemaloser Speicher am besten geeignet, da Sie keine Kontrolle über das Schema haben. Als Bonus verwendet couchdb die nativen Protokolle von Servern und Clients - JSON für die Darstellung und HTTP REST für den Transport.

daonb
quelle
Warum speichern Sie sie nicht einfach in einer Datei oder einer Datei pro Feed?
j_random_hacker
6
Mit couchdb können Sie auch interessante Ansichten mithilfe von map / redu erstellen. Beispielsweise kann ich eine Ansicht basierend auf der Datenquelle erstellen oder die Gesamtsummen für jede Quelle berechnen.
Daonb
4
Das ist ein brillanter Punkt ... Wenn Sie Daten verbrauchen und keine Kontrolle über das Schema eingehender Daten haben, verwenden Sie einen Dokumentenspeicher.
Joshua Robinson
1
Dies ist das erste wirklich überzeugende Argument, das ich für den Wert von NoSQL-Datenbanken gehört habe
Caleb McNevin
19

Eine schnelle Anwendungsentwicklung fällt mir ein.

Wenn ich mein Schema ständig weiterentwickle, bin ich ständig frustriert, weil ich das Schema in MySQL / SQLite pflegen muss. Obwohl ich noch nicht zu viel mit CouchDB gemacht habe, gefällt mir, wie einfach es ist, das Schema während des RAD-Prozesses zu entwickeln.

Ein Fall, in dem Sie möglicherweise keine nicht relationale Datenbank verwenden möchten, ist, wenn Sie viele Viele-zu-Viele-Beziehungen haben. Ich habe noch keine Ahnung, wie man gute MapReduce-Funktionen für diese Art von Beziehungen erstellt, insbesondere wenn Sie Metadaten in der Verbindungsbeziehung benötigen. Ich bin nicht sicher, aber ich glaube nicht, dass CouchDB Map-Funktionen ihre eigenen Abfragen in der Datenbank aufrufen können, da dies möglicherweise Endlosschleifen verursachen kann.

Pixelcort
quelle
Hervorragender Punkt. Dokumentenspeicher (und andere schemenlose Datenspeicher) eignen sich hervorragend für eine schnelle Entwicklung im Frühstadium. Aus den gleichen Gründen eignen sie sich hervorragend für das Prototyping im Frühstadium und sind für robuste Produktionsanwendungen problematisch.
Tejay Cardon
6

Verwenden Sie eine dokumentbasierte Datenbank, wenn Sie keine Daten in Tabellen mit Feldern einheitlicher Größe für jeden Datensatz speichern müssen. Stattdessen müssen Sie jeden Datensatz als Dokument mit bestimmten Merkmalen speichern. Es können jederzeit beliebig viele Felder beliebiger Länge dynamisch zu einem Dokument hinzugefügt werden, ohne dass zuerst die Tabelle geändert werden muss. Felder auf Dokumentbasis können auch mehrere Daten enthalten.

smdelfin
quelle
1

Smdelfin näher erläutern: Flexibilität. Sie können Daten in jeder Struktur speichern (unstrukturiert und alle) und jedes Dokument kann völlig anders sein. CouchDB ist besonders nützlich, da Sie mit ihren "Ansicht" -Indizes bestimmte Dokumente herausfiltern und genau diese Ansicht abfragen können, wenn Sie diese Teilmengen Ihrer Datenbank möchten.

Mein größter Gewinnpunkt bei Dokumentendatenbanken, in denen Daten im JSON-Format gespeichert werden: Dies ist das native Format für JavaScript. Daher funktionieren JavaScript-Webanwendungen mit CouchDB unglaublich gut. Ich habe kürzlich eine Web-App erstellt, die CouchDB verwendet und schnell ist und gleichzeitig eine sich ständig ändernde Datenstruktur verarbeiten kann.

MitchB
quelle
0

Dokumentbasierte Datenbanken haben einen großen Vorteil gegenüber relationalen Datenbanken, da sie kein Vorausdefinieren eines Schemas erfordern, bevor Daten eingegeben werden können.

Sie sollten auch eine Dokumentendatenbank verwenden, wenn Ihre Daten nicht relational sind und nicht in einer Tabelle gespeichert werden können, sondern aus einer Reihe von Bildern oder beispielsweise Zeitungsartikeln bestehen.

Ein weiterer Vorteil ist die einfache Verwendung dokumentbasierter Datenbanken in der Webentwicklung. Weitere Informationen zum Vergleich von NoSQL-Datenbankmodellen finden Sie in dieser Quelle: https://arxiv.org/ftp/arxiv/papers/1509/1509.08035.pdf

evidrascu
quelle