Frage

Viele der "BAW"s (big-ass-websites) verwenden, Daten Lagerung und retrieval-Techniken, die sich auf große Tabellen mit Indizes und verwenden von Abfragen, die nicht/nicht verwenden können Verknüpfungen in Abfragen (BigTable, HQI, etc.), um deal mit Skalierbarkeit und Splitter-Datenbanken.Wie funktioniert das, wenn Sie viele und viele Daten sehr Verwandte?

Ich kann nur spekulieren, dass viel von diesem Beitritt getan werden muss, auf die Anwendungsseite der Dinge, aber nicht beginnen zu teuer?Was ist, wenn Sie haben, um mehrere Abfragen auf verschiedene Tabellen, um Informationen zusammenstellen?Nicht schlagen die Datenbank, die viele Male beginnen, um teurer als nur mit joins in den ersten Platz?Ich denke, es hängt davon ab, wie viele Daten Sie haben?

Und für die allgemein verfügbare ORMs, wie Sie neigen dazu, viel mit der Unfähigkeit zur Verwendung von Verknüpfungen?Gibt es Unterstützung für diese in ORMs, die in heavy-Nutzung heute?Oder die meisten Projekte, die zur Lösung dieses level von Daten neigen dazu zu Rollen, Ihre eigenen anyways?

Das ist also nicht anwendbar auf allen aktuellen Projekt, das ich mache, aber es ist etwas, das in meinem Kopf für mehrere Monate jetzt, ich kann nur spekulieren, was "best practices" sind.Ich hatte noch nie eine Adresse müssen diese in jedem meiner Projekte, weil Sie noch nie erreichten Maßstab, wo es erforderlich ist.Hoffentlich wird diese Frage hilft auch anderen Menschen..

Wie jemand sagte, unten, ORMs "funktionieren nicht" ohne Verknüpfungen.Gibt es noch andere data access Layer, sind bereits verfügbar, um Entwicklern die Arbeit mit Daten, die auf dieser Ebene?

EDIT: Für einige Klarstellungen, Vinko Vrsalovic sagte:

"Ich glaube, kichern ist reden will über NO-SQL, wo Transaktions-Daten ist denormalisierte und verwendet in Hadoop oder BigTable oder Cassandra-Systeme."

Das ist in der Tat das, was ich bin reden über.

Bonus-Punkte für diejenigen, die fangen die xkcd Referenz.

War es hilfreich?

Lösung

So wie ich es betrachte, eine relationale Datenbank ist ein universelles Werkzeug, um Ihre Wetten abzusichern. Moderne Computer sind schnell genug, und RDBMS‘sind gut optimiert genug, dass man auf eine recht respektable Größe auf einem einzigen Feld wachsen kann. Durch die Wahl eines RDBMS Sie sich sehr flexiblen Zugriff auf Ihre Daten geben, und die Fähigkeit, leistungsstarke Korrektheit Einschränkungen zu haben, die es viel einfacher, Code für die Daten machen. Allerdings wird das RDBMS wird nicht eine gute Optimierung für ein bestimmtes Problem darstellt, gibt es Ihnen nur um die Flexibilität zu ändern Probleme leicht.

Wenn Sie beginnen, wächst schnell und realisieren Sie maßstabs über die Größe eines einzelnen DB-Server haben werden, Sie plötzlich viel schwieriger Entscheidungen treffen müssen. Sie müssen Ermittlung von Engpässen beginnen und diese zu entfernen. Das RDBMS wird eine böse fauchte Knoten von Co-Abhängigkeit sein, dass Sie auseinander necken werde müssen. Je mehr Daten, desto mehr Arbeit verbunden sind, was Sie tun müssen, aber vielleicht werden Sie nicht vollständig die ganze Sache entwirren müssen. Wenn Sie lesen lastig sind vielleicht können Sie mit einfachen Replikation erhalten. Wenn Sie Ihren Markt sind zu sättigen und das Wachstum abflacht vielleicht können Sie teilweise auf feste Anzahl von DB-Server denormalize und Scherbe. Vielleicht haben Sie nur eine Handvoll Problem Tabellen, die zu einem skalierbaren Datenspeicher bewegt werden können. Vielleicht ist Ihr Nutzungsprofil ist sehr Cache freundlich und man kann nur die Last auf einen riesigen Memcached Cluster migrieren.

