16

Neue Schul-Datastore-Paradigmen wie Google BigTable und Amazon SimpleDB sind unter anderem speziell auf Skalierbarkeit ausgelegt. Im Grunde sind das Verbot von Verbindungen und Denormalisierung die Art und Weise, wie dies erreicht wird.Pro's von Datenbanken wie BigTable, SimpleDB

In this Thema, jedoch scheint der Konsens über große Tabellen, dass schließt sich zu sein nicht necessarilly zu teuer sein und Denormalisierung ist „überbewertet“ zu einem gewissen Grad Warum also tun diese vorgenannten Systeme nicht zulassen verbindet und alles in einer einzigen Tabelle zusammenführen, um Skalierbarkeit zu erreichen? Ist es die schiere Menge an Daten, die in diesen Systemen (viele Terabyte) gespeichert werden müssen?
Passen die allgemeinen Regeln für Datenbanken einfach nicht auf diese Skalen? Liegt es daran, dass diese Datenbanktypen speziell auf die Speicherung vieler ähnlicher Objekte zugeschnitten sind?
Oder fehlt mir ein größeres Bild?

Antwort

16

Verteilte Datenbanken sind nicht ganz so naiv, wie Orion impliziert; Es wurde einiges an Arbeit an der Optimierung vollständig relationaler Abfragen über verteilte Datensätze getan. Vielleicht möchten Sie sehen, was Unternehmen wie Teradata, Netezza, Greenplum, Vertica, AsterData, etc. tun. (Oracle kam schließlich auch mit ihrer kürzlichen Ankündigung ins Spiel; Microsoft kaufte ihre Firma im Namen der Firma, die früher DataAllegro hieß).

Wenn die Daten in Terabytes skaliert werden, werden diese Probleme sehr nicht trivial. Wenn Sie nicht die strengen Transaktions- und Konsistenzgarantien benötigen, die Sie von RDBMs erhalten können, ist es oft einfacher, Verbindungen zu denormalisieren und nicht zu tun. Vor allem, wenn Sie nicht viel Querverweis benötigen. Vor allem, wenn Sie keine Ad-hoc-Analyse durchführen, sondern einen programmatischen Zugriff mit beliebigen Transformationen benötigen.

Denormalisierung wird überbewertet. Nur weil dies bei 100 Tera passiert, heißt das nicht, dass diese Tatsache von jedem Entwickler genutzt werden sollte, der sich nie um Datenbanken gekümmert hat und Probleme bei der Abfrage von ein oder zwei Zeilen aufgrund schlechter Schemaplanung und Abfrageoptimierung hat .

Aber wenn Sie sind in dem 100 Tera-Bereich, mit allen Mitteln ...

Oh, der andere Grund, warum diese Technologien sind die Summen bekommen - Leute entdecken, dass einige Dinge nicht in dem in der Datenbank gehörten ersten Platz, und erkennen, dass sie nicht mit Beziehungen in ihren jeweiligen Bereichen beschäftigen, sondern mit grundlegenden Schlüssel-Wert-Paaren. Für Dinge, die nicht in einer Datenbank hätten sein sollen, ist es durchaus möglich, dass das Map-Reduce-Framework oder ein beständiges, schließlich konsistentes Speichersystem genau das Richtige ist.

In einem weniger globalen Maßstab empfehle ich BerkeleyDB für diese Art von Problemen.

14

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.

2

Wenn Sie über Daten sprechen, die praktisch schreibgeschützt sind, ändern sich die Regeln. Die Denormalisierung ist am schwierigsten in Situationen, in denen sich Daten ändern, weil die erforderliche Arbeit erhöht wird und es mehr Probleme mit dem Sperren gibt. Wenn sich die Daten kaum ändern, ist die Denormalisierung kein Problem.

+0

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

4

Also was ich bekomme ist, dass die ganze "Denormalisierung, keine Joins" Philosophie existiert, nicht weil Joins selbst nicht in großen Systemen skalieren, sondern weil sie praktisch unmöglich in verteilten Datenbanken zu implementieren sind.

Dies scheint ziemlich sinnvoll, wenn Sie weitgehend invariante Daten eines einzelnen Typs speichern (wie Google). Bin ich hier richtig?

+2

Sie haben es ziemlich genau verstanden. Auch werfen "es gibt ziemlich wenig Notwendigkeit, Querverweis Daten in verschiedenen" Tabellen "" – SquareCog

-1

Novaday Sie müssen eine interoperative Umgebung für Datenbanken finden. Häufiger Sie benötigen nicht nur relationale DBs wie MySQL oder MS SQL, sondern auch Big Data-Farmen als Hadoop oder nicht-relationale DBs wie MongoDB. In einigen Fällen werden alle diese DBs in einer Lösung verwendet, so dass ihre Leistung im Makrobereich möglichst gleich sein muss. Das bedeutet, dass Sie nicht in der Lage sein werden, sagen wir Azure SQL als relationale DB und eine VM mit 2 Kernen und 3 GB RAM für MongoDB. Sie müssen Ihre Lösung skalieren und DB als Dienst verwenden, wenn dies möglich ist (wenn dies nicht möglich ist, erstellen Sie dann Ihren eigenen Cluster in einer Cloud).

+0

Das liest sich wie eine Sammlung von Schlagworten und schlechte Grammatik. Es tut mir sehr leid zu sagen, aber es ist nicht leicht zu lesen. Bitte denken Sie daran, Inhalte neu zu organisieren, damit sie leichter zu lesen sind. – MrMesees