在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是的,嵌入的文档是它们嵌入的文档的一部分。