Inwieweit beeinflusst das Datenmodell die Skalierbarkeit und Leistung in der sogenannten NoSQL-Datenbank?

13

Sie können niemals über eine sogenannte "NoSQL" -Datenbank sprechen, ohne das CAP-Theorem (Konsistenz, Verfügbarkeit, Partition: Wählen Sie zwei) mitzubringen. Wenn Sie beispielsweise zwischen MongoDB (Partition, Consistency) und CouchDB (Availability, Partition) wählen müssen, müssen Sie sich zuerst Gedanken machen: "Brauche ich korrekte Daten oder brauche ich ständig Zugriff?".

Diejenigen neue Datenbank wurden gemacht partitioniert werden. Aber was ist, wenn ich es nicht tue ? Was ist, wenn ich es für ziemlich cool halte, statt einer relationalen Datenbank eine Schlüssel- / Wert-, Spalten- oder Dokumentdatenbank zu haben, nur eine Serverinstanz zu erstellen und diese niemals zu beschädigen? Hätte ich in diesem Fall nicht sowohl Verfügbarkeit als auch Konsistenz? MongoDB müsste nichts replizieren, damit es verfügbar ist. Und CouchDB hätte nur eine Datenquelle, also wäre es ziemlich konsistent.

Das würde also bedeuten, dass MongoDB und CouchDB in diesem Fall nur einen geringen Unterschied in Bezug auf den Anwendungsfall haben würden? Nun, außer natürlich Leistung, API und so weiter, aber das wäre mehr eine Wahl zwischen PostgreSQL und MySQL als zwei grundlegend unterschiedliche Anforderungen.

Bin ich hier richtig Kann ich eine AP- oder CP-Datenbank in eine AC-Datenbank ändern, indem ich nicht mehr als eine Instanz erstelle? Oder fehlt mir etwas?

Stellen wir die Frage umgekehrt. Was ist, wenn ich eine relationale Datenbank nehme, beispielsweise MySQL, und sie in eine Master / Slave-Konfiguration lege? Ich verwende keine ACID-Transaktionen. Wenn ein Schreibvorgang sofort mit dem Slave synchronisiert werden soll, ist er dann keine CP-Datenbank? Und was ist, wenn ich es in vordefinierten Intervallen synchronisiere und es keine Rolle spielt, ob ein Client veraltete Daten von einem Slave liest. Wäre das nicht eine AP-Datenbank? Würde das nicht bedeuten, dass ich das Beziehungsmodell für eine partitionierte Datenbank weiterhin verwenden kann, wenn ich die ACID-Konformität aufgeben würde?

Im Wesentlichen: Ist die Skalierbarkeit in Bezug auf das, was Sie bereit sind, im CAP-Theorem aufzugeben, mehr als das zugrunde liegende Datenmodell? Verbessert das Vorhandensein von Spalten-, Dokument- und Schlüsselwerten die Skalierbarkeit gegenüber einem relationalen Modell? Können wir eine relationale Datenbank entwerfen, die von Grund auf auf Partitionstoleranz ausgelegt ist? (Vielleicht existiert es schon). Könnten wir die NoSQL-Datenbank ACID-kompatibel machen?

Es tut uns leid, es gibt eine Menge Fragen, aber ich habe in letzter Zeit viel über NoSQL-Datenbanken gelesen und es scheint mir, dass der größte Vorteil der Verwendung darin besteht, dass sie besser zur "Form" Ihrer Daten passen als nur zur Partition CAP und Aufgeben der ACID-Konformität. Schließlich hat nicht jeder so viele Daten, dass er sie partitionieren muss. Gibt es einen Performance- / Skalierbarkeitsvorteil, wenn ich das relationale Modell nicht verwende, bevor ich überhaupt darüber nachdenke, meine Daten zu partitionieren?

Laurent Bourgault-Roy
quelle

Antworten:

8

