Ich möchte ein triviales Beispiel dafür, wo MongoDB skaliert werden kann, aber eine relationale Datenbank wird Probleme haben [geschlossen]

8

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.

Ryan Weir
quelle
Ist dies generell auf MongoDB oder NoSQL beschränkt? Ich hätte ein gutes Beispiel für die facettierte Suche von Apache Lucene, die allerdings keine Ahnung hat, ob dies auch für MongoDB gelten würde.
Thorsten Müller
NoSQL im Allgemeinen, nehme ich an. Wenn Sie bereits einige Beispiele haben, würde ich sie gerne sehen.
Ryan Weir
3
MongoDB ist Web Scale !!!
Wim Ombelets
1
Siehe mongodb-is-web-scale.com für eine interessierte (und leicht NSFW) Erklärung; fwiw Sie können alles skalieren, wenn Sie es richtig angehen.
Wyatt Barnett

Antworten:

6

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 NULLfü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.

Philipp
quelle
5
"Zweitens erlaubt es heterogene Daten." Ihr Beispiel ist perfekt. Wer hat nicht das schreckliche Muster, die Datenbank in einen Schlüsselwertspeicher umzuwandeln, in einem solchen System entstehen lassen, in dem Entitäten viele mögliche Attribute haben? Jeder Programmierer sollte in der Lage sein, sich sofort zu beziehen.
Ryan Weir
5
MongoDB hat auch einige Skalierungsprobleme. Ein Cluster mit mehr als 12 Knoten kann den Standardreplikationsmechanismus für Replikatsätze nicht verwenden. Sie müssen auf das Master-Slave-Setup zurückgreifen. Bei der Master-Slave-Replikation treten Probleme auf, z. B. kein automatisches Failover bei Verlust des Masters. Während MySQL Hunderte von Knoten in einem Cluster verarbeiten kann.
Steinmetz
1
Ich weiß nicht, dass das Zulassen heterogener Daten ein Faktor für die Skalierbarkeit von MongoDB ist. Obwohl ich damit einverstanden bin, dass dies viele Fälle vereinfacht, in denen Sie Ihre Datenbank als Schlüssel- /
Wertspeicher verwenden,
2
Entschuldigung, es war nichts in Ihrer Antwort. Es ist nur so, dass der Titel dieser Frage lautet: "Ich möchte ein triviales Beispiel dafür, wo MongoDB skaliert werden kann, aber eine relationale Datenbank wird Probleme haben." Es scheint keine allgemeine Frage zu sein, wann NoSQL über RDBMS verwendet werden soll. Stattdessen schien es ausschließlich auf Skalierungsfunktionen beider Datenbanktypen ausgerichtet zu sein.
dsw88
2
@ RyanWeir - vereinbart. Wann leuchtet eine NoSQL-Datenbank? Wenn Sie feststellen, dass Sie gerade eine NoSQL-Datenbank mit einer SQL-RDB als Speicher-Engine erstellt haben!
Carson63000
3

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.

thorsten müller
quelle
2

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.

HLGEM
quelle
1
Dies ist auch aus gutem Grund ein guter Grund für einen Kontaktmanager. Jeder möchte etwas anderes verfolgen. Es ist keine große Sache, solange Sie wissen, für welche Spalte: Text14 verwendet wird.
JeffO
0

Je kleiner das Projekt / System ist, desto besser, da weniger Raum für Meinungsverschiedenheiten bleibt.

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.

Idioten
quelle
Danke, ich liebe dieses Beispiel und werde es nutzen. Aber wenn das, was Sie sagen, wahr ist, dass "NoSQL nur in großen Umgebungen besser ist", muss ich auf der Seite einer schnelleren Entwicklungszeit, einer besseren Zukunftssicherheit der Skalierung usw. ein stärkeres Argument vorbringen. Andere Ideen ?
Ryan Weir
4
@ RyanWeir Die Antworten auf diese Fragen müssen anwendungsspezifisch sein. Um ganz ehrlich zu sein, klingt es so, als ob Sie NoSql an das Team verkaufen möchten, weil Sie NoSql lernen möchten. Aber das ist ein ungültiger Grund, also versuchen Sie, sich etwas anderes auszudenken. Ich würde ihnen nur sagen: "Lass uns NoSQL verwenden, damit wir es lernen können. Es ist eine gute Fähigkeit zu haben."
Idioten
1
Warum ist das überhaupt ein Datenbankproblem? Wenn ich solche Berechnungen ausführen müsste, würde ich sie als Variante von A * einrichten, die nach dem ersten Ergebnis nicht aufhört. Ziehen Sie alle relevanten Flugdaten aus der Datenbank (oder lassen Sie sie bereits im Speicher zwischengespeichert), erstellen Sie ein Diagramm, das nach den vom Benutzer festgelegten Prioritäten gewichtet ist, und geben Sie die erste X-Anzahl von Ergebnissen an.
Mason Wheeler
@ MasonWheeler nicht sicher, was Sie mit "Variante auf A *"
meinen
1
@ RyanWeir: Idioten haben wirklich recht. NoSQL ist nur in großen Umgebungen besser. Wenn Sie nicht versuchen, etwas in großem Maßstab aufzubauen (z. B. Facebook, Flickr, EBay, Amazon usw.), brauchen Sie es mit ziemlicher Sicherheit nicht, und die Kompromisse in der Entwicklungszeit werden es wert, sobald Sie zu moderat werden. Großmaßstab, den das relationale Modell auf moderner Hardware recht gut handhabt. Dann werden Sie die Vorteile und Garantien, die ACID und das relationale Modell bieten, wirklich zu schätzen wissen.
Mason Wheeler