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

时间:2014-06-05 21:52:12

标签: mongodb database-design database nosql

它将成为基于Web的Asychronus,多用户聊天。 我不确定是否将所有内容都嵌入到一个表中。通道文档和嵌入式消息作为SubDoc。 或规范化,两个不同的表,通道和消息,如关系数据库。

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 : ''

      }

  }
]

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

1 个答案:

答案 0 :(得分:1)

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

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