Ich lerne gerade, MongoDB zu verwenden, und wenn ich mit anderen Programmierern diskutiere, möchte ich ein kurzes Beispiel dafür, warum NoSQL im Vergleich zu einem herkömmlichen RDBMS eine gute Wahl sein kann - jedoch scheinen die Szenarien, die ich mir ausgedacht habe und die ich online finde, ziemlich ausgeklügelt zu sein.
Ein Blog mit viel Verkehr könnte beispielsweise relational dargestellt werden, erfordert jedoch eine gewisse Leistungsoptimierung und Verknüpfungen über Tabellen hinweg (vorausgesetzt, es wird eine vollständige Denormalisierung verwendet). Während MongoDB den direkten Abruf aus einer Sammlung mit dem gleichen Effekt ermöglichen würde.
Aber die Antwort, die ich von anderen Programmierern bekomme, lautet: "Warum nicht einfach relational halten und später etwas triviales Caching hinzufügen?"
Hat jemand ein weniger ausgeklügeltes Beispiel, bei dem MongoDB wirklich glänzt und eine relationale Datenbank viel schneller umfällt? Je kleiner das Projekt / System ist, desto besser, da weniger Raum für Meinungsverschiedenheiten bleibt.
Etwas in der Art der Komplexität des Blog-Beispiels wäre wirklich nützlich.
Vielen Dank.
quelle
Antworten:
Erstens skaliert es gut.
Wenn eine MongoDB-Datenbank für einen einzelnen Server zu häufig oder zu groß ist, können Sie problemlos weitere Server hinzufügen, indem Sie einen Cluster oder einen Replikatsatz mit mehreren Shards erstellen. Es skaliert fast linear. Dies funktioniert bei den meisten relationalen Datenbanken bei weitem nicht so gut. Sehen Sie sich beispielsweise die Liste der Einschränkungen von MySQL an, wenn Sie als Cluster arbeiten . Die meisten Einträge in der Liste sind für MongoDB kein Problem (oder gelten nicht).
Zweitens ermöglicht es heterogene Daten.
Stellen Sie sich zum Beispiel die Produktdatenbank eines Computerhardwaregeschäfts vor. Welche Eigenschaften haben Produkte? Alle Produkte haben einen Preis und einen Verkäufer. Aber CPUs haben eine Taktrate, Festplatten und RAM-Chips haben eine Kapazität (und diese Kapazitäten sind nicht vergleichbar), Monitore haben eine Auflösung und so weiter. Wie würden Sie dies in einer relationalen Datenbank entwerfen? Sie würden entweder eine sehr lange productID-property-value-Tabelle erstellen oder eine sehr breite und spärliche Produkttabelle mit jeder erdenklichen Eigenschaft, die meisten davon jedoch
NULL
für die meisten Produkte. Beide Lösungen sind nicht wirklich elegant. MongoDB kann dies jedoch viel besser lösen, da jedes Dokument in einer Sammlung unterschiedliche Eigenschaften aufweist.quelle
Ein reales Beispiel für ein Problem Ich hätte keine Ahnung, wie ich es mit SQL und einer relationalen Datenbank allein auf vernünftige Weise lösen könnte (vielleicht meine Schuld).
Wir haben also eine (gemeinsame relationale) Datenbank mit ungefähr 30.000 Produkten. Bisher nichts Großes. Jedes dieser Produkte hat viele Eigenschaften. Es gibt die gängigen wie Gruppe (Kabel, Antennen, iPhone-Hüllen ... ca. 80), Sortiment (irgendwie ähnlich wie Gruppen: Auto, Hifi, MP3, nur 15), Marke (30).
Dann kommen die technischen Daten. Jeder Artikel hat viele davon wie Farbe, Kabellänge, Gewicht, Volumen. etwa 200 solcher Werttypen und Tausende von Werten.
Und das komplizierteste: Viele dieser Produkte gehören entweder zu einem Autotyp (oder zu mehreren von ihnen) oder zu einem mobilen Gerät. Diese kommen in Hierarchien in der Form wie: Marke (Apfel) Modell (iPad) Typ (1,2,3,4) und in einigen Fällen Generation. (Für Autos ist es ähnlich, obwohl wir anstelle der Generation Jahre gebaut haben)
Problem Schritt Eins:
Wir möchten die Anzahl der Produkte für jedes dieser Attribute. Wie viele sind rot? Wie viele sind in der Kabelgruppe? Und so weiter.
Dies könnte teilweise mit SQL gelöst werden. Es wäre eine Menge Fragen und ziemlich hässlich, aber ich denke möglich. Vielleicht langsam, aber wir könnten es noch hässlicher machen und die Zähler in jeder Tabelle behalten und bei jeder Änderung aktualisieren. Besonders schwierig bei solchen Attributen, bei denen ein Produkt mehrere haben kann (wie bei iPhone und 12 anderen Mobiltelefonen)
Aber hier kommt Problem Schritt zwei:
Wenn ein Kunde ein Attribut auswählt (sagen wir, er möchte nur Produkte sehen, die rot sind), möchten wir alle diese Zähler in Echtzeit aktualisieren. Dies bedeutet, dass wir entweder extrem komplizierte Abfragen haben würden (wahrscheinlich sowieso nicht schnell genug) oder Zähler für mögliche Kombinationen von Attributen (Milliarden) behalten würden.
Als ich mit diesem Projekt anfing, hatten sie die Zähleroption ausprobiert und dies für eine sehr kleine Teilmenge von Attributen (Gruppe, Sortiment, Marke) getan. Der Code war hässlich, fehlerhaft und langsam. Außerdem hatten sie jetzt einen Tisch mit Theken, der viel größer war als der Produkttisch.
Die Verwendung der Facetten von Apache Solr war eigentlich die Lösung. Reduzieren Sie die Tabellen zu einer Liste von Dokumenten (eines pro Produkt), mit denen alle diese Daten in Echtzeit mit weitaus einfacheren Abfragen abgerufen werden können.
quelle
Sie können sich jederzeit vorstellen, dass eine EAV-Tabelle der beste Weg ist, um Dinge zu tun (notorisch langsam in realistischen Datenbanken und schwer abzufragen). Möglicherweise benötigen Sie eine nosql-Datenbank. Dies gilt insbesondere dann, wenn Sie nicht im Voraus wissen können, wie die Felder aussehen würden. Ein Beispiel wäre das Speichern der Details von medizinischen Tests. Jeder neue Test enthält möglicherweise völlig andere Daten, die Sie speichern müssen. Und während Sie (theoretisch) vorhandene Tests modellieren könnten (mit viel Zeit und Mühe, da es Tausende davon gibt), wie würden Sie wissen, aus welchen neuen Tests Sie möglicherweise Ergebnisse für Tests (und möglicherweise medizinische Geräte) erhalten, die wir haben? Ich habe es noch nicht einmal erfunden.
quelle
Dies ist schwierig, da NoSQL nur in großen Umgebungen besser ist. Ich nehme an, Sie meinen ein einfaches Beispiel, und ich habe ein perfektes für Sie.
Angenommen, Sie erstellen eine Reise-Website und müssen Ihre Benutzer von und zu den 5.170 US-Flughäfen reisen lassen, die für einen der anderen (gleichen) 5.170 US-Flughäfen bestimmt sind ...
Aber hier ist der Kicker, nicht alle Flüge sind direkt, Sie müssen dem Benutzer auch alle Zwischenstoppoptionen mitteilen, manchmal 2 oder 3 Zwischenstopps. Sie müssen dem Benutzer auch alle Optionen innerhalb eines 5-Stunden-Fensters mitteilen! Und Sie müssen dies in weniger als 10 Sekunden berechnen, während der Benutzer wartet.
Dies ist der relationale DB-Albtraum ... In NoSql werden Flugrouten normalerweise einige Wochen im Voraus in Stein gemeißelt, sodass Sie alle Gazillionen möglicher Routen im Voraus speichern können als in einem einfachen NoSql-DB-Cluster ...
NoSql ist der klare Gewinner eines solchen Szenarios.
quelle