用于多用户应用程序的 mongodb 数据库架构

标签 mongodb collections namespaces schema

问题:一个应用程序中有数以万计的用户(但少于 50 万)。

解决方案:将每个用户的集合(10-20)存储在单独的用户命名空间中(每个客户端只有一个),以通过从每个用户的 id 'column' 转义来节省磁盘空间;加快命名空间小索引的查询时间;降低锁定率(https://jira.mongodb.org/browse/SERVER-1240);简化分片 (https://jira.mongodb.org/browse/SERVER-939)。

这个可以吗?或者我应该使用一个带有命名空间的通用集合?

感谢您的回答。

最佳答案

我想我明白你的问题,但如果我错了,请纠正我。似乎您希望将每个应用程序的用户存储在他们自己的集合中。这有几个优点和缺点,您必须根据复杂的 DBA 决策(如 R/W 比、负载等)来衡量这些优点和缺点。

优势

  • 就像你提到的,索引更新时间会更短,因为它们只有一部分用户。
  • 由于元素数量较少,对非索引字段(如果有)的查询会更快。
  • 全局写锁不会发挥太大作用,因为您只锁定每个应用程序。

  • 缺点
  • 由于索引是由集合限定的,因此您将有 (# of Applications) 倍的索引保留在内存中(如果您将它们分页,则索引没有用处)。
  • 因为索引和集合占用自己的命名空间,每个命名空间占用大约628个字节,所以你需要担心默认的16MB namespace limit .这将限制您可以拥有的应用程序数量。例如使用 2 个索引,您被限制为大约 8,000 个集合。
  • 最后,由于您的用户将位于不同的集合中,您将无法跨应用程序进行查询。这可以被 MapReduce 颠覆,但会增加更多的复杂性。

  • 归根结底,您可以通过简单地对某些应用程序 key 进行分片来避免这些缺点的同时获得大部分这些好处。许多收集场景很诱人,但我认为最终不是 mongo 优化的。

    关于用于多用户应用程序的 mongodb 数据库架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8082965/

    相关文章:

    mongodb - 在 Mongo/RectiveMongo 中存储/获取列表引用的值的最佳方式?

    c# - 如何将 WorkItemCollection 转换为列表

    Java PriorityQueue 似乎在调用 add() 时更改了之前添加的值

    c++ - C++中嵌套函数声明的范围

    node.js - 未处理的拒绝范围错误: invalid status code: 0

    javascript - 使用 Javascript 连接到 MongoDB

    javascript - 如何在 Node 议程中以编程方式定义多个具有相同名称的作业

    java - 集合<是什么意思?扩展 EmpApp>?

    c++ - 需要有关 C++ 编码模式的建议

    php - 找不到 fatal error RecursiveIteratorIterator