9

Estoy en las primeras etapas de desarrollo de un sitio web de estadísticas deportivas (ultimate frisbee) y me gustaría conocer sus opiniones si Google App Engine es adecuado para mí.Consultas complejas utilizando el almacén de datos de GAE

Lo escribo en Python usando Django y me he sentido cómodo con RDBMS estándar durante años, pero este sitio es un proyecto a largo plazo y estoy esperando grandes cantidades de datos así que me gustaría la escala "infinita" que GAE ofertas de datastore. Una gran mayoría de las consultas a la base de datos devolverá resultados muy estándar que harían que el almacén de datos parezca una opción lógica. Sin embargo, me gustaría poder realizar consultas extremadamente complejas en el futuro para obtener nuevas métricas estadísticas o simplemente obtener resultados interesantes. Planeo hacer mucho de esto en el futuro, pero no sabré qué son estas consultas hasta que los datos ya estén recopilados. Por ejemplo, a menudo se ve a los analistas de estadísticas de béisbol hacer estadísticas ridículas como "Esta es la primera vez en los últimos 50 años que dos lanzadores zurdos cuyos apellidos comienzan con 'Z' han lanzado blanqueadas de un solo golpe. en días pasados ​​". Me gustaría tener la flexibilidad de hacer cualquier tipo de consulta en el futuro. :)

Sin embargo, tengo la impresión de que una base de datos no relacional como bigtable requiere que se te ocurran modelos que contengan datos redundantes de antemano y que todo el trabajo tenga lugar en las inserciones en lugar de las extracciones. Ya he creado modelos django que contienen prácticamente todos los datos que necesitaría consultar, pero no tengo idea de qué modelos desnormalizados querré tener dentro de uno o dos años. Por lo tanto, tengo la sensación de que hacer consultas complejas en el futuro sería extremadamente difícil en el almacén de datos de GAE y me exigiría extraer una gran cantidad de información del servidor antes de procesarla en python.

¿El almacén de datos del motor de la aplicación de Google simplemente está mal para lo que quiero hacer? O simplemente me estoy perdiendo algo. Muchas gracias de antemano!

Actualización: Gracias por las respuestas hasta el momento. Me doy cuenta de que también debo mencionar que muchas de estas consultas complejas son consultas que me gustaría que los usuarios puedan hacer, lo que hace que una base de datos fuera de línea no sea realmente una opción. Por ejemplo, los usuarios deberían poder ver varias estadísticas de cuán bien juegan dos jugadores en particular cuando están en el campo al mismo tiempo durante juegos o temporadas específicos. Si bien estas consultas no son tan frecuentes como las estadísticas agregadas estándar, seguirán ocurriendo con regularidad.

Tener una base de datos relacional, así como el almacén de datos GAE sería genial, pero django no admite múltiples db por defecto y emparejar una solución en conjunto suena difícil y complicado. Eric Florenzano tiene un nice solution para dos bases de datos que usan los modelos django, pero si tuviera que usar el almacén de datos GAE, tendría que usar el modelo db del motor de la aplicación en su lugar. Y llegar a una buena solución como lo hizo para este problema complejo es un poco más allá de mi nivel de habilidad en este momento.

En este momento mis dos opciones favoritas son utilizar GAE Task Queue para hacer las consultas difíciles o ir a un host de web más estándar como webfaction y luego simplemente desnormalizar mis tablas una vez que mis datos crezcan y necesito aumentar el rendimiento.

Respuesta

12

