2015-05-15 8 views
6

Ho un'app per Android in cui gli utenti potranno inviare messaggi privati ​​tra loro. (per esempio: A manda un messaggio a B e C e i tre di loro possono commentare quel messaggio)Complessità di una query nel datastore di Google

Io uso google app engine e il datastore di google con Java. (framework Objectify) Ho creato un'entità Member e un'entità Message che contiene un campo ArrayList<String>, che rappresenta l'elenco di destinatari. (vale a dire il campo chiave dell'entità Member)

Affinché un utente possa ricevere tutti i messaggi in cui è uno dei destinatari, stavo pianificando di caricare ogni entità Message sul datastore e quindi selezionarli controllando se il campo ArrayList<String> contiene l'ID dell'utente. Tuttavia, considerando che potrebbero esserci centinaia di migliaia di messaggi memorizzati, mi chiedevo se fosse possibile e se ciò non richiedesse troppo tempo?

+2

Fa 'ofy(). Load(). Type (Message.class) .filter ('recipient =', myMemberId)' non fa quello che vuoi? Quanti 'membri' dei destinatari avranno realisticamente un 'messaggio'? – tx802

+0

Penso che questo dovrebbe funzionare, grazie. Suppongo che in media un 'messaggio' abbia una lista di destinatari di 8 membri'id. Credi ancora che la tua richiesta sarà conveniente? – Gannicus

risposta

1

Il tempo di recupero dei risultati dal datastore si riferisce solo al numero di entità recuperate, non al numero totale di entità memorizzate poiché ogni query DEVE utilizzare un indice. Questo è esattamente ciò che rende il datastore così scalabile.

È necessario limitare il numero di messaggi recuperati per chiamata e utilizzare un Cursor per recuperare il batch successivo. È possibile inviare il cursore al client Android convertendolo in un websafe string, in modo che il client possa indicare il punto di partenza per la richiesta successiva.

+0

In effetti un membro non avrà così tanti messaggi che sono indirizzati a lui. In realtà potrebbe non avere più di 50 messaggi dal momento che ho intenzione di cancellarli ogni settimana o giù di lì. L'unico problema di dimensioni che probabilmente gestirò è il numero totale di messaggi nel datastore, che potrebbe essere abbastanza grande. Non sono sicuro di cosa intendi con "ogni query deve utilizzare un indice", ma la query suggerita da tx802 (ofy(). Load(). Type (Message.class) .filter ('recipient =', myMemberId) e aggiungendo @Index al campo Elenco corrisponde a tale requisito? – Gannicus

+0

Sì, l'elenco di ID membri (o chiavi) richiederebbe un'annotazione '@ Index' da utilizzare in una query come questa. – tx802

+0

@ tx802 in realtà la query restituisce un Raccolta vuota. Sei sicuro che questo non è qualcosa come 'ofy(). load(). type (Message.class) .filter ('destinatario contiene', myMemberId)'? – Gannicus

Problemi correlati