MongoDB文档模型大小/性能限制?一个对象可能包含10万个+;名字?
我正试图建立一个活动网站,将主办视频等。我已经用事件名称、事件描述和一个对象建立了一个集合,其中包含一些“参与”人员的友好信息。如果事情进展顺利,可能会有10-20万人参加,这些人应该可以接触其他人。(点击友好的名字会找到用户的id,然后找到他们的完整资料)这是不是对mongo要求太高了?还是有更好的方法来做类似的事情?看起来这可能会很快变得很大MongoDB文档模型大小/性能限制?一个对象可能包含10万个+;名字?,mongodb,Mongodb,我正试图建立一个活动网站,将主办视频等。我已经用事件名称、事件描述和一个对象建立了一个集合,其中包含一些“参与”人员的友好信息。如果事情进展顺利,可能会有10-20万人参加,这些人应该可以接触其他人。(点击友好的名字会找到用户的id,然后找到他们的完整资料)这是不是对mongo要求太高了?还是有更好的方法来做类似的事情?看起来这可能会很快变得很大 { _id : ...., // event Id, 'name' : // event name 'description
{
_id : ...., // event Id,
'name' : // event name
'description' : //event description
'attendees' :{
{'username': user's friendly name, 'avatarlink': avatar url},
{'username': user's friendly name, 'avatarlink': avatar url},
{'username': user's friendly name, 'avatarlink': avatar url},
{'username': user's friendly name, 'avatarlink': avatar url}
}
}
谢谢你的建议 > P>也许你应该考虑在两个集合中建模你的数据,而事件文档中的与会者字段将是一个用户ID数组。 下面是该模式的一个示例: db.events
{
_id : ...., // event Id,
'name' : // event name
'description' : //event description
'attendees' :[ObjectId('userId1'), ObjectId('userId2') ...]
}
数据库用户
{
_id : ObjectId('userId1'),
username: 'user friendly name',
avatarLink: 'url to avatar'
}
然后您可以执行两个单独的查询
db.events.find({_id: ObjectId('eventId')});
db.users.find( {_id: {$in: [ObjectId['userId1'), ObjectId('userId2')]}});
一般来说,在MongoDB多对多建模(或一对多)中,您应该采取不同的方法,具体取决于多是少(通常最多几十个)还是“真的”多 最好不要在您的案例中使用嵌入,而是规范化。如果在事件集合中嵌入用户,则向特定事件添加与会者将增加阵列大小。由于文档是就地更新的,如果文档不能适应其磁盘大小,它将不得不在磁盘上移动,这是一项非常昂贵的操作,还会导致碎片。有很多方法可以处理这些动作,但没有一个是理想的 拥有一系列的
ObjectId
作为与会者会更好,因为文档的增长不会太快,但仍然会出现一些问题。您将如何查找用户参与的所有事件?您可以为与会者提供多键索引,但一旦某个文档移动,该索引必须根据每个用户条目进行更新(该索引包含指向磁盘上文档位置的指针)。在你的情况下,如果你计划拥有20万用户,那将是非常痛苦的
嵌入是MongoDB或任何其他面向文档的数据库的一个非常酷的特性,但如果认为它(有时)不是免费的,那就太天真了
我认为您应该重新思考您的模式:拥有一个事件集合、一个用户集合和一个用户事件集合,其结构类似于:
{
_id : ObjectId(),
user_id : ObjectId(),
event_id : ObjectId()
}
规范化不是一个肮脏的词,所以我已经有了一个用户集合。我只存储用户名和头像url,因为这在事件视图中是可用的。在观看活动时,你应该能够看到参加的人。如果他们选择了解有关该用户的更多信息,那么他们可以单击他们的姓名,这将搜索该姓名的用户名并返回整个配置文件。我最初的想法是,如果你只想了解与会者的基本情况,就不必再提出另一个问题。这是否有助于或改变你的建议?这也是我的第一个想法,但我对Mongo世界还是新手,不确定这是否违背了这个概念。你是对的,但这可以很快变成一个大的多对多关系。我已经有了一个用户集合,如果有人观看了活动,他们可以点击一个名字,然后搜索id并填写档案的其余部分。我最初的想法是,如果事件视图中所需的一切都在事件对象中可用,那么事情会变得更容易,但我认为我同意您的看法,需要对其进行细分。谢谢