在群聊应用中选择猫鼬模式?

use*_*624 8 mongodb database-schema mongoose-schema

我将基于mongodb设计一个群聊应用程序,有两种模式设计选择,一种设计为一个群组聊天消息的文档,另一种设计为所有群组消息的文档。

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

var ChatMessageSchema = new Schema({
  fromUserId: ObjectId,
  toTroupeId: ObjectId, 
  text: String,
  sent: Date
}
Run Code Online (Sandbox Code Playgroud)

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

var ChatMessageSchema = new Schema({ 
  toTroupeId: ObjectId, 
  chats:[
     fromUserId: ObjectId,
     text: String,
     sent: Date
  ]
}
Run Code Online (Sandbox Code Playgroud)

两种设计都有优点和缺点,第二种选择的缺点是它几乎无法在用户上建立索引并搜索来自用户的消息,并且太多的组消息可能会迫使创建多个文档。

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

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

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

Ska*_*ami 1

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

它将允许更容易的可扩展性,因为您最终不会得到一个需要过滤的庞大集合。

但是,您必须编写用于选择正确集合的逻辑,但这应该是一项相当简单的任务。缺点是,在不影响性能的情况下对多个组进行文本搜索几乎是不可能的。

收集限额*