Tengo un sitio web con 500k usuarios (se ejecuta en el servidor sql 2008). Deseo ahora incluir corrientes de actividad de usuarios y sus amigos. Después de probar algunas cosas en SQL Server, resulta evidente que RDMS no es una buena opción para este tipo de características. es lento (incluso cuando desnormalicé mucho mis datos). Entonces, después de mirar otras soluciones NoSQL, he pensado que puedo usar MongoDB para esto. Estaré siguiendo la estructura de datos basada en activitystrea.ms json specifications for activity stream Así que mi pregunta es: ¿cuál sería el mejor diseño de esquema para el flujo de actividad en MongoDB (con este muchos usuarios se puede predecir que será muy pesado en las escrituras, de ahí mi elección de MongoDB: tiene un gran rendimiento de "escrituras". He pensado en 3 tipos de estructuras, por favor dígame si esto tiene sentido o debería usar otros patrones de esquema.Diseño de esquema de base de datos MongoDB
1 - Almacenar cada actividad con todos los amigos/seguidores en este patrón:
{ _id:'activ123', actor:{ id:person1 }, verb:'follow', object:{ objecttype:'person', id:'person2' }, updatedon:Date(), consumers:[ person3, person4, person5, person6, ... so on ] }
2 - Segundo diseño: Collectio n Nombre activity_stream_fanout
{ _id:'activ_fanout_123', personId:person3, activities:[ { _id:'activ123', actor:{ id:person1 }, verb:'follow', object:{ objecttype:'person', id:'person2' }, updatedon:Date(), } ],[ //activity feed 2 ] }
3 - Este enfoque sería la de almacenar los elementos de actividad en una colección, y los consumidores de otro. En las actividades, es posible que tenga un documento como:
{ _id: "123", actor: { person: "UserABC" }, verb: "follow", object: { person: "someone_else" }, updatedOn: Date(...) }
Y luego, para los seguidores, que tendría las siguientes "Notificaciones" documentos:
{ activityId: "123", consumer: "someguy", updatedOn: Date(...) } { activityId: "123", consumer: "otherguy", updatedOn: Date(...) } { activityId: "123", consumer: "thirdguy", updatedOn: Date(...) }
Sus respuestas son muy apreciadas.
excelentes sugerencias. Con el tiempo real no quise decir subsecond, solo quería decir en tiempo real lo suficientemente rápido como para que no ganaras mucho al "agrupar" múltiples actividades de usuario en el escenario 2 del OP. Por otra parte, no estoy familiarizado con el término 'fanout' (al que la segunda opción del OP parece referirse, y usted también lo menciona), así que es posible que no haya entendido las intenciones de 2. completamente. Por cierto: ir a leer ese blogpost, siempre es bueno ver publicaciones arquitectónicas sobre el diseño del esquema MongoDB –
leer bien, he dejado un comentario en tu blog con una pregunta relacionada que tal vez quieras leer. Gracias –
Chicos, muchas gracias por las sugerencias. Marqué @mnemosyn post como respuesta ya que tiene sentido. Leeré tu blog y veré a dónde me lleva. De nuevo, gracias un registro para todas sus sugerencias. –