2011-11-04 20 views
5

Actualmente tengo una aplicación de juegos sociales usando mongodb de su base de datos. Mi pregunta es cuáles son algunas sugerencias si quiero crear un sistema de puntos e insignias. La lógica de negocios para los logros/insignias podría ser bastante complicada y muy ad-hoc, por lo que la adjudicación de insignias en tiempo real no parecería eficiente. Me imagino agregar acciones rastreadas a una cola en alguna parte, es decir, Amazon SQS, o simplemente utilizar el feed de actividad de un usuario como cola, y tener otro proceso de trabajo fuera de línea y simplemente procesar los efectos de cada acción/actividad para ver si el umbral para cualquier insignia particular está cruzada.cómo diseñar logros y credencialización con nosql

Mi preocupación con este método es que parece que las consultas insignia pueden llegar a ser muy intenso y me gustaría también que el seguimiento de un gran número de acciones. Puedo imaginar logros que van desde cosas como una insignia para alguien que ha anotado segundo lugar todas las semanas durante las últimas 4 semanas, o una tarjeta de identificación para alguien que tiene un amigo en cada uno de los 50 estados ... etc ...

¿Hay métodos más elegantes o probados para este tipo de cosas? ¿Tendría sentido usar otra base de datos para logros/feed de actividad/tablas de clasificación además de mongo, creando un entorno híbrido mongo/otro db?

son opciones como Redis, Neo4J, o simplemente vieja SQL Server una buena opción para una solución híbrida? Me gusta Mongo, así que seguirá siendo nuestro db principal, pero es curioso ver si agregar otro db a la mezcla ayudaría.

Respuesta

3

Este es un buen candidato para el funcionamiento de MapReduce en la base de datos. puede ejecutarlos de forma menos regular, usándolos para el cómputo sin conexión de los datos que desea.

http://www.mongodb.org/display/DOCS/MapReduce

Se podría utilizar otras herramientas para hacer esto, pero en el resumen que no puedo ver ninguna razón de peso para añadir complejidad en esta etapa. Exploraría la reducción de mapas, pruébelo y luego, si no satisface sus necesidades, amplíe sus opciones. pero en ese momento, al menos habría identificado cuellos de botella concretos, en su caso.

0

Solo algunas notas sobre el uso de un gráfico-db como Neo4j. Como su información de identificación es siempre? consultado por un usuario concreto, estas son consultas locales y no globales.

Si puede modelar su dominio como red de objetos (como quizás ya sea) y expresar su lógica de insignia como un conjunto traversals o graph-queries empezando por el usuario, entonces funciona sin persistir, ya que las consultas de gráficos locales son lo suficientemente rápidas independientemente del tamaño del conjunto de datos.

Lo más fácil es crear un PoC encajadas en tiempo para ver si funciona para usted. La conexión cruzada de las dos tiendas almacena su ID de usuario en un índice graph-db y la propiedad en el nodo debería funcionar con bastante facilidad. Puede sincronizar los db en los enganches commit/save o de forma asíncrona. Quizás sería sensato mover otros datos de "redes sociales" al gráfico y conservar los datos del juego + documentos en mongodb.