Verbessert die Verwendung einer NoSQL-Datenbank die Skalierbarkeit, auch wenn Sie keine Daten speichern? Definieren wir nun die Skalierbarkeit. Wenn Sie sich auf Skalierbarkeit als Datenbank- / Back-End-System beziehen, da Sie vertikale und horizontale Skalierung haben, bei der horizontale Skalierung Daten verliert, wird dies zu einer trivialen Frage, da die Antwort absolut nein wäre, da die einzige Option, die Sie noch haben ist vertikale Skalierung (dh bessere Hardware). Wenn Sie jedoch von Skalierbarkeit im weiteren Sinne in Bezug auf die Flexibilität der Anwendung, den Datenwert usw. sprechen, dann ist dies eine ganz andere Frage mit einer Reihe von Antworten. Und wie Sie bereits erwähnt haben, kommt es oft darauf an, was Sie mit den Daten machen und wie sie gespeichert werden sollen. Lassen Sie mich hier alles mit der Aussage vorwegnehmen, dass Sie in den meisten Fällen immer noch ein RDBMS verwenden sollten und NoSQL die Nischen füllen sollte. Das Folgende ist eine Beschreibung einer bestimmten Instanz, in der eine NoSQL-Datenbank bei bestimmten Anforderungen vorteilhafter wäre und in der die horizontale Skalierung ignoriert werden kann.

Nehmen Sie zum Beispiel die Idee, dass Sie ein Cloud-Dateispeichersystem erstellen, das Google Drive, Dropbox oder Box ähnelt, aber anstatt ein tatsächliches Dateisystem zu verwenden, entscheiden Sie, dass es für Sie vorteilhafter wäre, das Dateisystem zu virtualisieren. Jetzt haben Sie ein Problem, weil Ihr Datenmodell plötzlich die Baumstruktur ist, die in einem RDBMS fürchterlich ineffizient sein wird (obwohl auf diese Weise alles indiziert wird). Denn jetzt haben Sie eine 3-Spalten-Tabelle mit Name, Benutzer und Eltern. Benutzer ist ein Fremdschlüssel für eine Benutzertabelle, und Übergeordneter Schlüssel ist ein selbstreferenzierender nullwertfähiger Fremdschlüssel (nullwertfähig, da das Stammverzeichnis keinen übergeordneten Schlüssel haben konnte). Also, was ist der Primärschlüssel? In diesem Fall ist es ein zusammengesetzter Schlüssel über alle Spalten hinweg ... was Parent plötzlich zu unserem schlimmsten Feind macht.

Überlegen Sie sich stattdessen, wie Sie das in eine Art Dokumentenspeicher umwandeln würden. Anstatt die Daten zu bekämpfen, können Sie damit arbeiten und sie als Baumstruktur speichern, was wiederum Ihre Entwicklungszeit und die Wartungskosten senkt. Wenn Sie die Kosten senken, ermöglicht das dann nicht eine andere Art von Skalierbarkeit? Außerdem erstellen Sie in diesem Fall das System von Grund auf korrekt, wodurch die Anwendung selbst flexibler wird. Derzeit führe ich dies auf einem einzelnen Server mit MongoDB aus, was, wie Sie erklärt haben, ein verfügbares, konsistentes Modell ergibt, das sich nicht wesentlich vom Unterschied zwischen MySQL und Postgres unterscheidet.

Mit MongoDB können Sie zumindest definieren, mit wie vielen Servern Sie kommunizieren müssen, damit eine Abfrage erfolgreich ausgeführt werden kann. Ja, Sie können sie in ein konsistentes, verfügbares Modell konvertieren, wenn Sie allen Abfragen mitteilen, mit allen Serverinstanzen zu kommunizieren.

Ich denke, Sie haben das Recht darauf, dass die Speicherung der Daten von großem Vorteil ist. Es gibt Dinge, die nicht gut in ein relationales Modell passen, das auch in andere Modelle passt (als weiteres kurzes Beispiel verwendet Amazon eine Form von Graph Database als Empfehlungsmodul für Produkte).

Habe ich deine Frage richtig verstanden?

