Was sind die Vorteile einer schemafreien Datenbank wie MongoDB gegenüber einer relationalen Datenbank?

95

Ich bin es gewohnt, relationale Datenbanken wie MySQL oder PostgreSQL zu verwenden und mit MVC-Frameworks wie Symfony, RoR oder Django zu kombinieren, und ich denke, dass es großartig funktioniert.

Aber in letzter Zeit habe ich viel über MongoDB gehört, eine nicht relationale Datenbank, oder, um die offizielle Definition zu zitieren ,

Eine skalierbare, leistungsstarke, Open Source, schemafreie, dokumentenorientierte Datenbank.

Ich bin wirklich daran interessiert, nervös zu sein, und möchte mir aller Optionen bewusst sein, die ich für ein nächstes Projekt haben werde, und die besten Technologien da draußen auswählen.

In welchen Fällen ist die Verwendung von MongoDB (oder ähnlichen Datenbanken) besser als die Verwendung einer "klassischen" relationalen Datenbank? Und was sind die Vorteile von MongoDB gegenüber MySQL im Allgemeinen? Oder zumindest, warum ist es so anders?

Wenn Sie Hinweise auf Dokumentation und / oder Beispiele haben, wäre dies ebenfalls eine große Hilfe.

Guillaume Flandre
quelle

Antworten:

57

Hier sind einige der Vorteile von MongoDB für die Erstellung von Webanwendungen:

  1. Ein dokumentbasiertes Datenmodell. Die grundlegende Speichereinheit ist analog zu JSON, Python-Wörterbüchern, Ruby-Hashes usw. Dies ist eine umfangreiche Datenstruktur, die Arrays und andere Dokumente aufnehmen kann. Dies bedeutet, dass Sie häufig in einer einzelnen Entität ein Konstrukt darstellen können, für dessen ordnungsgemäße Darstellung in einer relationalen Datenbank mehrere Tabellen erforderlich sind. Dies ist besonders nützlich, wenn Ihre Daten unveränderlich sind.
  2. Tiefe Abfragefähigkeit. MongoDB unterstützt dynamische Abfragen von Dokumenten mithilfe einer dokumentbasierten Abfragesprache, die fast so leistungsfähig ist wie SQL.
  3. Keine Schemamigrationen. Da MongoDB schemafrei ist, definiert Ihr Code Ihr Schema.
  4. Ein klarer Weg zur horizontalen Skalierbarkeit.

Sie müssen mehr darüber lesen und damit spielen, um eine bessere Vorstellung zu bekommen. Hier ist eine Online-Demo:

http://try.mongodb.org/

Kyle Banker
quelle
3
Ich habe diese Antwort akzeptiert, aber schauen Sie sich unten die anderen guten Antworten an. @marcgg antwortete zum Beispiel mit interessanten Links.
Guillaume Flandre
"Bessere Leistung" zu sagen ist irreführend; es hängt davon ab, was du tust. MongoDB, das Joins nicht unterstützt, macht es nicht schneller, es bedeutet nur, dass es bei einfachen DB-Operationen besser ist (angeblich habe ich tatsächlich keinen Benchmark gesehen, um dies zu beweisen). Sobald Sie die Funktionalität benötigen, die Joins bieten, wird Ihre Leistung mit Mongo sinken. Wenn Sie jedoch überhaupt keine Verknüpfungen oder relationalen Funktionen benötigen, ist Mongo möglicherweise leistungsfähiger / skalierbarer.
Sasha Chedygov
Danke @SashaChedygov. Ich stimme mit Ihnen ein. Das war ziemlich schlampig von mir von 2010 :)
Kyle Banker
@KyleBanker: Keine Sorge, nur kommentieren, falls jemand es 2013 sieht und die falsche Idee bekommt. :) +1 für die Bearbeitung.
Sasha Chedygov
Mongo bietet einen sehr spezifischen Pfad der horizontalen Skalierbarkeit, der in bestimmten Szenarien nützlich ist ....
AK_
23

Es gibt zahlreiche Vorteile.

Zum Beispiel wird Ihr Datenbankschema skalierbarer, Sie müssen sich keine Gedanken über Migrationen machen, der Code ist angenehmer zu schreiben ... Zum Beispiel ist hier einer der Codes meines Modells:

class Setting
  include MongoMapper::Document

  key :news_search, String, :required => true
  key :is_availaible_for_iphone, :required => true, :default => false

  belongs_to :movie
end

Das Hinzufügen eines Schlüssels bedeutet nur das Hinzufügen einer Codezeile!

Es gibt auch andere Vorteile, die auf lange Sicht auftreten werden, wie eine bessere Kammbarkeit und Geschwindigkeit.

... Beachten Sie jedoch, dass eine nicht relationale Datenbank nicht besser ist als eine relationale . Wenn Ihre Datenbank viele Beziehungen und Normalisierungen aufweist, ist es möglicherweise wenig sinnvoll, etwas wie MongoDB zu verwenden. Es geht darum, das richtige Werkzeug für den Job zu finden.

Für weitere Informationen empfehle ich einen Blick auf " Warum ich denke, Mongo ist für Datenbanken das, was Rails für Frameworks war " oder diesen Beitrag auf der Mongodb-Website. Wenn Sie aufgeregt sind und Französisch sprechen, lesen Sie diesen Artikel, in dem erklärt wird, wie Sie MongoDB von Grund auf neu einrichten.

Edit: Ich hätte fast vergessen, dir von diesem Railscast von Ryan zu erzählen . Es ist sehr interessant und macht Lust, sofort loszulegen!

marcgg
quelle
Dieser Railscast scheint wirklich interessant zu sein; Ich werde es mir ansehen und hoffe, dass ich besser verstehe, wie das funktioniert.
Guillaume Flandre
5

Der Vorteil von schemafrei ist, dass Sie alles, was sich in Ihrer Ladung befindet, entsorgen können und niemand jemals einen Grund haben wird, sich darüber zu beschweren oder zu sagen, dass es falsch war.

Es bedeutet auch, dass alles, was Sie darin ablegen, danach völlig bedeutungslos bleibt.

Einige würden das als groben Nachteil bezeichnen, andere nicht.

Die Tatsache, dass eine relationale Datenbank ein gut etabliertes Schema hat, ist eine Folge der Tatsache, dass sie einen gut etablierten Satz von Erweiterungsprädikaten hat, die es uns ermöglichen, dem, was in der Datenbank aufgezeichnet ist, Bedeutung zuzuweisen und was sind auch eine notwendige Voraussetzung dafür.

Ohne ein gut etabliertes Schema, keine Erweiterungsprädikate und ohne Erweiterungspräzikate kann der Benutzer dem, was darin enthalten ist, keine Bedeutung geben.

Erwin Smout
quelle
1
Dies ist wirklich eine Anti-Antwort. Die meisten Bedeutungen, wie die meisten Menschen sie verstehen, ergeben sich aus mehr als nur relationalen Konzepten. Tatsächlich ist es für die meisten Anwendungsentwickler schwieriger, die Bedeutung eines stark normalisierten Schemas zu erkennen als für einen Dokumentenspeicher.
user1020853
1
Bedeutung ergibt sich, wie es die Logik sagt, aus Sätzen. Aussagen können aus Prädikaten mit freien Plätzen entstehen, wenn diese freien Plätze durch tatsächliche Datenelemente ersetzt werden. Diese Datenelemente müssen jedoch aus einer Struktur stammen. Und wenn es eine Struktur gibt, gibt es ein Schema. Wenn es also kein Schema gibt, gibt es keine Struktur, die dazu dienen kann, Sätze zu bilden, die dann Sinn ergeben, außer indem man den Finger in die Luft steckt und einen erfindet. Das ist nicht gegen irgendetwas oder für irgendetwas, es ist eine einfache Tatsache.
Erwin Smout
3
Das ist nur eine Sicht der Bedeutung und passt nur in einen ziemlich engen intellektuellen Kontext (und es ist ein philosophischer, kein logischer). Ihre Antwort lautet im Wesentlichen: "Wenn Sie kein Schema wie eine relationale Datenbank haben, haben Sie keine Bedeutung." Das ist kaum eine Antwort auf die ursprüngliche Frage "Was sind die Vorteile?" daher nenne ich es eine Anti-Antwort. Es ist auch nicht wirklich wahr, es sei denn, wir beschränken die "Bedeutung" auf diesen engen Kontext, aus dem Sie kommen. Es gibt viel Raum für "Bedeutung" ohne ein "gut etabliertes Schema".
user1020853
1
Wie wäre es, wenn Sie mir zeigen, wie Ihre "breitere" Sicht auf "Bedeutung" aussieht und wie sie ohne die Prädikate oder Sätze der Logik existieren kann. Beachten Sie, dass in meinem Kommentar das Wort "relational" nicht einmal erwähnt wurde. Die vorrelationale Datentechnologie hatte Schemata und war daher geeignet, auf "Bedeutung" zu schließen. Die Technologie vor der Datenbank hatte Schemata und war daher geeignet, auf "Bedeutung" zu schließen. Schema-frei hat kein Schema (es sei denn, der "freie" Teil ist eine völlige Lüge) und ist daher nicht geeignet, auf "Bedeutung" zu schließen. ...
Erwin Smout
1
... Schema-frei zwingt seine Benutzer zu einem Ratespiel. Und selbst wenn diese Benutzer es in 90 oder 99% der Fälle schaffen, es richtig zu machen, ist es immer noch genau das, ein Ratespiel.
Erwin Smout
3

