Frage

Ich habe eine Web-Anwendung über eine MySQL-Datenbank ausgeführt wird (in Entwicklung). Ich betrachte meine Anwendung auf Google App Engine zu migrieren, und würde gerne besser verstehen, wie mein einfaches relationales Datenbankmodell zu dem nicht-relationalen Ansatz umgewandelt werden kann.

Ich bin eine lange Zeit relationale Datenbank Mensch, und ich habe keine Erfahrung mit Säule basiert DBs wie BigTable. Nur für den Fall Google auch kleine Bereitstellung von relationalen Datenbanken unterstützt, würde ich gerne sagen, dass meine Frage allgemein und nicht spezifisch für Google -. Ich möchte verstehen, wie einfache relationale Modelle können in nicht-relationale DBs dargestellt werden

Meine Datenbank (vereinfacht) ist wie folgt:

Items Table
------------

ItemID  ItemName  ItemPriority
1       "Car"     7
2       "Table"   2
3       "Desk"    7

ItemProperties Table
---------------------

ItemID  Property        Importance 
1       "Blue"          1
1       "Four Wheels"   2
1       "Sedan"         0
2       "Rectangular"   1
2       "One Leg"       1

Ich habe viele Einzelteile, die jeweils mit einem Namen und ID. Jedes Element mehr Eigenschaften hat, jede Eigenschaft hat mehrere Parameter (I angegeben nur den Namen und die „Bedeutung“ jede Eigenschaft, aber es gibt mehr). Ich habe zig Millionen von Artikeln, die jeweils Hunderte von Eigenschaften aufweist.

Das Einsatzszenario: Ich erhalte eine ItemName als Eingang, deren ID in der Artikel Tabelle nachschlagen, und hole alle Eigenschaften des durch die ID. Ich fahre dann eine Analyse auf der Liste der Eigenschaften (im Speicher) und ein Ergebnis zurück.

90% der Arbeit wird Lookup auf einem Parameter basiert, die (wenn ich das richtig verstehe) der Schmerzpunkt von nicht-relationaler DBs ist.

Was ist der empfohlene Ansatz?

War es hilfreich?

Lösung

Von jemandem, der für eine Weile Ihrer beiden Tabellen wurde mit nicht-relationaler DBs arbeiten sollten einfach sein, zu einer nicht-relationalen db zu übersetzen.

Nehmen Sie die beiden Tabellen und sie zu einem einzigen Objekt drehen.

Item:  - Ich würde  - Name  - Eigenschaften     - PROP1     - prop2

Speichern Sie die ganze Sache in Ihren Daten-Speicher-Säulen (Big-Table), Dokument (CouchDB), oder was auch immer es verwendet.

Sie können Elemente durch eine der IDs, Namen oder Eigenschaften suchen. Es gibt keine Verbindungen, bei denen einer der größeren Schmerzpunkte von nicht-relationalen dbs sind. Parameter-Abfragen sind nicht wirklich ein Schwachpunkt, wenn ich mich nicht zu verstehen, was Sie damit meinen. Sie müssen möglicherweise mehrere Lookups aber die meiste Zeit tun, das ist kein Problem, und es skaliert viel besser als ein RDBMS der Fall ist.

In Ihrem Beispiel halte ich tatsächlich das nicht-relationale Modell einfacher und leichter zu implementieren und zu verstehen.

Jede nicht-relationalen Datenspeicher hat verschiedene Konventionen und Zwänge aber so ist es schwer, Führung im allgemeinen Sinn geben. CouchDB kann einen Index für jeden Teil des Objekts mit seinen Ansichten zum Beispiel erstellen. Mit BigTable können Sie mehrere Kopien der normalisierte Daten speichern, müssen schnell indiziert Lookups zu bekommen. Andere werden verschiedene Dinge zu berücksichtigen, wenn Sie entscheiden, wie die Daten zu speichern. Es gibt ziemlich viel Differenzierung gibt, sobald Sie die Welt von SQL verlassen.

Andere Tipps

GQL nicht unterstützt verbindet. Sie können auf zwei Arten dieses Problem umgehen:

  • Sie die Verbindung selbst

