2010-10-08 11 views
5

No se puede consultar el Datastore de App Engine para obtener un resultado agregado.Estrategia alternativa para consultar la agregación ("agrupar por") en el almacén de datos del motor de aplicaciones de Google

Ejemplo: Tengo una entidad llamada "Post" con los siguientes campos:

Clave de identificación, Cadena apodo, Cadena postText, int puntuación

Tengo muchos apodos diferentes y muchos mensajes de cada apodo en mi almacén de datos.

Si quiero una tabla de clasificación de los diez mejores apodos de las puntuaciones totales, que normalmente tendría SQL del modo siguiente:

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

Este tipo de consulta no es posible en Google API del almacén de datos de App Engine Java (JDO o jpa).

¿Cuáles son las estrategias alternativas que podría utilizar para lograr un resultado similar?

En bruto y brutely, podría cargar todas las entidades Post y calcular la agregación completamente en mi código de aplicación. Esto obviamente no es eficiente en grandes conjuntos de datos.

¿Qué otras estrategias puedo emplear?

+1

Si Google solo actualizó su complemento, DataNucleus haría ese enfoque de "fuerza bruta y bruta" para usted de manera transparente. El código para hacerlo sería solo un puñado de líneas para su complemento, contribuido hace un año ... – DataNucleus

+1

@DataNucleus Tener soporte integrado no lo haría más rápido o más eficiente. –

+1

@Nick, por supuesto que no, pero toda la experiencia del usuario sería mucho más placentera, y la cantidad de código que la gente tiene que escribir sería menor: ese es el negocio en el que estamos – DataNucleus

Respuesta

10

Cree un modelo Nickname, y cada vez que agregue un nuevo mensaje, recupere el alias correspondiente y aumente el puntaje almacenado allí. Esencialmente, haga el cálculo en insert/update-time, no en tiempo de consulta.

+0

Hola, Amber.Gracias por tu contribución. Ya estoy haciendo esto hasta cierto punto. (Mi modelo es más complejo de lo que lo describí). Ya estoy agregando una gran cantidad de datos sobre inserciones y actualizaciones para evitar esto. Pero no es factible guardar todas las estadísticas agregadas posibles de esta manera (tengo muchas estadísticas agregadas diferentes que me gustaría calcular de vez en cuando). Pero esta sigue siendo una respuesta válida. – Patrick

+1

El enfoque de Amber es correcto y escalará. Utilizo un enfoque muy similar a 'fan-in con vistas materializadas' (http://code.google.com/events/io/2010/sessions/high-throughput-data-pipelines-appengine.html) para calcular docenas de agregados. Funciona bastante bien. –

+1

Estoy usando esta técnica, junto con la fragmentación para minimizar la contención (http://code.google.com/appengine/articles/sharding_counters.html); así como posponer atómicamente las actualizaciones de dichos contadores y estadísticas. Estoy marcando esta respuesta como la mejor. – Patrick

Cuestiones relacionadas