Meine Erfahrung mit Postgres und Mongo nach der Arbeit mit beiden Datenbanken in meinen Projekten.

Postgres (RDBMS)

Postgres wird empfohlen, wenn Ihre zukünftigen Anwendungen ein kompliziertes Schema haben, das viele Verknüpfungen erfordert, oder alle Daten Beziehungen haben oder wenn wir viel schreiben. Postgres ist Open Source, schneller, ACID-kompatibel und benötigt weniger Speicher auf der Festplatte. Es ist rundum gut für den JSON-Speicher geeignet und umfasst die vollständige Serialisierbarkeit von Transaktionen mit drei Ebenen der Transaktionsisolation.

Der größte Vorteil eines Aufenthalts bei Postgres ist, dass wir das Beste aus beiden Welten haben. Wir können Daten mit Einschränkungen, Konsistenz und Geschwindigkeit in JSONB speichern. Andererseits können wir alle SQL-Funktionen für andere Datentypen verwenden. Die zugrunde liegende Engine ist sehr stabil und kommt mit einem guten Datenvolumen gut zurecht. Es läuft auch auf Ihrer Wahl der Hardware und des Betriebssystems. Postgres bietet NoSQL-Funktionen sowie vollständige Transaktionsunterstützung und speichert JSON-Dokumente mit Einschränkungen für die Felddaten.

Allgemeine Einschränkungen für Postgres

Das horizontale Skalieren von Postgres ist erheblich schwieriger, aber machbar.

Schnelle Lesevorgänge können mit Postgres nicht vollständig erreicht werden.

KEINE SQL-Datenbanken

Mongo DB (Wired Tiger)

MongoDB kann Postgres in der Dimension "horizontale Skala" schlagen. Das Speichern von JSON ist das, wofür Mongo optimiert ist. Mongo speichert seine Daten in einem Binärformat namens BSONb, das (ungefähr) nur eine binäre Darstellung einer Obermenge von JSON ist. MongoDB speichert Objekte genau so, wie sie entworfen wurden. Laut MongoDB bietet die neue Engine (Wired Tiger) für schreibintensive Anwendungen den Benutzern eine bis zu 10-fache Steigerung der Schreibleistung (ich sollte dies versuchen), wobei die Speichernutzung um 80 Prozent reduziert wird, was zur Senkung der Speicherkosten beiträgt , erreichen eine größere Auslastung der Hardware.

Allgemeine Einschränkungen von MongoDb

Die Verwendung einer schemafreien Speicher-Engine führt zum Problem impliziter Schemas. Diese Schemata werden nicht von unserer Speicher-Engine definiert, sondern basieren auf dem Anwendungsverhalten und den Erwartungen.

Eigenständige NoSQL-Technologien erfüllen nicht die ACID-Standards, da sie den kritischen Datenschutz zugunsten einer hohen Durchsatzleistung für unstrukturierte Anwendungen opfern. Es ist nicht schwer, ACID auf NoSQL-Datenbanken anzuwenden, aber es würde die Datenbank bis zu einem gewissen Grad langsam und unflexibel machen. "Die meisten NoSQL-Einschränkungen wurden in den neueren Versionen und Releases optimiert, die die vorherigen Einschränkungen weitgehend überwunden haben."

ProgrammerPanda
quelle
2