holen Sie einfach die Artikel, überprüfen Sie die ItemID und Abfrage für ItemProperties mit diesem ItemID. Ihre Tabellen aussehen würde, genau wie Sie sie angegeben. Sicher, das ist zwei Abfragen, aber die beiden Abfragen sind einfach.

  • Verwenden Sie Expando Modelle

In einem Expando-Modell können Sie neue Felder zur Laufzeit erstellen. Sie werden nicht indiziert werden, so dass, wenn Sie auf sie suchen wollen es auch sein mag langsamer, aber sie einfach zu holen ist einfach gut. Sie können komplexe Typen wie Listproperty auch verwenden. Mit dieser Art von Flexibilität, können Sie in der Lage sein, einen Weg zu denken, alles, was in der ItemProperties Tabelle in den Artikel Tisch zu legen, und sich eine Abfrage speichern. Seien Sie kreativ.

Ich habe eine sehr ähnliche Datenbankstruktur (unsere „Aufzeichnungen“ und „recordEntries“ Tabellen Ihren „Artikel“ Spiegel und „itemProperties“) und eine ähnliche Migration auf eine nicht-relationale Datenbank am überlegen. Wir gehen wahrscheinlich auf CouchDB oder memcachedb oder so ähnlich, anstatt Google.

Wie Sie, ich habe keine Erfahrung im Umgang mit nicht-relationalen Datenbanken (auch nicht meine Entwickler). Allerdings haben wir ein paar Ideen um geworfen. Unsere aktuellen Gedanken sind (mit Ihrem Schema):

  • Erstens: Zurückziehen jedes Elements plus seine Elementeigenschaften in ein Objekt mit Feldern (im Wesentlichen eines XML-Dokument) und stopft es in die Datenbank durch Kennung eingegeben. Jedes Mal, wenn Sie ein Element abrufen Sie auch alle itemProperties zurück.

Beachten Sie den Unterschied, den wir haben, ist, dass wir Index unserer Inhalte außerhalb der Datenbank (mit Solr) und brauchen daher nicht Lookups auf der Datenbank selbst zu tun „Name“ -Eigenschaft, so YMMV.

  • Zweitens: Wir machen eine Liste aus, alle „relational“ -Operationen wir das tun können nicht durch das Modell oben unterstützt werden. Dazu gehört auch ein paar „Gruppierung“ Operationen, bei denen wir Artikel basiert auf einem speziellen Feld in der Positionstabelle abzufragen, und eine Abfrage, wo wir versuchen, alle Elemente zu erkennen, die von einer Abfrage auf einer Datumsspalte vor kurzem geändert (zuvor erreicht wurden die Positionstabelle). Wir erfinden alternative Implementierungen für jeden dieser Fälle (es gibt nur wenige, zum Glück).

Wenn dies zu schwierig erweist, werden wir die gleiche Übung mit einem anderen Modell versuchen. Zum Glück haben wir Zeit zu planen.

Ein wichtiger Punkt für uns ist, dass wir alle unsere Indizierung von außen mit Solr tun, so (zum Beispiel) wir brauchen keine Datenbank-Lookups auf Werte in den itemProperties Werten zu tun, oder Lookups auf dem namentlich zu tun Postentabelle.

Wie auch immer, das ist wahrscheinlich nicht viel helfen, aber ich werde ich darum bemühen, um zu sehen, welche Art von Lösungen mehr erfahren Leute mit kommen können.

PS: Ich schließe Ihre Eigenschaften Tabelle Milliarden von Zeilen aufweisen muss. Wie viele genau, und welche Hardware laufen Sie den MySQL-Server auf? Haben Sie Probleme bei der Skalierbarkeit noch mit MySQL?

Sie müssen alles bis glätten, denke ich AppEngine erlaubt Strukturen wie

ID = 1, ItemName = Auto, ItemPriority = 7, Eigenschaft = (blau, 1), Eigenschaft = (Vier Räder, 2), Objekt = (Sedan, 0) ID = 2, ItemName = Tabelle, ItemPriority = 2, Eigenschaft = (rechteckig, 1), Eigenschaft = (ein Bein, 1) ID = 3, ItemName = Schreibtisch, ItemPriority = 7

Beachten Sie, dass das gleiche „Feld“ mehrere Werte haben könnte, und dass Sie mehrere Elemente in ihm verwenden könnten.

Ihre Beispieldaten würden drei Zeilen in einer Tabelle sein.

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