2015-06-13 27 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

,但如果您不更新每条新消息的对话集(以存储上次更新的时间),那么当用户打开应用程序时,如何获取从最近到最近排序的所有对话? –