MongoDB结构:单个集合与多个较小的集合

时间:2012-12-10 03:25:53

标签: mongodb database-design

我有一个通用的数据库结构问题。在我的场景中,我碰巧使用的是mongodb。

我正在创建一个应用程序,用户可以上传歌曲列表(标题,艺术家等),但不确定我是否应该为所有用户设置一个songList集合,或者为每个用户设置一个单独的songList.user#集合个人用户。用户只能查询与他们相关的歌曲,因此用户A永远不会知道用户B的歌曲。

代码示例:

每个用户多个集合

db.songList.userA.find()
{"title": "Some song of user A", "artist": "Some artist of user A"}

db.songList.userB.find()
{"title": "Some song of user B", "artist": "Some artist of user B"}
  • 赞成
    • 要查询的小集合大小
  • 缺点
    • 可维护性
      • 1,000个用户意味着1,000个馆藏

与拥有“用户”字段的单一集合

db.songList.find({"user":"A"})
{"title": "Some song of user A", "artist": "Some artist of user A", "user": "A"}
  • 赞成
    • 如果需要,可以灵活地在用户之间进行查询
  • 缺点
    • 性能

我正在尝试建立一个pro / con列表,但仍然在围栏上。鉴于每个用户的歌曲将彼此隔离哪种方法更好?我主要关心的是维护和查询性能。

提前致谢。

2 个答案:

答案 0 :(得分:12)

我建议NOT为每个用户单独收集。

阅读documentation

  

默认情况下,MongoDB的每个命名空间大约有24,000个   数据库。每个命名空间为628字节,.ns文件为16MB   默认值。

     

每个集合都被视为命名空间,每个索引也是如此。因此如果   每个集合都有一个索引,我们可以创建多达12,000个   集合。 --nssize参数允许您增加此限制   (见下文)。

     

请注意每个集合有一定的最小开销 - a   几KB。此外,任何索引都需要至少8KB的数据空间   b树的页面大小为8KB。如果有的话,某些操作会变慢   是很多集合,元数据被分页。

因此,如果用户超出命名空间限制,您将无法正常处理它。随着用户群的增长,性能也不会很高。

<强>更新

正如@Henry Liu在评论中提到的那样。对于使用WiredTiger存储引擎的Mongodb 3.0或更高版本,它将不再是限制。

docs.mongodb.org/manual/reference/limits/#namespaces

答案 1 :(得分:9)

MongoDB非常适合水平扩展。它可以在动态集群中对集合进行分片,以生成快速,可排队的数据集合。

所以拥有一个较小的集合大小并不是真正的专业人士,我不确定这个理论来自哪里,它不是在SQL中,它不在MongoDB中。如果做得好,分片的性能应该与查询单个小数据集的性能相关(具有小的开销)。如果不是那么你就设置了分片错误。

MongoDB在垂直扩展方面表现不佳,正如@Sushant所引用的那样,MongoDB的ns大小将是一个严重的限制。引用没有提到的一件事是索引大小和计数也影响ns大小,因此它描述了:

  

因此,如果每个集合都有一个索引,我们最多可以创建12,000个集合。 --nssize参数允许您增加此限制(见下文)。