2015-06-13 15 views
9

Un problema di progettazione molto semplice. Dì che voglio costruire Facebook Messenger. Diciamo che John e Marry stanno chattando, che è un approccio migliore?MongoDB: miglior design per l'app di messaggistica

1) 1 documento per ogni conversazione, messages è un array di oggetti messaggio

{ participants: ['john', 'marry'], 
    messages: [ 
     { sender: 'john', content: 'howdy', time_created: new Date() }, 
     { sender: 'marry', content: 'good u', time_created: new Date() }, 
     ... 
    ] 
} 

2) 1 documento per messaggio

{ participants: ['john', 'marry'], sender: 'john', message: 'howdy', time_created: new Date() } // document 1 
{ participants: ['john', 'marry'], sender: 'marry', message: 'good u', time_created: new Date() } // document 2 
.... 

Quale approccio ha una migliore performance in termini di inserire un nuovo messaggio (aggiornare una conversazione e creare un nuovo documento)?

oppure esiste un approccio migliore (come nel mio secondo approccio, non sono sicuro se è un buon progetto specificare il campo partecipanti in ciascun documento)?

Grazie!

risposta

11

In base ai dati di esempio per l'app di messaggistica, ciò che si potrebbe fare è disporre di due raccolte: Conversazione e Messaggi. Dove la relazione è una conversazione ha molti messaggi.

Conversation: 
{ id: 123 
    participants: ['john', 'marry'], 
} 


Message: 
{ sender: 'john', 
    content: 'howdy', 
    time_created: new Date(), 
    converstationId: 123 
}, 
{ sender: 'marry', 
    content: 'good u', 
    time_created: new Date(), 
    converstationId: 123 
}, 

Creazione di un nuovo messaggio di documento, sarebbe meglio in questo caso, come si può quindi avere due applicazioni (1 per John e 1 per sposarsi), senza la gestione la possibilità di due di loro l'aggiornamento dello stesso documento. Capita solo di condividere la stessa sessione di conversazione.

Inoltre, se una conversazione è un singolo documento, si potrebbe finire con un documento molto grande. (Crescita preoccupazione Document)

È possibile trovare maggiori informazioni su modellazione dei dati per questa MongoDB doc

http://docs.mongodb.org/manual/core/data-modeling-introduction/

anche vedere MongoDB: Socialite per gli esempi/discussione di caso d'uso di social network.

Spero che aiuti. Saluti.

+0

L'aggiornamento di 2 raccolte su ogni nuovo messaggio è un sacco di scrittura del database? –

+0

Si aggiornerebbe solo la raccolta di messaggi per ogni nuovo messaggio. La raccolta di conversazioni viene creata/aggiornata solo quando vi sono nuovi partecipanti o quando inizia una nuova conversazione. La tua applicazione può conservare l'id della conversazione (proprio come una sessione). –

+0

ma se non aggiorni la raccolta di conversazioni su ogni nuovo messaggio (per memorizzare l'ultima ora aggiornata), come recupereresti tutta la conversazione ordinata dal più recente al meno recente, quando un utente apre l'app? –

Problemi correlati