Es geht nur um Kompromisse. MongoDB ist schnell, aber nicht ACID, es hat keine Transaktionen. In einigen Anwendungsfällen ist es besser als MySQL und in anderen schlechter.

AABBCCDD
quelle
Bitte überprüfen Sie diesen Kommentar jetzt. MongoDb 4.0 unterstützt jetzt saure Transaktionen.
Anant Simran Singh
1

In MongoDB geschriebene Balgzeilen: Der endgültige Leitfaden.

Es gibt mehrere gute Gründe:

  1. Das Aufbewahren verschiedener Arten von Dokumenten in derselben Sammlung kann für Entwickler und Administratoren ein Albtraum sein. Entwickler müssen sicherstellen, dass jede Abfrage nur Dokumente einer bestimmten Art zurückgibt oder dass der Anwendungscode, der eine Abfrage ausführt, Dokumente unterschiedlicher Form verarbeiten kann. Wenn wir nach Blog-Posts fragen, ist es mühsam, Dokumente mit Autorendaten auszusortieren.
  2. Das Abrufen einer Liste von Sammlungen ist viel schneller als das Extrahieren einer Liste der Typen in einer Sammlung. Wenn wir beispielsweise einen Typschlüssel in der Sammlung hätten, der besagt, ob es sich bei jedem Dokument um ein "überfliegen", "ganzes" oder "klobiges Affendokument" handelt, wäre es viel langsamer, diese drei Werte in einer einzelnen Sammlung zu finden als zu haben drei separate Sammlungen und fragen nach ihren Namen
  3. Das Gruppieren von Dokumenten derselben Art in derselben Sammlung ermöglicht die Datenlokalität. Das Abrufen mehrerer Blog-Posts aus einer Sammlung, die nur Posts enthält, erfordert wahrscheinlich weniger Festplattensuchen als das Abrufen derselben Posts aus einer Sammlung, die Posts und Autorendaten enthält.
  4. Wir beginnen, unseren Dokumenten eine gewisse Struktur aufzuerlegen, wenn wir Indizes erstellen. (Dies gilt insbesondere für eindeutige Indizes.) Diese Indizes werden pro Sammlung definiert. Indem wir nur Dokumente eines einzigen Typs in dieselbe Sammlung aufnehmen, können wir unsere Sammlungen effizienter indizieren
Nanhe Kumar
quelle
0

Nach einer Frage von Datenbanken mit Textspeicherung) warf ich einen Blick auf MongoDB und ähnliche Systeme.
Wenn ich es richtig verstanden habe, sollen sie einfacher zu bedienen und einzurichten sein und viel schneller. Vielleicht auch sicherer, da das Fehlen von SQL die SQL-Injection verhindert ...
Anscheinend wird MongoDB hauptsächlich für Webanwendungen verwendet.
Grundsätzlich und sie geben an, dass diese Datenbanken selbst nicht für komplexe Abfragen, Data Mining usw. geeignet sind. Sie glänzen jedoch darin, schnell viele flache Daten abzurufen.

PhiLho
quelle
1
Ihre Antwort enthält einige Missverständnisse. Während MongoDB nicht für SQL-Injection anfällig ist, ist es allgemeiner für Injection anfällig. Sie können beliebiges Javascript in der $ where-Klausel einer Abfrage angeben. Im Gegensatz zu vielen anderen NoSQL-Optionen kann MongoDB auch einige ziemlich komplexe Abfragen ausführen.
Emily
Danke für die Präzision. Beachten Sie, dass, wie bereits erwähnt, die MongoDB-Site selbst Einschränkungen für relationale Abfragen erlassen hat. Es sei denn, ich habe etwas anderes falsch verstanden ...
PhiLho
Es ist ziemlich wahrscheinlich, dass MongoDB für komplexe relationale Abfragen ungeeignet ist, aber für komplexe nicht relationale Abfragen ist es ziemlich gut geeignet. Unter mongodb.org/display/DOCS/Advanced+Queries finden Sie einige der coolen Dinge, die Sie tun können.
Emily
0
  1. MongoDB unterstützt die Suche nach Feldern und die Suche nach regulären Ausdrücken. Enthält benutzerdefinierte Java-Skriptfunktionen.
  2. MongoDB kann als Dateisystem verwendet werden und nutzt die Funktionen zum Lastenausgleich und zur Datenreplikation auf mehreren Computern zum Speichern von Dateien.
user2982063
quelle