Wo skalierbare Schlüssel-Wert-Läden wie BigTable kommen, wenn keine der oben genannten arbeiten können und Sie so viele Daten aus einer einzigen Art haben, dass selbst dann, wenn es sich um eine einzelne Tabelle denormalized ist ist zu viel für einen Server. An dieser Stelle müssen Sie in der Lage sein, es willkürlich zu partitionieren und haben immer noch eine saubere API für den Zugriff darauf. Natürlich, wenn die Daten über so viele Maschinen verteilt können Sie keine Algorithmen, die diese Maschinen miteinander reden viel erfordern, die viele der relationalen Algorithmen erfordern würde. Wie Sie vorschlagen, haben diese verteilten Abfrage-Algorithmen das Potenzial insgesamt mehr Rechenleistung zu benötigen, als das Äquivalent in einer korrekt indiziert relationalen Datenbank, sondern weil sie die Echtzeit-Performance ist um Größenordnungen besser parallelisiert werden als jede einzelne Maschine tun könnte (vorausgesetzt, eine Maschine, die den gesamten Index existiert noch) halten konnte.

Nun, wenn Sie Ihre massive Datensatz horizontal skaliert werden können (durch nur in mehrere Servern Verstopfung), der schwierige Teil der Skalierbarkeit ist getan. Nun, ich soll nicht sagen, gemacht , weil laufender Betrieb und die Entwicklung in diesem Maßstab ist viel härter als die Single-Server-Anwendung, aber der Punkt ist, Anwendungsserver maßstab typischerweise trivial ist über einen anteil nichts Architektur, solange sie die Daten, die sie benötigen, in einer angemessenen Art und Weise erhalten.

Ihre Frage zu beantworten, wie häufig verwendeter ORMs behandelt die Unfähigkeit zu verwenden JOIN, die kurze Antwort ist sie es nicht tun . ORM steht für Object Relational Mapping, und der größte Teil der Aufgabe eines ORM ist die Übersetzung nur das leistungsstarke relationale Paradigma der Prädikatenlogik einfache objektorientierte Datenstrukturen. Die meisten der Wert dessen, was sie Ihnen einfach gehen nicht von einem Schlüssel-Wert-Speicher möglich. In der Praxis werden Sie wahrscheinlich benötigen, um Ihre eigene Daten-Zugriffsschicht aufzubauen und aufrechtzuerhalten, die auf Ihre Bedürfnisse geeignet sind, da die Datenprofile bei diesen Skalen dramatisch verändern gehen und ich glaube, es gibt zu viele Kompromisse für ein universelles Werkzeug entstehen und dominant werden die Art und Weise RDBMS haben. Kurz gesagt, haben Sie immer in diesem Maßstab mehr Lauferei zu tun.

Das sagte, es wird auf jeden Fall interessant sein zu sehen, welche Art von relationalen oder anderen Aggregatfunktionen kann auf dem Schlüssel-Wert-Speicher Primitiven aufgebaut werden. Ich habe hier nicht wirklich genug Erfahrung, speziell zu kommentieren, aber es gibt eine Menge Wissen in Unternehmen computing darüber viele Jahre zurück (z. B. Oracle), viel ungenutztes theoretisches Wissen in der Wissenschaft, viel praktisches Wissen bei Google, Amazon, Facebook, et al, aber das Wissen, das in die weitere Entwicklung der Gemeinschaft herausgefiltert hat, ist noch ziemlich beschränkt.

Doch jetzt, dass eine Vielzahl von Anwendungen auf die Bahn bewegen, und mehr und mehr der Bevölkerung der Welt ist online, zwangsläufig mehr und mehr Anwendungen werden maßstäbe haben und Best Practices beginnen zu kristallisieren. Die Wissenslücke wird von beiden Seiten durch Cloud-Dienste wie App Engine und EC2 sowie Open-Source-Datenbanken wie Cassandra gestutzt. In gewissem Sinne geht dies Hand in Hand mit parallel und asynchroner Berechnung, die auch in den Kinderschuhen steckt. Auf jeden Fall eine faszinierende Zeit ein Programmierer zu sein.

Andere Tipps

Sie sind aus einer fehlerhaften Annahme zu starten.

Data Warehousing nicht normalisieren Daten die gleiche Art und Weise, dass eine Transaktionsanwendung normalisiert. Es gibt nicht „viel“ von beitritt. Es gibt relativ wenige.

Insbesondere zweite und dritte Verletzungen Normalform ist kein „Problem“, da Data Warehouse wird selten aktualisiert. Und wenn sie aktualisiert wird, ist es im Allgemeinen nur ein Status-Flag ändern, um eine Dimension Zeilen als „aktuell“ vs. „nicht aktuell“ zu machen.

