2015-05-15 6 views
6

Ich habe eine Android-App, wo Benutzer in der Lage sind, private Nachrichten an einander zu senden. (zum Beispiel: A sendet eine Nachricht an B und C und die drei von ihnen können diese Nachricht kommentieren)Komplexität einer Abfrage im Google-Datenspeicher

Ich verwende Google App Engine und den Google Datastore mit Java. (Rahmen Objectify) Ich habe eine Member Einheit und eine Message Einheit erstellt, die ein ArrayList<String> Feld enthält, das die recipienten'ids Liste darstellt. (das heißt das Schlüsselfeld der Member Einheit)

Damit ein Benutzer alle Nachrichten erhält, wo er einer der Empfänger ist, plante ich, jede Message Entität in den Datenspeicher zu laden und sie dann auszuwählen Überprüfen Sie, ob das Feld ArrayList<String> die ID des Benutzers enthält. Aber wenn man bedenkt, dass Hunderttausende von Nachrichten gespeichert sind, fragte ich mich, ob das überhaupt möglich ist und ob das nicht zu viel Zeit in Anspruch nehmen würde.

+2

Ist 'ofy(). Load(). Type (Message.class) .filter ('recipient =', myMemberId)' nicht tun, was Sie wollen? Wie viele Empfänger 'Mitglieder werden eine' Nachricht' realistisch haben? – tx802

+0

Ich denke, das sollte die Arbeit tun, danke. Ich nehme an, dass eine "Nachricht" im Durchschnitt eine Empfängerliste von 8 Mitgliedern hat. Glauben Sie immer noch, dass Ihre Anfrage bequem ist? – Gannicus

Antwort

1

Die Zeit zum Abrufen der Ergebnisse aus dem Datenspeicher bezieht sich nur auf die Anzahl der abgerufenen Entitäten und nicht auf die Gesamtzahl der gespeicherten Entitäten, da jede Abfrage einen Index verwenden muss. Genau das macht den Datenspeicher so skalierbar.

Sie müssen die Anzahl der pro Aufruf abgerufenen Nachrichten begrenzen und eine Cursor verwenden, um den nächsten Stapel abzurufen. Sie können den Cursor an den Android-Client senden, indem Sie ihn in eine websafe string konvertieren, damit der Client den Startpunkt für die nächste Anfrage angeben kann.

+0

In der Tat wird ein Mitglied nicht so viele Nachrichten haben, die an ihn gerichtet sind. Tatsächlich könnte er nicht mehr als 50 Nachrichten haben, da ich plane, sie jede Woche zu löschen. Das einzige Größenproblem, mit dem ich wahrscheinlich zurechtkommen werde, ist die Gesamtzahl der Nachrichten im Datenspeicher, die ziemlich groß sein können. Ich bin mir nicht sicher, was Sie meinen, "jede Abfrage muss einen Index verwenden", aber die Abfrage wird von tx802 vorgeschlagen (ofy(). Load(). Type (Message.class) .filter ('recipient =', myMemberId) und das Hinzufügen von @Index zum Listenfeld entspricht dieser Anforderung? – Gannicus

+0

Ja, die Liste der Element-IDs (oder Keys) würde eine '@Index'-Annotation benötigen, um in einer Abfrage wie dieser verwendet zu werden – tx802

+0

@ tx802 tatsächlich gibt Ihre Abfrage ein zurück leere Sammlung Sind Sie sicher, dass dies nicht etwas wie 'ofy() ist. load(). type (Message.class) .filter (' recipient contains ', myMemberId) '? – Gannicus