Frage

Ich habe viel zu lesen in letzter Zeit darüber, wie schließt sie in DB-Abfragen Dinge verlangsamen. Offenbar sie Google App Engine nicht einmal erlauben.

Ich frage mich, wie die Menschen eine App Design ohne allerdings verbindet. Zum Beispiel arbeite ich an einer Anwendung, die contacts und organizations hat. Ein Kontakt kann in vielen Organisationen und eine Organisation, viele Kontakte hat. Wie wäre es möglich, diese Beziehung ohne eine dritte Tabelle zu haben, die die beiden Entitäten ...

verbinden
contacts --< contacts_organizations >-- organizations

Bedeutet es, dass in GAE Sie nicht eine many-to-many-Beziehung haben können? Sie verlassen gerade aus Funktionalität, die eine Verknüpfung erfordern würde?

Ich denke, man eine TEXT organizations Spalte in der Tabelle contacts haben könnte für jeden Kontakt eine durch Leerzeichen getrennte Liste der Organisation IDs enthalten. Das scheint ein wenig seltsam though.

War es hilfreich?

Lösung

Normalerweise, wenn Sie über Datenbanken sprechen hier nicht erlaubt beitritt, Sie sprechen über sehr große Datenbanken, die nicht unbedingt auf einem Server passen. Die jüngsten Beispiele sind die Cloud-Datenbanken wie Amazon SimpleDB , Microsoft SQL Data Services und Google App Engine-Datenspeicher . Einig bieten begrenzte Fähigkeit verbinden, aber die großen Schwierigkeiten machen verbinden über „ Partitionen “ . In großen Datenbanken wie diese, partitionieren Sie Ihre Daten, damit es nicht auf dem gleichen Server befinden muss. Sie haben den richtigen Weg zu entscheiden, es zu partitionieren.

In Ihrem Beispiel würde ich eine Liste der Organisation Schlüssel speichert in einem Feld in der Tabelle Kontakte, und umgekehrt. Das Design dieser Datenbanken ist anders als die typische normalisierte Datenbank. Die Tische sind in der Regel „spärlich Tabellen“, die im Grunde bedeutet, jeder Datensatz eine beliebige Anzahl von Feldern aufweisen kann, die im Wesentlichen Paare Name / Wert sind. Denken Sie an einen Tisch Produkte auf Amazon, und wie viele verschiedene Felder dort für verschiedene Arten von Produkten sein könnte. Bücher haben Anzahl der Seiten, aber MP3s haben Dauer. In einem spärlichen Tisch, würden diese Datensätze in derselben Tabelle gespeichert werden.

Andere Tipps

Es ist ein Mythos, dass Software verlangsamen verbindet, in der gleichen Art und Weise, dass es ein Mythos wäre Schreibschleifen in Anwendungscode verlangsamt Software zu behaupten.

Ich meine, warum eine Schleife schreiben? Das läuft nur die gleichen Code-Zeilen immer wieder! War das nicht einmal genug? Es ist eine enorme Verschwendung!

Die obigen Ausführungen sollen ironisch sein.

Mein Punkt ist, dass eine Abfrage eine Join für einen bestimmten Zweck enthält: die richtige Antwort zu bekommen. Joins uneffektiv oder unnötig ist natürlich eine schlechte Gestaltung, wie in einer Schleife Schleife unveränderlichen Code setzen.

Die Vermeidung schließt sich als eine allgemeine Politik ein Beispiel für vorzeitige Optimierung ist. Wenn Ihr Ansatz effizienten Code zu schreiben mit Decke Regeln so kommen, dann Joins vermieden wird nicht Ihnen geht zu helfen.


Wie bei Google App Engine, es unterstützt Beziehungen zwischen den Entitäten, aber da es ist nicht unbedingt ein relationales Datenbankmodell, das Konzept einer Verknüpfung nicht wirklich kommen. Stattdessen können Sie Objekte aus einem bestimmten Referenz Zusammenhang erhalten, die eher wie eine ORM-Schnittstelle zu einem Modell, es ist nicht dasselbe wie eine Verknüpfung in SQL.

Sie können mehr lesen Sie hier: http://code.google.com/appengine/articles/modeling.html

(diese Verbindung in eine andere Antwort auf diesen Thread war, aber es wurde gelöscht)

Spitzfindigkeiten Punkt: Google nicht zulassen nicht JOINs in ihrer Datenbank-Benutzer zu verhindern, dass „teuer“ Ausführen von Abfragen; die Datenbank nicht relational ist, so dass das „JOIN“ SQL Verb ist nicht wirklich anwendbar an erster Stelle.

Auf diese Weise ist BigTable die gleiche wie Amazon SimpleDB - Daten denormalised und beraubt Schemata, so dass Sie effektiv mit großen, effizienten Hash-Tabellen mit beliebigen Daten in den Eimern erlaubt enden.

Diese Hash-Tabellen sind sehr, sehr einfach zu skalieren, vor allem im Vergleich mit relationalen Datenbanken. Für Anwendungen wie GAE, extreme Skalierbarkeit ist eine höhere Priorität als ein Full-Feature-Set.

Sie verwenden die db.ReferenceProperty Objekte zu verbinden, finden Sie unter Google App Engine: One-to-many JOIN für Details und Beispiele.

ich denke, Google Sie irgendeinen rechen schweren Mechanismus zerreißt, so dass Sie nach Möglichkeiten suchen, die Verschwendung mehr von anderen Arten von Ressourcen, zur Beispiel Festplatten beibehalten Referenztabellen und / oder Zählen von Tabellen anstelle von CPU-Zyklen verwenden werde für Joins und aggregierte Berechnung.

Und es ist nicht unmöglich, die Sie gerade brauchen, es umgehen mit andere Arten von Ressourcen, die Sie unterstützen.

Sie können Joins anstelle des DB-Server in Ihrer Anwendung durchführen, durch die Ergebnisse aus jeder Tabelle separat zu holen und dann die Kombination von ihnen, aber für die meisten Joins diese Weise werden Sie nur verlangsamen aufgrund der Latenz Umläufe mehrere Datenbank machen statt nur einem.

Aber: die ehrliche Wahrheit ist, dass Joins ist nicht Ihr Problem. Zu der Zeit, sie sind, wenn überhaupt, werden Sie nicht einmal müssen diese Frage stellen. Sie können die Anzahl der realen Lebensprojekte zählen, die an den Fingern zu diesem Punkt bekommen (vor allem Ebay), und es gibt keine Hinweise darauf, dass die Beseitigung der einzige Weg, ganz war schließt sich diese Projekte gemacht haben könnte zu skalieren.

Die Datenbanken, die Sie erwähnen, sind besten, versioniert Plattenläden auf mehrere Server sehr große Datenmengen speichern entworfen. Um sich nennen würde ‚Datenbank‘ eine Strecke sein. Die nicht unterstützen verbindet, noch ACID-Transaktionen, Rollbacks, etc. Sie können ohne sie Anwendungen schreiben, sondern hat oft mehr Arbeit zu tun, um die Funktionalität zu bieten.

Für:

contacts --< contacts_organizations >-- organizations

Sie könnten deNormailize und speichern Organisationen in Kontakte und Kontakte in orgainizations. Aber Sie müssen referentielle Integrität in der Anwendung viel erzwingen bei gleichzeitiger in beiden Tabellen aktualisiert.

Eine bessere Lösung wäre es, die Daten in drei Tabellen zu speichern und tun das ‚schließt sich‘ selbst.

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