Wann sollten wir MongoDB verwenden?


16

MongoDB ist eine NoSQL-Datenbank, deren Verwendung ich als recht einfach empfunden habe. Vor kurzem musste ich eine einfache Anwendung entwickeln, die einige Daten mithilfe von HTTP-Anforderungen erfassen und einige Ergebnisse nach der Verarbeitung der Daten speichern musste, und ich habe versucht, MongoDB zu verwenden.

Aufgrund dieser Erfahrung fand ich es viel angenehmer, relationale Datenbanken zu verwenden, und da ich ein Entwickler und kein DBA bin, wurde meine Arbeit stark vereinfacht.

Trotzdem bin ich mir manchmal unsicher, wann ich MongoDB anstelle einer herkömmlichen relationalen Datenbank wie SQL Server oder MySQL verwenden soll.

In diesem Fall, wenn wir MongoDB anstelle von relationalen Datenbanken verwenden können? Gibt es eine wirklich große Einschränkung bei MongoDB, die es für einige Situationen unpassend macht?


8
Verwenden Sie MongoDB immer dann, wenn Sie sich nicht um unwichtige Details wie die referenzielle Integrität kümmern (um sicherzustellen, dass die Daten nicht beschädigt werden). Schemata (um sicherzustellen, dass die Daten tatsächlich das enthalten, was Sie glauben) Sie einfügen wird tatsächlich gespeichert ) oder die Fähigkeit, nicht-triviale Abfragen für Ihren Datensatz zu schreiben (so können Sie tatsächlich nützliche und kreative Dinge mit den Daten tun.)
Mason Wheeler


2
@MasonWheeler Einverstanden. In diesem Zusammenhang bedeutet "einfach und benutzerfreundlich" "benutzerfreundlicher beim Schreiben von Fehlern und beim Verfälschen von Daten";)
Andres F.

Antworten:


17

Grundsätzlich:

  • Wenn Sie Ihre Daten in Form einer Reihe von Dokumenten darstellen können, ist MongoDB eine gute Wahl.

  • Wenn Sie sich Ihre Daten lieber als eine Menge miteinander verbundener Tabellen vorstellen möchten, ist MongoDB möglicherweise keine gute Wahl.

Hier sind zwei Beispiele, die ich illustrativ finde:

  • Vor ein paar Jahren habe ich eine Blog-Engine erstellt. Ihr Zweck ist es, Blog-Artikel zu hosten und für jeden Artikel die verschiedenen Versionen, einige Metadaten, Besuchsstatistiken usw. zu speichern.

    Dies könnte als eine Reihe von Tabellen gespeichert werden, aber wenn Sie versuchen, ein Modell zu erstellen, wächst es sehr schnell auf ein Dutzend Tabellen, wenn nicht sogar mehr. Einige SQL-Abfragen könnten mit vielen joins hässlich werden , und ... nun, Sie bekommen das Bild.

    Das Problem dabei ist, dass es eine zentrale Sache gibt - einen Blog-Artikel - und all diese Dinge rund um den Artikel, was ihn für eine dokumentbasierte Datenbank gut geeignet macht. Mit MongoDB war das Modellieren der Datenbank extrem einfach: Eine Sammlung enthält die Blog-Artikel, und eine zweite winzige Sammlung enthält die Liste der Benutzer, die Artikel schreiben dürfen. Jedes Dokument in der ersten Sammlung würde alle Informationen enthalten, die ich zum Anzeigen eines Artikels benötige, sei es der Name des Autors oder die Tags.

  • Stellen Sie sich jetzt ein ganz anderes Projekt vor. Es gibt einige Benutzer, die Zeug schreiben und die von anderen Benutzern geschriebenen Sachen teilen können. Auf einer Seite eines Benutzers würden Sie sowohl Dinge finden, die dieser Benutzer geschrieben hat, als auch die, die er geteilt hat. Es gibt eine Einschränkung: Wenn jemand das, was er in der Vergangenheit geschrieben hat, bearbeitet, wird die Änderung überall dort angezeigt, wo der ursprüngliche Text geteilt wurde.

    Bei einem dokumentbasierten Ansatz ist es schwierig, das Dokument zu finden. Ein Benutzer vielleicht? Nun, das ist ein guter Anfang. Ein Benutzerdokument würde alle Dinge enthalten, die dieser Benutzer geschrieben hat. Aber was ist mit den Dingen, die sie geteilt hat?

    Ein möglicher Weg ist, diese Dinge in dasselbe Dokument zu schreiben. Das Problem bei diesem Ansatz ist, dass die Anwendung jedes Benutzerdokument in der Datenbank durchgehen sollte, um jedes Vorkommen des alten Eintrags zu bearbeiten, wenn jemand einen Eintrag bearbeitet. Datenduplizierung nicht mitgezählt.

    Eine Alternative wäre, im Benutzerdokument nur die Liste der von diesem Benutzer freigegebenen Einträge (mit der ID des verwiesenen Benutzers und des Eintrags) zu speichern. Jetzt tritt jedoch ein anderes Problem auf: Wenn ein Benutzer Tausende von Einträgen von Tausenden von Benutzern freigegeben hat, müssen Tausende von Dokumenten geöffnet werden, um diese Einträge zu erhalten.

    Oder wir können unsere Sammlung um die Einträge selbst herum modellieren, wobei sich jeder Eintrag auf seinen Autor bezieht und eine Liste der Benutzer enthält, die ihn geteilt haben. Auch hier können Leistungsprobleme auftreten, wenn Sie alle Dokumente durchgehen müssen, um die von einem bestimmten Benutzer veröffentlichten Dokumente anzuzeigen.

    Wie viele Tabellen würden Sie benötigen, wenn Sie eine relationale Datenbank verwenden würden? Richtig, drei. Es wäre einfach zu modellieren und auch einfach zu verwenden.


