Ich bin nicht so vertraut mit ihnen (ich habe nur den gleichen Blog/Nachrichten/Beispiele wie alle anderen gelesen), aber meine Meinung ist, dass sie eine Menge der normalen relationalen DB Funktionen in der opfern Name der Skalierbarkeit - ich werde versuchen, erklären.
Stellen Sie sich vor, Sie haben 200 Zeilen in Ihrer Datentabelle.
Im Google Datencenter sind 50 dieser Zeilen auf Server A, 50 auf B und 100 auf Server C gespeichert. Außerdem enthält Server D redundante Kopien von Daten von Server A und B und Server E enthält redundante Kopien von Daten auf Server C.
(Im wirklichen Leben habe ich keine Ahnung, wie viele Server würden verwendet werden, aber es ist eingerichtet, um mit vielen Millionen Zeilen umzugehen, so stelle ich mir einige vor).
Um "* where name = 'orion'" auszuwählen, kann die Infrastruktur diese Abfrage an alle Server senden und die zurückkommenden Ergebnisse aggregieren. Dies erlaubt ihnen, ziemlich linear über so viele Server zu skalieren, wie sie möchten (FYI das ist ziemlich genau was mapreduce ist)
Dies bedeutet jedoch, dass Sie einige Kompromisse brauchen.
Wenn Sie für einige Daten einen relationalen Join durchführen mussten und dieser sich auf 5 Server verteilen musste, musste jeder dieser Server für jede Zeile für jede Zeile Daten voneinander ziehen. Versuchen Sie das, wenn Sie 2 Millionen Zeilen auf 10 Servern verteilt haben.
Dies führt zu Kompromiss # 1 - keine Joins.
Je nach Netzwerklatenz, Serverlast usw. können einige Ihrer Daten sofort gespeichert werden, aber einige können eine Sekunde dauern oder 2. Wenn Sie Dutzende von Servern haben, wird dies immer länger und Der normale Ansatz von "Jeder wartet nur, bis der langsamste Typ fertig ist" wird nicht mehr akzeptabel.
Dies führt zu einem Kompromiss # 2 - Ihre Daten sind möglicherweise nicht immer sofort sichtbar, nachdem sie geschrieben wurden.
Ich bin mir nicht sicher, was andere Vor- und Nachteile gibt es, aber aus der Spitze von meinem Kopf, das sind die Haupt 2.
Auch wenn die Datenkaskade beim Aktualisieren oder Löschen unerwünscht ist, oder wenn die Änderung nicht negativ ist; Die Denormierung scheint ebenfalls Sinn zu machen oder zumindest keine schlechte Wahl zu sein. Zum Beispiel wären Rechnungspositionsartikel ziemlich nutzlos, wenn sie nur eine Referenz auf eine Aktie mit einem festen Preis wären, da, wenn die Aktie den Preis aktualisiert, würde die Rechnung den Betrag falsch melden. Das Beispiel ist verschachtelt und könnte ohne Denormalisierung umgangen werden, allerdings erhöhen die meisten Workarounds die Active-Set-Größe oder nehmen Daten aus kohäsiven RDBMS. – MrMesees