Ich habe versucht zu prüfen, ob ich mit einer dokumentbasierten Datenbank, in diesem Fall CouchDB, einige Anforderungen erfüllen kann. Zwei allgemeine Anforderungen:
- CRUD von Entitäten mit einigen Feldern, die einen eindeutigen Index haben
- E-Commerce-Web-App wie eBay ( bessere Beschreibung hier ).
Und ich fange an zu denken, dass eine dokumentbasierte Datenbank nicht die beste Wahl ist, um diese Anforderungen zu erfüllen. Außerdem kann ich mir keine Verwendung für eine dokumentbasierte Datenbank vorstellen (vielleicht ist meine Vorstellungskraft zu begrenzt).
Können Sie mir erklären, ob ich Birnen von einer Ulme frage, wenn ich versuche, eine dokumentenorientierte Datenbank für diese Anforderungen zu verwenden?
Antworten:
Sie müssen darüber nachdenken, wie Sie die Anwendung dokumentenorientiert angehen. Wenn Sie einfach versuchen zu replizieren, wie Sie das Problem in einem RDBMS modellieren würden, schlagen Sie fehl. Es gibt auch verschiedene Kompromisse, die Sie möglicherweise eingehen möchten. ([ed: Ich bin mir nicht sicher, wie dies mit dem Argument zusammenhängt, aber:] Denken Sie daran, dass das Design von CouchDB davon ausgeht, dass Sie einen aktiven Cluster mit vielen Knoten haben, die jederzeit ausfallen können. Wie wird Ihre App mit einem der Datenbankknoten umgehen, aus denen sie verschwindet? darunter?)
Eine Möglichkeit, darüber nachzudenken, besteht darin, sich vorzustellen, Sie hätten keine Computer, nur Papierdokumente. Wie würden Sie einen effizienten Geschäftsprozess erstellen, indem Sie Papierstücke herumreichen? Wie können Sie Engpässe vermeiden? Was ist, wenn etwas schief geht?
Ein weiterer Aspekt, über den Sie nachdenken sollten, ist die eventuelle Konsistenz, bei der Sie schließlich in einen konsistenten Zustand geraten, aber möglicherweise für einen bestimmten Zeitraum inkonsistent sind. Dies ist ein Gräuel im RDBMS-Land, aber in der realen Welt äußerst verbreitet. Das kanonische Transaktionsbeispiel ist die Überweisung von Geld von Bankkonten. Wie geschieht dies tatsächlich in der realen Welt - durch einzelne Atomtransaktionen oder durch verschiedene Banken, die sich gegenseitig Kredit- und Lastschriften ausstellen? Was passiert, wenn Sie einen Scheck ausstellen?
Schauen wir uns also Ihre Beispiele an:
Wenn ich dies in CouchDB-Begriffen richtig verstehe, möchten Sie eine Sammlung von Dokumenten haben, bei denen garantiert ist, dass ein benannter Wert in all diesen Dokumenten eindeutig ist? Dieser Fall kann im Allgemeinen nicht unterstützt werden, da Dokumente möglicherweise auf verschiedenen Replikaten erstellt werden.
Wir müssen uns also das Problem der realen Welt ansehen und sehen, ob wir das modellieren können. Brauchen Sie sie wirklich, um einzigartig zu sein? Kann Ihre Anwendung mehrere Dokumente mit demselben Wert verarbeiten? Müssen Sie eine eindeutige Kennung zuweisen? Können Sie das deterministisch tun? Ein häufiges Szenario, in dem dies erforderlich ist, besteht darin, dass Sie eine eindeutige sequentielle Kennung benötigen. Dies ist in einer replizierten Umgebung schwer zu lösen. In der Tat ist es unmöglich, wenn die eindeutige ID in Bezug auf die erstellte Zeit streng sequentiell sein muss, wenn Sie die ID sofort benötigen. Sie müssen mindestens eine dieser Einschränkungen lockern.
Ich bin mir nicht sicher, was ich hier hinzufügen soll, da der letzte Kommentar, den Sie zu diesem Beitrag abgegeben haben, "sehr nützlich! Danke" war. Fehlt in dem dort beschriebenen Ansatz etwas, das Ihnen immer noch ein Problem bereitet? Ich fand die Antwort von MrKurt ziemlich vollständig und fügte eine kleine Verbesserung hinzu, die den Streit reduzieren würde.
quelle
Müssen die Daten normalisiert werden?
quelle
Ich bin im selben Boot, ich liebe Couchdb im Moment und ich denke, dass der gesamte funktionale Stil großartig ist. Aber wann genau fangen wir an, sie in ernest für Anwendungen zu verwenden. Ich meine, ja, wir können alle extrem schnell damit beginnen, Anwendungen zu entwickeln, ohne Probleme, wenn all diese fiesen Probleme mit der normalen Form auf der Strecke bleiben und keine Schemata verwenden. Aber um einen Satz zu prägen: "Wir stehen auf den Schultern der Riesen". Es gibt einen guten Grund, RDBMS zu verwenden und Schemas zu normalisieren und zu verwenden. Mein alter Orakelkopf schwankt und denkt über Daten ohne Form nach.
Mein Haupt-Wow-Faktor bei couchdb ist das Replikationsmaterial und das Versionssystem, die zusammenarbeiten.
Ich habe mir im letzten Monat den Kopf zerbrochen und versucht, die Speichermechanismen von couchdb zu untersuchen. Anscheinend werden B-Bäume verwendet, aber keine Daten basierend auf der normalen Form gespeichert. Bedeutet dies, dass es wirklich sehr, sehr intelligent ist und erkennt, dass Datenbits repliziert werden, also lassen Sie uns einfach einen Zeiger auf diesen B-Baum-Eintrag machen?
Bisher denke ich an XML-Dokumente, Konfigurationsdateien und Ressourcendateien, die auf base64-Zeichenfolgen gestreamt werden.
Aber würde ich couchdb für strukturelle Daten verwenden. Ich weiß nicht, jede Hilfe wird hier sehr geschätzt.
Kann beim Speichern von RDF-Daten oder sogar von Freiformtext hilfreich sein.
quelle
Eine Möglichkeit besteht darin, eine relationale Hauptdatenbank zu haben, in der Definitionen von Elementen gespeichert sind, die anhand ihrer IDs abgerufen werden können, sowie eine Dokumentendatenbank für die Beschreibungen und / oder Spezifikationen dieser Elemente. Beispielsweise könnten Sie eine relationale Datenbank mit einer Produkttabelle mit den folgenden Feldern haben:
Und dieses Feld Spezifikationen würde tatsächlich einen Verweis auf ein Dokument mit den technischen Spezifikationen des Produkts enthalten. Auf diese Weise haben Sie das Beste aus beiden Welten.
quelle
Dokumentbasierte DBs eignen sich am besten zum Speichern von Dokumenten. Lotus Notes ist eine gängige Implementierung und Notes E-Mail ist ein Beispiel. Für das, was Sie beschreiben, E-Commerce, CRUD usw., sind Realtional-DBs besser zum Speichern und Abrufen von indizierten Datenelementen / Elementen (im Gegensatz zu Dokumenten) geeignet.
quelle
Zu CRUD: Das gesamte REST-Paradigma wird direkt auf CRUD abgebildet (oder umgekehrt). Wenn Sie also wissen, dass Sie Ihre Anforderungen mit Ressourcen (über URIs identifizierbar) und einer Reihe grundlegender Operationen (nämlich CRUD) modellieren können, sind Sie möglicherweise einem REST-basierten System sehr nahe, das einige dokumentenorientierte Systeme bereitstellen der Box.
quelle