Lo que está describiendo es esencialmente OLAP - Online Analytical Processing. OLAP es una cosa en la que los RDBMS 'tradicionales' son muy buenos, en parte debido a la flexibilidad y la potencia de SQL, y las bases de datos no relacionales, como el almacén de datos de App Engine, no lo son. Suena como sus consultas de tipo OLAP serán relativamente poco frecuentes en comparación con el acceso normal, aunque, por lo que te sugiero uno de los dos enfoques:

  • espejo todos los datos de su almacén de datos de App Engine a una base de datos relacional a intervalos y realizar las consultas analíticas en la base de datos relacional. El tráfico de datos del usuario sigue siendo atendido por el almacén de datos, por lo que obtienes todas las ventajas de eso, pero tienes una copia fuera de línea con la que puedes hacer consultas complejas.
  • Utilice la compatibilidad Task Task de App Engine para ejecutar consultas que examinen grandes conjuntos de datos. Puede escribir su consulta en Python o Java, luego usar la cola de tareas para ejecutarla en un conjunto de datos muy grande, y recoger los resultados de manera asincrónica, cuando hayan terminado. Obviamente, se requiere un poco de trabajo de infraestructura para facilitar esto (aunque tenga cuidado con my blog para un proyecto futuro que involucre esto;).
+0

Esperaba que respondieras :). Gracias por las dos excelentes sugerencias. He actualizado mi pregunta para abordar un posible problema en su primera sugerencia. En cuanto a su segundo, ¡ni siquiera me di cuenta de que Task Queue existía! Tomará un poco de investigación, pero me pregunto si será capaz de resolver todos mis problemas. – Spike

+1

Unos años después, sí ...pero esta respuesta todavía está dorada, pero ahora puedes usar google cloud sql en lugar de una base de datos fuera de línea y ¡tener tu torta y comértela también! (http://stackoverflow.com/q/10905861/525541) – MindWire

6

Yo diría que el almacenamiento de tipo bigtable es menos adecuado para aplicaciones estadísticas, por las mismas razones que usted menciona. Pero este es un intercambio clásico que tienes que hacer. Rara vez me he encontrado usando la flexibilidad de las consultas realmente complejas, pero muchas veces me he visto obligado a buscar soluciones más especializadas para cosas que no deberían haber estado en el DB en primer lugar.

Si se apega a un RDBMS, puede hacer particiones lógicas y desnormalización bastante fácil, por ejemplo, a través de las estrategias de persistencia de Hibernate y Hibernate Shards. Si puede vivir con el proceso algo más lento, también puede hacer consultas SQL en almacenamiento tipo bigtable (consulte, por ejemplo, hadoop pig latin).

+0

¡Gracias por el asesoramiento! Probablemente pueda vivir con el procesamiento más lento para ciertas cosas y realmente me gustaría usar una tabla grande si es posible. – Spike

2

GAE data-store es un animal completamente diferente de un RDBMS. Es fácil en una base de datos relacional para escribir algo como:

SELECT STDEV(player_score) 
FROM Table 
WHERE player_id = 1234 
    AND game_date BETWEEN '2007-01-01' AND '2009-11-10' 
    AND city <> 'London' 

consulta GAE tiene un montón de restricciones - see here - lo que no es fácil de traducir esto. Para las funciones agregadas (suma, stdev, etc.), debe extraer todos los datos en la capa de aplicación y calcular o mantener entidades agregadas que se actualicen en cada inserción/actualización de datos.

actualización
Es posible considerar el uso de GAE para la interfaz de usuario y la lógica de negocio, pero tener relacional DB separado en otro lugar en la nube como: Microsoft SQL, DB2 en Amazon, MySQL otra parte - y que el uso de los datos GAE-tienda para agregaciones y estadísticas precalculadas. Por lo tanto, las estadísticas todavía se calculan en RDBMS, pero almacena los resultados (estadísticas parciales, precalculadas) en el almacenamiento de GAE; similar al almacenamiento dimensional en cubos analíticos.

+0

Realmente aprecio su entrada. Sin embargo, estoy bastante preparado para usar django para la interfaz de usuario en lugar de appengine. Mezclar dos tipos diferentes de bases de datos suena como un gran enfoque, suena extremadamente difícil de configurar ... – Spike

0

Quiero apoyar la referencia de MindWire sobre el uso de Google CloudSQL.

Mi proyecto actual en realidad funciona desde el almacén de datos principalmente con más tareas orientadas a SQL realizadas en Cloud SQL.

Refernce Docs for App Engine Python SDK

Cuestiones relacionadas