2010-10-08 10 views
5

Mechanizm App Engine Datastore nie może być sprawdzany pod kątem zagregowanego wyniku.Alternatywna strategia agregacji zapytań ("grupa według") w magazynie danych wyszukiwarki Google.

Przykład: Mam podmiot o nazwie "Poczta" z następujących dziedzin:

Key id, nick String, String postText, int zdobyć

Mam wiele różnych pseudonimów i wiele posty każdego pseudonimu w moim magazynie danych.

Jeśli chcę pokładzie lider pierwszej dziesiątce pseudonimów całkowitej punktacji, ja zazwyczaj mają sql następująco:

select nickname, sum(score) as sumscore 
from Post 
group by nickname 
order by sumscore 
limit 10 

Ten typ zapytania nie jest możliwe w google magazynu danych App Engine Java API (JDO lub jpa).

Jakie są alternatywne strategie, które mogę zastosować, aby osiągnąć podobny rezultat?

Mogę załadować każdą jednostkę Post i całkowicie obliczyć agregację w moim kodzie aplikacji. Jest to oczywiście nieskuteczne w przypadku dużych zbiorów danych.

Jakie inne strategie mogę zastosować?

+1

Jeśli Google zaktualizował tylko swoją wtyczkę, DataNucleus zrobi to dla ciebie w sposób "surowy i brutalny". Kod do zrobienia to tylko garstka linii do wtyczki, wniesiona rok temu ... – DataNucleus

+1

@DataNucleus Posiadanie wbudowanej obsługi technicznej nie sprawiłoby, że byłoby szybsze lub bardziej wydajne. –

+1

@Nick, oczywiście, że nie, ale całe doświadczenie użytkownika byłoby cholernie przyjemnym widokiem, a ilość kodu, który ludzie musieliby napisać, byłaby mniejsza - to jest nasza działalność w – DataNucleus

Odpowiedz

10

Utwórz model Nickname, a za każdym razem, gdy dodasz nowy wpis, pobierz odpowiedni pseudonim i zwiększ tam zapisaną sumę punktów. Zasadniczo, wykonaj obliczenia w czasie wstawiania/aktualizacji, a nie czasu zapytania.

+0

Cześć Amber.Dziękuję za twój wkład. Już to robię w pewnym stopniu. (Mój model jest bardziej złożony niż to opisałem). Już gromadzę dużo danych na temat wstawek i aktualizacji, aby obejść to. Ale nie jest możliwe zapisanie w ten sposób wszystkich możliwych zbiorczych statystyk (mam wiele różnych statystyk zagregowanych, które chciałbym obliczyć co jakiś czas). Ale to wciąż jest poprawna odpowiedź. – Patrick

+1

Podejście Amber jest słuszne, a będzie skalować. Używam podejścia bardzo podobnego do "fan-in z materializowanymi widokami" (http://code.google.com/events/io/2010/sessions/high-throughput-data-pipelines-appengine.html), aby obliczyć dziesiątki agregaty. Działa całkiem dobrze. –

+1

Używam tej techniki w połączeniu ze zmianą, aby zminimalizować rywalizację (http://code.google.com/appengine/articles/sharding_counters.html); jak również możliwość atomowego odkładania aktualizacji takich liczników i statystyk. Zaznaczam tę odpowiedź jako najlepszą. – Patrick

Powiązane problemy