Diese Antwort muss aktualisiert werden, da MongoDB seit Version 4.0 ACID anwenden soll, obwohl Python und Java API für Multitransaktionen mongodb.com/blog/post/…
Carmine

@Carmine: Ich habe nicht genug Wissen, um eine aktualisierte Antwort zu geben. Könnten Sie bitte (1) Ihre als Antwort unten posten und (2) hier einmal einen Kommentar hinzufügen, damit ich meiner Antwort einen Haftungsausschluss mit einem Link zu Ihrer hinzufüge, der besagt, dass dies ab MongoDB 4 nicht mehr gültig ist?
Arseni Mourzenko

9

Jede Technologie hat ihre Vorteile.

Der Vorteil relationaler Datenbanken besteht darin, dass das RDBMS einige Dinge für Sie erledigt, z.

  • Erzwingen der referenziellen Integrität (das Einfügen eines Rechnungsdetails ist nicht zulässig, wenn die Rechnung, zu der es gehört, nicht vorhanden ist)
  • Redundanz vermeiden: Dinge werden nur einmal gespeichert.
  • Komplexe Abfragen können mit einer ausgereiften, bewährten und weit verbreiteten deklarativen Sprache (SQL) durchgeführt werden.

Alles läuft darauf hinaus, dass Sie weniger Code schreiben müssen, weil das RDBMS die Dinge für Sie erzwingt.

Datenunabhängigkeit: Wenn Sie Standard-SQL-Strukturen und keine herstellerspezifischen Strukturen verwenden, können Sie Ihre Daten häufig mit minimalem Aufwand von einem RDBMS auf ein anderes migrieren, während NOSQL-Datenbanken überhaupt nicht standardisiert sind.

Andererseits ist einer der Vorteile von NOSQL-Datenbanken, dass sie besser skaliert werden können, um die Leistung für Millionen von Zeilen aufrechtzuerhalten. Sie eignen sich besser für die dokumentenbasierte Speicherung, dh nicht strukturierte Daten. Die meisten Anwendungen benötigen diese Funktionen jedoch nicht.


5
Das Fehlen von Transaktionen in MongoDB ist ein großer Nachteil. Sich die ganze Zeit um die Rennbedingungen sorgen zu müssen, ist so ein Schmerz im Arsch.
CodesInChaos

1
Hinweis: MongoDB unterstützt jetzt ACID-Transaktionen.
Milan Velebit

5

Für Ihren speziellen Fall klingt MongoDB wie eine gute Wahl, aber es gibt viele Szenarien (wahrscheinlich die meisten), in denen es nicht die beste Wahl wäre.

MongoDB eignet sich besser für Szenarien, in denen viele Daten gelesen / geschrieben werden müssen, ohne dass die Transaktionssicherheit im Vordergrund steht (wenn bei einem Serverabsturz gelegentlich Daten verloren gehen, ist dies keine große Sache). Ich habe wirklich ein stabiles Schema.

