在MongoDB中,对于以下情况,我应该使用规范化还是嵌入?

在MongoDB中,对于以下情况,我应该使用规范化还是嵌入?,mongodb,database-design,database,nosql,Mongodb,Database Design,Database,Nosql,这将是一个基于网络的异步多用户聊天。 我不确定是否将所有内容都嵌入到一个表中。将文档和嵌入消息作为子文档传输。 或者规范化,两个不同的表、通道和消息,如关系数据库 Channel: [ { _id: ObjectId(…), title: '' descr: '' owner: '' mods : [] } ] Message: [ { _id: ObjectId(…) msgid:'' from : 'Use

这将是一个基于网络的异步多用户聊天。 我不确定是否将所有内容都嵌入到一个表中。将文档和嵌入消息作为子文档传输。 或者规范化,两个不同的表、通道和消息,如关系数据库

Channel: [
  {
    _id: ObjectId(…),
    title: ''
    descr: ''
    owner: ''
    mods : []
  }
]

Message: [
  {
    _id: ObjectId(…)
      msgid:''
      from : 'UserID'
      msg : ''
      Channel : "Channel'sObjectID"

  }

Channel: [
  {
    _id: ObjectId(…),
    title: ''
    descr: ''
    owner: ''
    mods : ['UserID','UserID',]

    Message: [
      {
          msgid:''
          from : 'UserID'
          msg : ''

      }

  }
]

消息是聊天消息,需要写很多(由于多用户需求,插入的消息会很多)。所以,如果我想写,我需要向下查询频道的消息并在那里写。它会提高性能吗?

随着时间的推移,当每个频道收到越来越多的消息时,您应该将单个消息作为单独的文档放入另一个集合中


原因是MongoDB不喜欢随时间增长的文档。出于性能原因,MongoDB将每个文档保存在物理文件的连续部分中。当文档增长到超过该节时,需要将其移动到文件中的另一个位置。这种不断的重新分配可能是一个真正的性能挂钩。非常大的对象也不利于缓存。为了进一步阻止对象的增长,MongoDB对每个文档施加了16MB的人为大小限制。平均聊天活动为每分钟100字节的聊天频道将在大约3个月内超过此限制。

噢,每个文档16MB是否包括嵌入式文档?如果嵌入文档增长,它也会击中主文档,对吗?有了多用户env,它将很容易在几天内变得过时。我认为嵌入式文档被视为单独的文档。非常感谢@V3ss0n是的,嵌入的文档是它们嵌入的文档的一部分。