我应该将一个集合分成两个集合来表现吗?

时间:2014-05-09 08:39:47

标签: mongodb database-design

我有一组用户。

每个用户都有一些基本属性:名称,地址,邮政编码......

但每个用户还有一些更多的空间属性:统计

statistics属性包含的数组比放在一起的所有其他属性大10倍以上。

我的问题如下:

我应该将我的集合拆分为用户集合和用户统计信息集合吗? 用户集合将包含基本属性 user_stats集合将是用户,但包含统计信息。然后,当我想要检索基本信息时,我可以使用用户集合,当我真正需要统计数据时,我可以使用user_stats集合。

例如,如果我搜索所有用户的所有名称:

userCollection.find({},{"name":true});

在我只有一个系列的情况和我有两个系列的情况下,它们会在性能上有所不同吗?这种差异是否是线性的(即使是这种情况,线性因素是一个文件大小的比例)?

它推断的一般问题是:当文档的大小变大(选择相同的属性)时,mongodb会失去性能吗?

更新

统计信息中的属性位于一个随时间变大的数组中(用户使用该应用程序的次数越多)。它们对此数组没有限制,但大多数用户(90%)的统计信息属性不会超过其他属性的10倍。但是,一小部分用户(1-2%)具有统计属性,其大小是其他属性的500倍。

我需要这些数据,所以我不关心存储,而是关注性能。

它们基本上是我从用户集合中获取数据的两种情况:

  • 当我显示用户列表时,我无法获取统计信息:我只投影名称属性以及其他一些空间有限的项目

  • 当我显示一个用户时,我获取统计信息:基本上我会投影所有统计信息属性+其他一些。

2 个答案:

答案 0 :(得分:1)

好吧,在我看来,如果用户记录的大小远小于统计信息的大小,那么通过将统计信息移动到另一个集合,您就无法赢得任何东西。如果统计数据很大,则它们在任何集合中都很大。对?此外,一切都有限制增长 - 你不能永远发展它。我不知道您的统计数据需要多么精细,但您是否可能记录“汇总”统计数据而不是详细统计数据?可能是您的统计数据可以每小时或每天汇总一次吗?

答案 1 :(得分:1)

这取决于统计数据如何影响您的查询性能。如果您的查询延迟较低,则拆分可能不值得。 即使您只投影所需的字段,整个文档也会加载到内存中。

注意:未绑定的数组不是一个好的设计。