2015-05-15 26 views
6

Mam aplikację na Androida, na której użytkownicy będą mogli wysyłać prywatne wiadomości do siebie. (na przykład: A wysyła wiadomość do B i C, a cała trójka może je skomentować)Złożoność zapytania w Google datastore

Używam silnika aplikacji Google i google datastore z Javą. (framework Objectify) Utworzono jednostkę Member i jednostkę Message, która zawiera pole ArrayList<String>, reprezentujące listę odbiorców. (to znaczy kluczowe pole jednostki Member)

Aby użytkownik mógł pobrać wszystkie wiadomości, w których jest jednym z odbiorców, planowałem załadować każdą jednostkę Message w magazynie danych, a następnie wybrałem je sprawdzając, czy pole ArrayList<String> zawiera identyfikator użytkownika. Jednak biorąc pod uwagę, że mogą być przechowywane setki tysięcy wiadomości, zastanawiałem się, czy to nawet możliwe i czy nie zajmie to zbyt wiele czasu?

+2

Czy 'ofy(). Load(). Type (Message.class) .filter ('recipient =', myMemberId)' nie robić, co chcesz? Ilu odbiorców "Członka" będzie realistycznie "Wiadomość"? – tx802

+0

Myślę, że to powinno zadziałać, dziękuję. Sądzę, że przeciętnie "Wiadomość" będzie miała listę odbiorców z 8 członkami. Czy nadal uważasz, że twoje zapytanie będzie wygodne? – Gannicus

Odpowiedz

1

Czas pobierania wyników z magazynu danych odnosi się tylko do liczby pobranych jednostek, a nie do całkowitej liczby jednostek przechowywanych, ponieważ każde zapytanie MUSI korzystać z indeksu. Właśnie to sprawia, że ​​datastore jest tak skalowalny.

Będziesz musiał ograniczyć liczbę wiadomości pobieranych za połączenie i użyć numeru Cursor, aby pobrać następną partię. Możesz przesłać kursor do klienta Android, konwertując go na websafe string, aby klient mógł wskazać punkt początkowy dla następnego żądania.

+0

W rzeczywistości członek nie będzie miał tyle wiadomości, które są do niego skierowane. Właściwie nie może mieć więcej niż 50 wiadomości, ponieważ planuję usunąć je co tydzień. Jedyny problem z wielkością, z którym prawdopodobnie poradzę sobie, to całkowita liczba wiadomości w magazynie danych, które mogą być dość duże. Nie jestem pewien, co masz na myśli przez "każde zapytanie musi używać indeksu", ale zapytanie sugerowane przez tx802 (ofy(). Load(). Type (Message.class) .filter ('recipient =', myMemberId) i dodanie @Index do pola listy pasuje do tego wymagania? – Gannicus

+0

Tak, lista identyfikatorów członków (lub kluczy) będzie wymagać adnotacji '@ Index 'do użycia w takim zapytaniu: – tx802

+0

@ tx802 faktycznie zapytanie zwraca pusta kolekcja Czy na pewno nie jest to coś w stylu 'ofy(). load(). type (Message.class) .filter ('recipient contains', myMemberId)'? – Gannicus