MongoDB eignet sich nicht für Szenarien, in denen Folgendes erforderlich ist:

  1. Starke ACID-Garantien: MongoDB ermöglicht das Speichern doppelter Daten, inkonsistente Lesevorgänge und sogar Datenverluste. Diese Dinge sind in einigen Anwendungen in Ordnung, in den meisten jedoch nicht.
  2. Transaktionen mit mehreren Objekten: MongoDB unterstützt ACID-Transaktionen, jedoch nur für ein einzelnes Objekt / Dokument. Dies ist für komplexere Vorgänge wie Banküberweisungen, Reservierungen usw. einfach nicht ausreichend.
  3. Traditionelles BI: Es gibt viele BI-Tools, die nur mit traditionellem SQL gut funktionieren.
  4. SQL: MongoDB hat eine sehr spezifische Abfragesprache, wohingegen SQL vielen Leuten sehr gut bekannt ist (was ein wichtiger Aspekt sein könnte) und viele komplexe Dinge erledigen kann (während Sie mit MongoDB Probleme haben würden, eine einfache Abfrage durchzuführen) join) und ist auf viele Implementierungen übertragbar.

MongoDB ist schneller und ermöglicht es Ihnen, mehr Leistung aus dem System herauszuholen, indem Sie eine Menge von Dingen eliminieren, die RDBMS standardmäßig erzwingt, wie beispielsweise Integritätsprüfungen (beachten Sie, dass Sie RDBMS auch für solche Zwecke optimieren können). In den meisten Szenarien wird es einfach nicht benötigt. Außerdem ist der Kompromiss Zuverlässigkeit und Flexibilität (Sie werden Probleme haben, wenn Sie später entscheiden, dass Sie komplexere Vorgänge mit vorhandenen Daten ausführen müssen).

Es hängt alles von den Anforderungen der Anwendung ab, die Sie erstellen. Ist es Geschwindigkeit und Verfügbarkeit oder Sicherheit, Zuverlässigkeit und Flexibilität. Sie müssen wissen, wo in Ihren Daten (und in den Verbindungen Ihrer Daten) mehr Wert liegt. Wenn Sie es noch nicht wissen, ist es wahrscheinlich das Beste, wenn Sie sich für etwas entscheiden, das Sie in Zukunft nicht mehr in eine Ecke bringt und es Ihnen ermöglicht, die Funktionen hinzuzufügen und die Vorgänge auszuführen, die Ihre Anwendung benötigt.


3

MongoDB eignet sich hervorragend, wenn Sie Ihre Daten als unabhängige "Informationspakete" darstellen können. Sie haben Google Maps Postleitzahlen, in die Postleitzahl sind Firmen eingebettet und in den Firmen sind Mitarbeiter. Alle Postleitzahlen sind unabhängig voneinander und Sie können die gesamten Informationen auf einfache, hübsche und schnelle Weise abrufen. Das ist ein gutes Szenario für eine Nicht-SQL-Lösung.

Einmal gesagt, stimme ich dem aktuellen Trend, den ich sehe, überhaupt nicht zu. Dies impliziert, dass MongoDB eine Art Post- und überlegene Lösung für RDBMS ist und noSQL standardmäßig Ihre Lösung sein muss. Das alles ist absurd. MongoDB ist eine Nischendatenbank, und 90% der Projekte sind relational und benötigen eine RDBMS-Option, da Sie eine leistungsstarke Abfragelösung wie SQL benötigen, um Ihre Berichte zu erstellen und nach verteilten Daten zu suchen: "Joins" sind ein Vorteil, kein Nachteil. Außerdem unterstützen moderne RDBMS BSON-Sammlungen und die Integration von Geodaten, sodass die Nische für noSQL jetzt möglicherweise noch enger ist.


2

MongoDB ist nützlich, um die gesamten strukturierten Daten zu speichern, die zum Erstellen einer bestimmten Instanz einer Webseite erforderlich sind. Sie können die Daten für eine bestimmte Seite abrufen und an Ihre Client-Anwendung übergeben, die sie dann rendern kann.

In einem solchen Kontext ist MongoDB sehr schnell und zuverlässig. Vergessen Sie jedoch niemals, dass Ihre Datenbank keine relationalen Informationen enthält. Das heißt, wenn Sie etwas an der Struktur Ihrer Webseite ändern, können Sie möglicherweise die Lücken in Ihren bereits gespeicherten Seiten nicht füllen, da Sie nicht über die dafür erforderlichen Daten verfügen. Mehr dazu hier: http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.