Da Sie nicht über Aktuelles zu sorgen haben, müssen Sie nicht zersetzen Dinge bis auf die 2NF Ebene, wo ein Update kann nicht auf anomale Beziehungen führen. Kein Updates bedeutet, dass keine Anomalien; und keine Zersetzung und nicht beitritt. Sie können alles im Voraus kommen.

Im Allgemeinen werden DW-Daten zerlegt nach einem Sternschema. Diese führen Sie die Daten in die numerischen „Tatsache“ Tabellen zu zersetzen, die die Maßnahmen, die - Zahlen mit Einheiten -. Und Fremdschlüssel Verweise auf die Dimension

Eine Dimension (oder „Wirtschaftseinheit“) ist am besten als eine reale Sache mit Attributen. Oft enthält diese Dinge wie Geographie, Zeit, Produkt, Kunde usw. oft Diese Dinge komplexe Hierarchien haben. Die Hierarchien sind in der Regel willkürlich, durch verschiedene Business Reporting-Anforderungen definiert und nicht als separate Tabellen modellierte, sondern nur Spalten in der Dimension für die Aggregation verwendet.


, um einige Ihrer Fragen zu beantworten.

„Das hat Beitritt auf der Anwendungsseite der Dinge getan werden“. So'ne Art. Die Daten werden „vor-verbunden“ vor geladen werden. Die Dimensionsdaten sind oft eine Verknüpfung von relevanten Quelldaten über diese Dimension. Es ist verbunden und geladen als eine relativ flache Struktur.

Es wird nicht aktualisiert. Statt Updates werden zusätzliche historische Datensätze eingefügt.

„aber nicht so teuer zu bekommen anfangen?“. So'ne Art. Es dauert eine gewisse Sorgfalt geladen die Daten zu erhalten. Allerdings gibt es nicht viel Berichterstattung / Analyse verbindet. Die Daten werden im Voraus verbunden.

Die ORM Probleme sind weitgehend gegenstandslos, da die Daten im Voraus verbunden. Ihre ORM-Karten auf die Tatsache, oder Dimension als angemessen. Außer in speziellen Fällen neigen Abmessungen im Speicher ziemlich klein und passen völlig zu sein. Die Ausnahme ist, wenn Sie in Finance (Banking oder Versicherungen) sind oder Public Utilities und haben massive Kundendatenbanken. Diese Kunden Dimension selten passt im Speicher.

Ein JOIN ist ein rein relationalen Begriff, und nicht alle Datenbanken sind relational.

Andere Datenbank-Modelle haben andere Möglichkeiten, um Beziehungen aufzubauen.

Netzwerk-Datenbank verwenden Sie die endlose Kette von find a key - fetch the reference - find a key die programmiert werden soll mit einer gemeinsamen Programmiersprache.

Der code kann ausgeführt werden, auf die Anwendung Seite oder auch auf der server-Seite, aber es ist nicht SQL und nicht einmal die set-basiert.

Wenn richtig entwickelt, ein Netzwerk-Datenbank können Sie viel schneller als eine relationale ein.

Zum Beispiel, ein Netzwerk-Datenbank speichern kann, die einen Verweis auf eine andere Person als einen direkten Zeiger auf einen offset in eine Datei oder sogar einen block auf einer Festplatte, wo Sie die Informationen zu dieser Person gespeichert.

Dies macht das durchqueren der Netzwerke extra schnell — wenn Sie schrieb einen effizienten code zu tun.

Eine relationale Datenbank kann nur Verweise speichern als paar grundlegende Werte wie ganze zahlen (oder Dreibett-oder Tupel von höherer Ordnung).

Zu finden, die diese Werte in die relationale Datenbank-engine, sollten die folgenden Dinge tun:

  • Finden Sie heraus, wo das Tupel mit dem ersten Wert
  • Finden Sie den zweiten Wert
  • Finden Sie die Adresse der Wurzel in einem B-Tree Besitz der Daten sind, die zweite Zahl bezieht sich auf
  • Traverse dieser Baum
  • Finden Sie die Zeiger auf die aktuelle Tabelle (die gespeichert werden können, als B-Tree selbst in diesem Fall wird der Zeiger den Wert der PRIMARY KEY die Zeile, die wir suchen)
  • Finden Sie in der Tabelle die Zeile mit dem Zeiger-oder dem durchqueren der Tabelle
  • Schließlich erhalten Sie das Ergebnis.

