【问题标题】:mongodb - many documents in one collection vs many collectionmongodb - 一个集合中的许多文档与多个集合
【发布时间】:2013-01-30 15:22:42
【问题描述】:

我使用 mongodb 作为数据库存储。

我的网络应用必须收集用户响应。

用户响应是 mongodb 中的一个文档(或 sql 中的一行)。一个文档的长度大约是10~200。

用户响应被分类(仅归类)。对于每个类别,用户响应的数量在 100~5000 之间。如果两个文档属于同一类别,则具有相同的长度。 (或者它们在 sql 中有相同的列)

可以根据管理员的要求动态创建/删除类别。

目前,我的数据结构是

category collection
{_id, 'name' : 'c1', 'somevalue' : '123'}
{_id, 'name' : 'c2', 'somevalue' : '23'}
{_id, 'name' : 'c3', 'somevalue' : '143'}
{_id, 'name' : 'c4', 'somevalue' : '153'}
...

'c1' collection
{ userresponse1 }
{ userresponse2 }
{ userresponse3 }
...

'c2' collection
{ userresponse1 }
{ userresponse2 }
{ userresponse3 }
...

'c3' collection
{ userresponse1 }
{ userresponse2 }
{ userresponse3 }
...

'cN' collection
{ userresponse1 }
{ userresponse2 }
{ userresponse3 }
..

这是一个明智的决定吗?我担心通过为每个类别分配一个集合而出现问题的可能性。如果我有很多集合,会有一些性能问题吗?我应该合并我的收藏并给用户响应一些标识符吗?

【问题讨论】:

  • 这个已经回答了很多次了,通常MongoDB擅长垂直扩展。横向扩展许多集合并没有那么好。它可以扩展许多数据库,但对于这种情况来说这可能是多余的
  • 哎呀,当我说垂直时,我指的是水平,当我说水平时,我指的是垂直。该死的词
  • @sammaye 你能清楚地告诉我这是怎么回事吗? growing vertically 表示few big collectionsgrowing horizontally 表示many (relatively) small collections,而mongodb擅长拥有many small collections,对吧?
  • 没有水平扩展是有几个集合在集群中的许多分片(服务器)上水平扩展。
  • 不过,再次阅读您的问题,这是否不好取决于您打算拥有多少类别。我的意思是你不能有这么多的类别,对吧?默认命名空间允许大约 12k 个集合以及每个集合的少量索引。但是,在主服务器上拥有如此多的索引可能会导致性能问题,因为从长远来看,您可以在多个服务器之间分片索引,从而为您节省很多麻烦。

标签: mongodb


【解决方案1】:

当然,答案取决于您的查询模式以及您正在查看的集合数量。在不了解更多信息的情况下,我怀疑您需要进行跨越许多响应集合的查询。

例如,如果每个 userresponse 都有一个 userId 字段,并且假设您想要获取特定用户的所有响应的日期排序列表。您需要遍历所有集合,查询每个集合,并将结果组合到客户端代码中。显然,与索引 UserResponse 集合中的单个简单查询/排序相比,这将是非常低效的。

【讨论】:

  • 除了您的访问模式之外,您还需要考虑 MongoDB 如何处理存储,尤其是文档的删除。删除文档时释放的空间不会自动用于其他集合,而只会用于从中删除它的集合。
猜你喜欢
  • 2020-09-16
  • 1970-01-01
  • 2017-10-17
  • 2016-08-20
  • 2012-11-27
  • 1970-01-01
  • 2012-09-11
  • 2015-06-09
  • 2013-02-25
相关资源
最近更新 更多