2015-06-13 34 views
9

一個非常簡單的設計問題。假設我想構建Facebook Messenger。假設約翰和瑪麗在聊天,這是一個更好的方法?MongoDB:消息應用的最佳設計

1)每會話1文件,messages是消息對象的陣列

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

2)每個消息

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

哪種方法具有在以下方面更好的性能1文件插入新消息(更新對話與創建新文檔)?

還是有沒有更好的方法(如我的第二種方法,我不知道是否是一個好的設計來指定每個文檔中的參與者字段)?

謝謝!

回答

11

根據您的消息應用程序的示例數據,您可以做的是擁有兩個集合:對話和消息。 關係是一個對話有很多消息。

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

創建一個新的文件信息將是在這種情況下更好,因爲你就可以有兩個應用程序(結婚1約翰和1)不處理他們兩個更新同一文檔的可能性。 他們恰好在分享同一個會話。

此外,如果對話是單個文檔,您可能會得到一個非常大的文檔。 (文檔增長的關注)

你可以找到更多關於數據建模這個MongoDB的文檔

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

另見MongoDB: Socialite針對社交網絡的使用案例/討論。

希望它有幫助。 乾杯。

+0

更新每個新消息的2個集合是很多數據庫寫入? –

+0

您只會更新每條新消息的消息收集。對話集合僅在有新參與者或新對話開始時創建/更新。您的應用程序可以保留對話ID(很像會話)。 –

+0

,但如果您不更新每條新消息的對話集(以存儲上次更新的時間),那麼當用戶打開應用程序時,如何獲取從最近到最近排序的所有對話? –