MongoDB是否需要双链接数据?

MongoDB是否需要双链接数据?,mongodb,Mongodb,MongoDB是否需要双重链接数据,类似于MySQL,其中相关条目的ID相互指向。换句话说,以下各项之间是否存在性能差异: db.events.find({userIds: myId}).fetch() 及 通常,查询中的$速度惊人,但它是否正确取决于数据的基数(每个用户的最大事件数,每个事件的最大用户数)和您的查询模式 一般来说,索引的概念是避免来回链接。这使得您提到的繁琐更新变得不必要。它也更容易查询、维护和分页 最后一个参数特别重要,但取决于您的查询模式:假设您希望显示用户最近参与的十个

MongoDB是否需要双重链接数据,类似于MySQL,其中相关条目的ID相互指向。换句话说,以下各项之间是否存在性能差异:

db.events.find({userIds: myId}).fetch()


通常,查询中的
$速度惊人,但它是否正确取决于数据的基数(每个用户的最大事件数,每个事件的最大用户数)和您的查询模式

一般来说,索引的概念是避免来回链接。这使得您提到的繁琐更新变得不必要。它也更容易查询、维护和分页

最后一个参数特别重要,但取决于您的查询模式:假设您希望显示用户最近参与的十个事件。然后您可以创建一个索引
{userIds:1,eventDate:-1}
,它将与查询完全匹配,并且不必提取或迭代用户访问的所有事件

如果您想使用另一种方法执行此查询,还必须将
eventDate
存储在用户中,这看起来相当尴尬

另一方面,如果活动规模很大,您可能会遇到活动对象大小的问题(假设有100万参与者)。出于显示目的,您可能希望取消参与者名称的规范化,这会使对象更大

如果您选择在
查询中使用
$,请记住

  • 随着阵列变大,性能会下降。我不确定是什么原因导致了这种情况,但当数组增长到超过一到两千个(!)元素时,我遇到了麻烦
  • 如果ID分布得太远,MongoDB可能会遇到很多麻烦。这在很大程度上取决于您使用的键的类型,但可能会很痛苦(例如,如果您使用
    ObjectID
    ,并且用户每天都参加活动,您可能会点击您拥有的每个
    \u id
    存储桶,也可能会点击较旧的存储桶,这可能会很昂贵)

  • 区别在于第一个查询是一个查询,而第二个查询是多个查询,由于网络开销,查询速度必然较慢。如果这意味着“需要双重链接数据”,则完全取决于您打算如何使用数据库。@Thilo我已将其更改为一个查询。你能解释一下“我打算如何使用数据库”是什么意思吗?谢谢。现在主要的区别是,你需要知道第二个查询的事件ID列表,而第一个查询只需要用户ID。是的,这就是双重链接的问题。假设我已经有了第一个。为了某种性能提高,也执行第二个(冗余存储事件ID)有什么好处吗?假设您为“userid”编制索引,并且这两个查询返回相同的结果,主要区别在于对辅助索引执行单个索引查找,而不是对主索引执行多个查找。主索引经过优化,速度略快于辅助索引,但多重查找可能会超过这一点。同样,在范围为1-4的情况下,指定范围$gte:1和$lte:4更有效,在这种情况下,这会减少btree中的索引查找。
    db.events.find({_id: {$in: [1, 2, 3, 4]} }).fetch()