2012-06-27 9 views
12

Me estoy volviendo loco pensando en una buena estructura de documento para manejar una aplicación de mensaje.Estructura de MongoDB para la aplicación de mensaje

Necesito básicamente tres (o cuatro) tipos de objetos:

  1. El usuario (nombre de usuario, correo electrónico, contraseña, etc.)
  2. la lista de contactos (que contiene diferentes contactos o grupos de contactos)
  3. la conversación (una conversación es una colección de mensajes entre algunas personas)
  4. el mensaje (contiene el cuerpo del mensaje, alguna marca de tiempo y el creador.)

Mi idea era integrar los contactos en el documento de usuario y de integrar los mensajes en un documento de conversación:

1. El usuario

{ 
    username: 'dev.puS', 
    usernameCanonical: 'dev.pus', // used for unique constraints 
    email: '[email protected], 
    emailCanonical: '[email protected], 
    salt: 'some hash', 
    password: 'hash with salt', 
    logs: { last_login: 12.06.2008, last_password_reset: 04.03.2007 }, 
    state: { online: true, available: false }, 
    contacts: [ user_id1, user_id2, user_id3 ] 
} 

2. Conversación

{ 
    members: [ user_id1, user_id2 ], 
    messages: [ 
     { author: user_2, body: 'Hi what's up' }, 
     { author: user_1, body: 'Nothing out here :(' }, 
     { author: user_2, body: 'Whanna ask some question on stackoverflow' }, 
     { author: user_1, body: 'Okay, lets go' } 
    ] 
} 

¿Qué piensas de este esquema?

Creo que sería mejor mantenerlos separados (por lo que cada documento es propio) porque cada documento tiene una frecuencia de actualización diferente. Pero realmente no tengo ninguna experiencia al respecto por lo que sería bueno escuchar algunos consejos :)

Saludos

+2

esquema a MongoDB no es “bueno” o “malo” por sí mismo. Debe detallar las consultas y actualizaciones que va a realizar. Solo entonces puede evaluar si un esquema dado se adapta a estos patrones de operación. –

+1

También necesita estimar la distribución del tamaño de los datos, por ejemplo, ¿cuántos mensajes contendrá una conversación, en promedio, como máximo? Esto puede ser importante si desea incrustar. –

+0

De acuerdo, lo tendré en cuenta. ¿Es un enfoque común para la memoria caché, por ejemplo, los mensajes con redis y que los guardan todos en mongo cuando termina la sesión? Estoy un poco inseguro acerca de realizar muchas acciones de escritura en un objeto "no estructurado" –

Respuesta

4

Su pregunta es realmente uno de diseño de esquema. Sugiero echar un vistazo a esta página en el diseño de esquema de MongoDB para tener una idea de las opciones y las compensaciones: http://www.mongodb.org/display/DOCS/Schema+Design

Además, probablemente debería revisar los enlaces en la sección 'Ver también' de ese documento. Recomiendo especialmente las presentaciones de video.

Por último, probablemente debería echar un vistazo a este documento para una discusión de los tres esquemas posibles para una mensajería/comentando base de datos, incluyendo las ventajas y desventajas para cada diseño: http://docs.mongodb.org/manual/use-cases/storing-comments/

7

veo que esta pregunta es viejo, pero para cualquier persona interesada, se le hizo una pregunta similar y se ve una respuesta viable https://stackoverflow.com/a/30830429/132610

Conversation : { 
id: 123, 
members: [ user_id1, user_id2 ] 
} 
Message { conversationId: 123, author: user_2, body: 'Hi what's up' } 
Message { conversationId: 123, author: user_1, body: 'Whanna ask some question on stackoverflow' } 
+0

Tengo una confusión en mi mente, usted (y todos los demás) dijeron una colección para 'Conversaciones' y otra Colección para' Mensajes'.digamos que tenemos 1 millón de usuarios en los mensajes y ellos están hablando entre sí, la tabla 'Mensajes' puede alcanzar miles de millones de documentos, ¿tiene mongodb capacidad para administrar una gran colección de documentos, y qué pasa con el tiempo de respuesta de búsqueda? digamos que buscamos los últimos 100 mensajes de un solo usuario en miles de millones de millones de mensajes ¿cuánto tiempo tardará en volver? –

Cuestiones relacionadas