2015-06-13 10 views
9

Çok basit bir tasarım problemi. Facebook Messenger'ı kurmak istediğimi söyle. Diyelim ki John ve Marry sohbet ediyor, hangisi daha iyi bir yaklaşım?MongoDB: mesajlaşma uygulaması için en iyi tasarım

1) konuşma başına 1 belge, messages mesaj nesnesinin bir dizidir

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

2) yaklaşımı açısından daha iyi bir performansa sahiptir mesaj

{ 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 
.... 

başına 1 belge yeni bir mesaj eklemek (bir konuşmayı güncellemek ve yeni bir belge oluşturmak)?

veya daha iyi bir yaklaşım var mı (2. yaklaşımımda olduğu gibi, her bir dokümanda katılımcı alanını belirtmek için iyi bir tasarım olup olmadığından emin değilim)?

Teşekkürler!

cevap

11

Mesajlaşma uygulamasıyla ilgili örnek verilerinize dayanarak yapabildiğiniz şey iki koleksiyona sahip olmaktır: Konuşma ve Mesajlar. İlişkinin bir Konuşma olduğu birçok Mesaj var. sonra aynı belgenin güncellenmesi ikisinin olasılığını ele vermeden (evlenmek için john için 1 ve 1) iki uygulama olabilir gibi bu durumda daha iyi olurdu yeni bir doküman mesajı oluşturma

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 
}, 

. Sadece aynı sohbet oturumunu paylaşıyorlar.

Ayrıca, bir ileti tek bir belge ise, çok büyük bir belgeye sahip olabilirsiniz. Bu mongodb doc sosyal ağ kullanım örneğinin örnekler/tartışma için de

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

bkz MongoDB: Socialite için veri modelleme hakkında daha fazla bilgi bulabilirsiniz

(Belge büyüme endişe).

Yardım edin. Şerefe.

+0

Her yeni mesajda 2 koleksiyon güncellenirken çok fazla veritabanı yazılabilir mi? –

+0

Sadece her yeni mesaj için mesaj koleksiyonunu güncellersiniz. Konuşma koleksiyonu, yalnızca yeni bir katılımcı olduğunda veya yeni görüşme başladığında oluşturulur/güncellenir. Uygulamanız konuşma kimliğini koruyabilir (bir oturum gibi). –

+0

ancak her yeni mesajda (en son güncellenen zamanı depolamak için) konuşma koleksiyonunu güncellemezseniz, bir kullanıcı uygulamayı açtığında en sondan en yakın tarihe kadar olan tüm sohbetleri nasıl alırsınız? –