Und Sie kontrollieren können, dies nur in einem gewissen Umfang.Als Sie gerade das Problem SQL Abfrage und warten.

Relationales Modell eine Vereinfachung der Entwickler das Leben nicht zu erreichen, die super-speed-immer und egal was.

Diese ist dieselbe, wie bei der Montage gegenhigher-level-Sprachen, relationale Modell wird ein higher-level-Sprache.

Möchten Sie vielleicht Lesen Sie den Artikel in meinem blog

, in dem ich versuchen zu erklären, die Unterschiede zwischen mehrere Häufig verwendete Datenbank-Modelle.

Wenn Sie Ihre Daten auf diese Weise denormalise, tun Sie so die Kosten für den Beitritt disparaten Elemente zu vermeiden; Sie akzeptieren, dass einige Daten und bestimmte Möglichkeiten, es zu kombinieren dupliziert werden können, kann es schwierig sein, für den Leistungsvorteil einfache Abfragen zu verwenden.

Wenn Sie eine große Menge an Verbindung auf der Anwendungsebene zu tun haben sollte, bedeutet dies, dass Sie nicht denormalised haben sie genug.

Idealerweise können Sie eine Abfrage für jede Menge von Daten machen Sie wollen. In der Praxis sollten Sie mehr als zwei oder drei Anfragen nicht für jeden Aspekt Ihrer Anwendung verwenden müssen, und jede Anwendungsebene Beitritt wird mehr von einem trivialen Abruf von Material aus den einzelnen Resultset zum Einsetzen in die Ansicht sein.

Diese Art der Sache ist nur wirklich für wirklich massiven Datenmengen benötigt, und es gibt alle Arten von Kompromissen beteiligt. Um nur ein Beispiel: BigTable kann Aggregatabfragen nicht, wie man eine Zählung geben. Es kann Ihnen verwendet werden, um eine Zahl zu nennen, die in etwa genau ist - in dem Sinne, dass, wenn Sie sagen, 12.149.173 Datensätze, von denen 23.721 in der letzten Stunde hinzugefügt wurden, ist es nicht wirklich wichtig, wenn die beste können Sie herausfinden, ist, dass Sie haben „über 12.100.000 Datensätze“. Wenn Ihre Anwendung die genaue Zahl zu wissen, zu einem bestimmten Zeitpunkt abhängt, dann sollten Sie nicht für es mit BigTable sein, ist die allgemeine Haltung.

Anwendungen wie Facebook haben nur sehr wenige Datenänderungen, die meiste Zeit Benutzer veröffentlichen neue Objekte. Die Tatsache, dass mehrfach Datensätze aktualisiert werden muß, wenn ein Element geändert wird, ist ein geringeres Problem.

  

Auf diese Weise können können die Daten nicht sein   normalisiert, ohne die gemeinsame zu Schlagen   Probleme mit Updates.

Anwendungen wie Amazon kann es sich leisten, alle Daten für einen einzelnen Benutzer in den Arbeitsspeicher zu laden (wie groß ein Einkaufswagen, nachdem alle?), Dann aktualisieren, um die Daten im RAM und schreiben Sie es heraus als ein einziges Datenelement.

  

Entfernen Wieder einmal die Notwendigkeit,   die meisten Daten normalisiert.

Sie handeln Skalierung für einfache Anwendungsentwicklung, wenn Sie also in große Höhen brauchen nicht maßstabs können Sie möchten die einfache Anwendungsentwicklung zu halten, dass RDBMS bieten.

Ich denke, dass in diesen Situationen Sie ziemlich viel auf eigene Faust sein werden und werden selbst zu rollen, alles zu haben. Ich habe es nicht gewesen, aber habe es für einige unserer Projekte in Betracht gezogen. Sie können ziemlich groß mit relationalen DBs erhalten (als SO zeigt), so werde ich auch weiterhin für jetzt die relationale Güte genießen.

Im Allgemeinen Data Warehousing wird gebaut um Joins und Daten aufgeteilt in Dimensionen und Faktentabellen (mit so genannten „Sternschemata“ usw.)

Joins werden häufig im Voraus berechnet und als de-normalisierte Tabellen gespeichert werden.

Ich bin nicht bekannt, dass ORM-Tools, dass die Arbeit mit Datenbanksystemen, die schließen sich nicht erlauben, da diese im allgemeinen nicht als traditionelle relationale Datenbanken gesehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top