Bearbeiten: Werden mehr Daten Dinge verlangsamen? Ja. Wie sehr wird es die Dinge verlangsamen? Ich habe ehrlich gesagt nicht genug Erfahrung, um eine angemessene Antwort zu geben. Schlüssel / Wert: Im Wesentlichen eine Nachschlagetabelle mit großen Datenmengen, die dem Nachschlageschlüssel zugeordnet sind. Das wird wirklich sehr schnell gehen, weil man Dinge nur mit dem Schlüssel nachschlagen kann. Spalte / Familie: Im Wesentlichen ein viel strukturierterer Schlüssel- / Wertspeicher. Sie können nur auf der Grundlage der Spalte abfragen, daher sollte dies auch sehr schnell gehen. Dokument: Aggregationsstilschema. Hier möchten Sie ähnliche Daten zusammenfassen. Denormalisierung ist in Ordnung und wird für diese Art von Datenbank erwartet. Je nachdem, ob Sie viele Schreib- oder Lesevorgänge ausführen, können Sie Ihre Daten so organisieren, dass sie auf mehrere Shards verteilt werden, um die Schreib- oder Lesevorgänge zu verteilen Optimierungsbedarf für das eine oder andere) Grafik: Die Stärke dieser Grafik ist, dass sie sehr schnell Beziehungen aufbauen und abbauen kann. Wenn Sie Daten mit Beziehungen haben, die sich zwischen den Daten ändern müssen (denken Sie an eine Art Empfehlungsmodul), sollten Sie diese verwenden.

Die Art und Weise, wie Sie Daten in einer dieser Datenbanken speichern, wirkt sich auf die Leistung aus (ähnlich der Tatsache, dass eine fehlerhafte Speicherung von Daten in einigen RDBMS die Leistung beeinflusst). Um dies hoffentlich klarer zu machen: Sie müssen wissen, welches Datenbanksystem Sie verwenden sollten und wie Daten in diesem Datenbanksystem gespeichert werden.

harageth
quelle
Ja, das war die Art von Antwort, die ich erwartet hatte. Um genau zu sein, meinte ich Skalierbarkeit als die Fähigkeit eines Systems, eine wachsende Anzahl von Aufgaben ohne Ersticken zu bewältigen, mehr als ein reines Hardware-Skalierbarkeitsproblem (vielleicht war das nicht der richtige Begriff). Beispielsweise kann Nginx aufgrund seiner ereignisbasierten Architektur mehr gleichzeitige Anforderungen verarbeiten als Apache. Die Frage lautete also: "Erlaubt mir die Verwendung einer nicht relationalen Datenbank auf einem Computer mit fester Hardware, mehr Benutzer zu bedienen, bevor ich das Limit erreiche?"
Laurent Bourgault-Roy
In diesem Fall hängt es vom verwendeten Datenbanksystem ab. In meinem obigen Beispiel für ein Cloud-Dateisystem verwende ich Redis, um die Dateien tatsächlich zu speichern, und sie können 100.000 Abfragen pro Sekunde verarbeiten (da es als Schlüssel- / Wertespeicher im Speicher erstellt wurde). Jetzt habe ich meine Anwendung noch nicht getestet, um zu sehen, wie sie tatsächlich funktioniert, aber das steht auf der Redis-Website. Denken Sie daran, dass die Daten hinter den Kulissen je nach Art des verwendeten Datenbanksystems unterschiedlich dargestellt werden. Füllen Sie die Nischen mit der richtigen Datenbank.
Harageth
1
Ich habe meine Antwort bearbeitet, weil das einfacher war, als mehr Kommentare hinzuzufügen.
Harageth
2
+1 das ist ein fantastischer Start bei P.SE, ich hoffe, du bleibst noch eine Weile hier und fügst weiterhin qualitativ hochwertige Inhalte wie diese hinzu!
Jimmy Hoffa
1
Perfekt, mit dem Edit gibt es mir viel Einsicht. Vielen Dank!
Laurent Bourgault-Roy