Beispiel einer Aufgabe -, dass eine NoSQL-Datenbank nicht verarbeiten können (wenn überhaupt)
Ich würde es gerne testen die NoSQL-Welt. Dies ist nur Neugierde, nicht eine absolute Notwendigkeit (noch) nicht.
Ich habe gelesen, ein paar Dinge über die Unterschiede zwischen SQL-und NoSQL-Datenbanken. Ich bin davon überzeugt, über die potenziellen Vorteile, aber ich bin ein wenig besorgt über die Fälle, in denen NoSQL ist nicht anwendbar. Wenn ich verstehe, NoSQL-Datenbanken im wesentlichen miss ACID-Eigenschaften.
Kann jemand ein Beispiel von einigen realen Welt-Vorgang (zum Beispiel eine e-commerce-Website oder eine wissenschaftliche Anwendung, oder...), dass eine SÄURE relationalen Datenbank verarbeiten kann, aber wo eine NoSQL-Datenbank könnte scheitern kläglich, entweder systematisch mit einer Art race-condition oder wegen eines Stromausfalls, etc ?
Das perfekte Beispiel etwas, wo es keine Abhilfe, ohne änderung der Datenbank-engine. Beispiele, in denen eine NoSQL-Datenbank nur schlecht irgendwann wird eine andere Frage sein, aber hier würde ich auch gerne sehen, wenn wir theoretisch kann es einfach nicht verwenden diese Technologie.
Vielleicht finden ein solches Beispiel ist Datenbank-spezifisch. Wenn dies der Fall ist, nehmen wir MongoDB zu stellen die NoSQL-Welt.
Bearbeiten:
diese Frage zu klären, möchte ich nicht die Debatte darüber, welche Art von Datenbank ist besser für bestimmte Fälle. Ich möchte wissen, ob diese Technologie kann eine absolute Sackgasse, in einigen Fällen, weil, egal wie hart wir versuchen, eine Art von Funktionen, die eine SQL Datenbank bieten nicht umgesetzt werden, auf der Oberseite des nosql-stores.
Da gibt es viele nosql-stores verfügbar, ich kann akzeptieren, wählen Sie eine vorhandene nosql-store-Unterstützung, aber was mich am meisten interessieren, ist die minimale Teilmenge von Funktionen ein Shop sollte in der Lage sein, zu implementieren, höhere level-features (wie können Transaktionen implementiert werden, mit einem Geschäft, das nicht das X...).
- Versuchen Sie etwas zu schreiben wie ein Hauptbuch (Finanzbuchhaltung) app in einem der NoSQL-Menge... nicht gut geeignet.
- Diese Frage wurde über Datenbank-Theorie, mit konkreten Anwendungen (zu wissen, Wann es ist es nicht Wert, zu versuchen, eine Lösung zu finden, um ein reales problem, wenn es bewiesen ist, dass es keine Lösung). Es ist auf jeden Fall über Tatsachen, und nicht eine subjektive Debatte darüber, welche Technologie besser ist
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Frage ist ein bisschen wie zu Fragen, welche Art von Programm kann nicht geschrieben werden in eine imperative/funktionale Sprache. Jede Turing-vollständige Sprache und express-jedes Programm, das gelöst werden kann durch eine Turing-Maschine. Die Frage ist, sind Sie als Programmierer wirklich wollen, zu schreiben, ein accounting-system für ein fortune-500-Unternehmen in nicht-tragbare Maschine Anweisungen.
In der end -, NoSQL-alles tun können SQL-basierte Motoren, der Unterschied ist Sie als Programmierer verantwortlich sein kann für die Logik in so etwas Wie Redis, dass MySQL kostenlos. SQL-Datenbanken, die eine sehr konservative Sicht auf die Daten-Integrität. Die NoSQL-Bewegung entspannt, die Normen zu gewinnen, bessere Skalierbarkeit, und um Aufgaben, die üblich sind, um Web-Anwendungen zu erleichtern.
MongoDB (meine aktuelle Einstellung) vereinfacht die Replikation und Splitter (horizontale Skalierung), leicht, fügt sich sehr schnell und fällt die Voraussetzung für eine strenge Regelung. In der exchange-Benutzer von MongoDB muss der code langsamer Abfragen, Wann ein index ist nicht vorhanden, Umsetzung von Transaktions-Logik in der app (vielleicht mit drei-Phasen-commits), und wir nehmen einen hit auf storage-Effizienz.
CouchDB hat eine ähnliche trade-offs, sondern auch Opfer ad-hoc-Abfragen für die Arbeit mit Daten offline und synchronisieren mit einem server.
Redis und andere key-value-stores erfordern, dass der Programmierer viel schreiben der index-und join-Logik, die in SQL-Datenbanken. In exchange kann eine Anwendung nutzen domänenwissen über seine Daten zu machen Indizes und joins effizienter dann die Allgemeine Lösung der SQL erfordern würde. Redis auch erfordern, dass alle Daten in den Arbeitsspeicher passen, aber in exchange bietet Leistung auf Augenhöhe mit Memcache.
Du am Ende auch wirklich alles machen kann MySQL oder Postgres tun nichts mehr dann die OS-Datei-system-Befehle (nachdem alle das ist, wie die Menschen, die schrieben, diese Datenbank-engines, der es Tat). Es kommt alles darauf an, was Sie wollen, die Daten speichern, um für Sie tun und was Sie bereit sind zu geben, im Gegenzug.
Gute Frage. Zunächst eine Klarstellung. Während der Bereich der relationalen speichert, wird zusammengehalten durch ein eher solides Fundament von Prinzipien, mit dem jeweiligen Anbieter hinzufügen auswählen Wert in Funktionen oder Preisen, die nicht-relationale (nosql -) Feld ist weit heterogener.
Dort sind document stores (MongoDB, CouchDB), die sind ideal für content-management und ähnliche Situationen, in denen Sie einen flachen Satz von Variablen Parametern, die Sie wollen, zu bauen um ein Thema. Website-Anpassung. Verwenden Sie ein Dokument speichern, zum verwalten von benutzerdefinierten Attributen, die definieren, wie ein Benutzer will, um zu sehen, seine/Ihre Seite ist gut geeignet, um die Plattform. Trotz Ihrer marketing-hype, diese Geschäfte nicht dazu neigen zu Maßstab in TB gut. Es kann getan werden, aber es ist nicht ideal. MongoDB hat eine Menge von Funktionen in relationalen Datenbanken, wie z.B. dynamische Indizes (bis zu 40 pro collection/Tabelle). CouchDB ist gebaut, um absolut erstattungsfähig im Falle des Scheiterns.
Dort sind key/value-stores (Cassandra, HBase,...), die sind ideal für hoch-verteilten Speicher. Cassandra für low-latency -, HBase für die höhere Latenz. Der trick dabei ist, dass Sie haben, um Ihre Abfrage definieren muss, bevor Sie beginnen, Daten in. Sie sind nicht effizient für dynamische Abfragen für jedes Attribut. Zum Beispiel, wenn Sie erstellen eine Kunden-event logging service, würden Sie wollen, um Ihren Schlüssel auf den Kunden einzigartiges Attribut. Von dort aus, den man drücken könnte verschiedene Holzstrukturen in Ihr speichern und abrufen aller Protokolle, die von Kunden Schlüssel auf Nachfrage. Es wäre bei weitem teurer, jedoch, um zu versuchen zu gehen, durch die Protokolle zu suchen, melden Sie Veranstaltungen, bei denen der Typ war "Fehler", es sei denn, Sie beschlossen, zu machen, dass die sekundäre Taste. Eine andere Sache: Das Letzte mal sah ich bei Cassandra, Sie konnte nicht laufen regexp innerhalb der M/R-Abfragen. Bedeutet, dass, wenn Sie wollte, um nach mustern zu suchen in einem Feld, Sie würden ziehen müssen alle Instanzen dieses Feld und dann führen Sie es durch eine regexp zu finden, die Tupel, die Sie wollte.
Graph-Datenbanken sind sehr Verschieden von den beiden obigen. Die Beziehungen zwischen den Elementen(Objekte, Tupel, Elemente) sind fließend. Sie nicht skaliert nicht in TB, aber das ist nicht das, was Sie sind entworfen, für. Sie sind die großen Fragen zu stellen wie "hey, wie viele meiner Nutzer lik die Farbe grün? Dieser, wie viele Leben in Kalifornien?" Mit einer relationalen Datenbank, Sie hätten eine statische Struktur. Mit einer graph-Datenbank (ich bin zu kurz gedacht, natürlich), Sie haben Attribute und Objekte. Verbinden Sie als sinnvoll, ohne schema-Durchsetzung.
Ich würde nicht etwas kritisch in einer nicht-relationalen datenspeicher. Commerce, zum Beispiel, wo Sie wollen garantiert, dass eine Transaktion abgeschlossen ist, bevor mit der Lieferung der Ware. Sie wollen garantierte Integrität (oder zumindest die beste chance der garantierte Integrität). Wenn ein Benutzer verliert seine/Ihre Website-Anpassung-Einstellungen, keine große Sache. Wenn Sie verlieren einen Handel transation, big deal. Möglicherweise gibt es einige, die anderer Meinung sind.
Würde ich auch nicht setzen, komplexe Strukturen in einer der oben genannten nicht-relationale speichert. Sie nicht tun, schließt sich ja gut an-Skala. Und, das ist okay, denn es ist nicht so wie Sie funktionieren soll. Wo Sie könnten eine Identität für address_type in eine customer_address Tabelle in einem relationalen system, würden Sie einbetten möchten die address_type Informationen in einem Kunden-Tupel gespeichert, die in einem Dokument oder Schlüssel/Wert. Daten Effizienz ist nicht die Domäne des Dokuments oder ein Schlüssel/Wert-Speicher. Der Punkt ist der Vertrieb und die Reine Geschwindigkeit. Die Opfer-Bilanz.
Es gibt auch andere Subtypen der Familie der Läden mit der Bezeichnung "nosql", dass ich noch nicht hier behandelt werden. Es gibt eine Tonne (122 bei der letzten Zählung) verschiedene Projekte konzentrierten sich auf nicht-relationale Lösungen für die Daten-Probleme der verschiedenen Arten. Riak ist noch eine andere, die ich höre zu und kann nicht warten, um zu versuchen out.
Und hier ist der trick. Die big-dollar-relationale Anbietern beobachtet haben, und die Chancen sind, Sie alle sind in Bau oder Planung für den Bau Ihrer eigenen, nicht-relationale Lösungen zu binden in Ihre Produkte. In den nächsten paar Jahren, wenn nicht früher, sehen wir die Bewegung reif, große Unternehmen kaufen die best-of-breed und relationalen Anbieter starten, mit integrierten Lösungen, für diejenigen, die haven ' T bereits.
Es ist eine extrem aufregende Zeit für die Arbeit im Bereich Daten-management. Sie sollten versuchen ein paar von diesen heraus. Sie können download Couch oder Mongo und haben Sie und läuft in Minuten. HBase ist ein bisschen schwieriger.
In jedem Fall, ich hoffe, ich habe Sie informiert, ohne zu verwirren, dass ich erleuchtet ohne nennenswerte Verzerrungen oder Fehler.
RDBMSes sind gut in tritt, NoSQL-Motoren in der Regel nicht.
NoSQL-engines ist gut verteilte Skalierbarkeit, RDBMSes in der Regel nicht.
RDBMSes sind gut bei der Daten-Validierung coinstraints, NoSQL-Motoren in der Regel nicht.
NoSQL-Motoren sind gut flexibel und schema-weniger Ansätze, RDBMSes in der Regel nicht.
Beide Ansätze lösen können entweder Probleme; der Unterschied liegt in der Effizienz.
Wahrscheinlich die Antwort auf Ihre Frage ist, dass mongodb kann der Griff einer Aufgabe (und auch sql). Aber in manchen Fällen besser zu wählen, mongodb, in anderen sql-Datenbank. Über vor-und Nachteile Lesen Sie hier.
Auch als @Dmitry sagte mongodb offene Tür für einfache horizontale und vertikale Skalierung mit Replikation & Splitter.
RDBMS durchzusetzen, starke Konsistenz, während die meisten no-sql sind eventuelle konsistent. Also an einem bestimmten Punkt in der Zeit beim Lesen von Daten aus einer no-sql-DB könnte es nicht vertreten, die meisten up-to-date Kopie der Daten.
Ein häufiges Beispiel ist eine bank-Transaktion, wenn ein Benutzer Geld abheben, Ein Knoten aktualisiert wurde, diese Veranstaltung, wenn gleichzeitig die Knoten B wird abgefragt, für diesen Benutzer das Gleichgewicht, es kann sich wieder ein veraltete Gleichgewicht. Dies kann nicht geschehen, in RDBMS, wie die Konsistenz Attribut garantiert, dass die Daten aktualisiert, bevor es gelesen werden kann.
RDBMs sind wirklich gut für die schnelle Aggregation der Summen, Mittelwerte, etc. aus den Tabellen. z.B.
SELECT SUM(x) FROM y WHERE z
. Es ist etwas, das ist erstaunlich schwer zu tun, in den meisten NoSQL-Datenbanken, wenn Sie wollen eine Antwort auf einmal. Einige NoSQL-stores bieten map/reduce als eine Form der Lösung, die gleiche Sache, aber es ist nicht real, Zeit in der gleichen Weise ist es in der SQL-Welt.