在群聊应用程序上选择猫鼬模式?

Posted

技术标签:

【中文标题】在群聊应用程序上选择猫鼬模式?【英文标题】:choose the mongoose schema on group chat application? 【发布时间】:2019-09-22 05:51:42 【问题描述】:

我要设计一个基于mongodb的群聊应用,有两种schema设计选择,一种设计为一个文档用于一条群聊消息,另一种设计为一个文档用于所有群消息。

在第一个选项中,可以显示为

var ChatMessageSchema = new Schema(
  fromUserId: ObjectId,
  toTroupeId: ObjectId, 
  text: String,
  sent: Date

在第二个选项中,可以显示为

var ChatMessageSchema = new Schema( 
  toTroupeId: ObjectId, 
  chats:[
     fromUserId: ObjectId,
     text: String,
     sent: Date
  ]

两种设计各有利弊,第二种方案的缺点是它很难对用户进行索引和搜索来自用户的消息,而且太多的组消息可能会迫使创建多个文档。

第一个选项似乎更合理,因为如果我们可以正确索引,它可以允许基于 groupid 或 userid 搜索消息。

但是我想知道由于组中有数十万条消息,意味着一个组中会有相应的数十万个文档,这会影响数据库性能吗?

关于这些设计选择的任何想法,第一个选项是最佳选项,还是如何优化它?

【问题讨论】:

您的系统是否支持在多个组中搜索消息?还是只是一个特定的群体? @Skami 我想知道它们之间的区别,到目前为止我认为搜索仅限于一个组 【参考方案1】:

我建议第三种选择;为每个组创建一个新集合,例如room_$groupid。在这样的集合中,您可以单独插入每条消息。这将使您获得一个没有过滤器的完整聊天室的好处。您可以简单地从集合中返回最后 200 条左右的消息。

这将使可扩展性更容易,因为您最终不会得到一个必须过滤的大型集合。

但是,您必须编写选择正确集合的逻辑,但这应该是一项相当简单的任务。 不利的一面是,几乎不可能对多个组进行文本搜索而不会将性能抛到窗外。

Collection limit*

【讨论】:

【参考方案2】:

MongoDB 可以处理 huge amounts of data 及其 PDF Performance Best Practices for MongoDB 状态:

避免大型文档

16MB 的限制也说明了这一点。

因此可以说 MongoDB 是专门为处理与您的第一个模式相对应的数十万个文档而设计的。

只需将索引数量减少到您需要的数量(您真的需要经常或可以接受该查询慢得多的用户进行查询吗?)您应该可以使用第一个架构。其实我不确定第二个有什么好处。

【讨论】:

以上是关于在群聊应用程序上选择猫鼬模式?的主要内容,如果未能解决你的问题,请参考以下文章

使用 XMPP 在群聊中传输文件

在群聊的远程视频上显示用户名,群聊的举手功能

使用 asmack 在群聊中发送后收到多条消息

在群聊中,新消息事件(websocket)应该由客户端发送还是API发送?

群用户通过微信小程序可以更好地协作了

node.js + socket.io 聊天群聊系统