草庐IT

mongodb - Mongo 架构效率

coder 2023-11-04 原文

我目前正在设计一个依赖于 mongoDB 的本地内容库共享系统。我需要做出一个关键的架构决策,这无疑会对查询性能、扩展性和整体长期可维护性产生巨大影响。

我们的系统有一个主题库,每个主题都可以在特定的城市/大都市区使用。当一个人创建一段内容时,它需要作为主题的一部分存储在特定城市中。我目前正在考虑三种方法来满足这些要求(并且对其他想法持开放态度)。

选项 1(每个主题/城市的单个集合): 示例:集合名称为 TopicID123CityID456,每个条目显然是该集合中的一个文档。

选项 2(单一主题集合) 示例:集合名称为 Topic123,每个条目将创建一个包含索引 cityID 的文档。

选项 3(单城合集) 示例:集合名称将是 City456,每个条目将创建一个包含索引 topicID 的文档

在查询数据库时,我总是想根据成员(member)选择的主题和城市按日期顺序构建一个提要。由于成员可以将多个主题组合在一起以构建自定义提要,因此选项 3 似乎是最好的,但是我担心这种方法的长期性能。选项 1 似乎是性能最高的,但在需要选择多个主题时也会强制执行多个查询。

我需要考虑的另一件事是,有些话题会比其他话题更活跃,规模也更大,这些话题也会因地点而异。

由于我仍然认为自己是 MongoDB 的初学者,所以我想在编写有关写入和检索数据的所有逻辑之前确保通用数据库结构是最理想的。而且我不知道 Mongo 在处理集合中数十万甚至数百万个文档时的表现如何,因此我在方法上存在不确定性。

根据经验,处理这些数据的存储和调用的最佳方式是什么?任何见解将不胜感激。

更新:2016 年 6 月 22 日 需要注意的是,我们是从一个 DB 服务器环境开始的。一旦我们需要迁移到多服务器(分片)环境,@profesor79 提供了一个很好的扩展解决方案。

最佳答案

根据你的第 3 个提议,我会选择第 4 个 :-)

将一个集合分片到多个服务器上。 因为可以有一个集合 TopicCity,`我们可以有一个用于所有主题,一个用于所有城市。

然后集合 topicCities 将所有文档分片。

在键 {topic:1, city:1} 上进行分片将允许通过分片服务器平衡负载,并且任何时候您需要添加更多功能时,您都可以将分片添加到集群中。

欢迎任何评论!

关于mongodb - Mongo 架构效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37933507/

有关mongodb - Mongo 架构效率的更多相关文章

  1. ruby-on-rails - Ruby .each 效率 - 2

    我这样做(在我看来):#myUserisaUserinActiveRecordwith:has_many:postsmyUser.posts.eachdo|post|end如果用户有10个帖子,这会调用10次数据库吗?这些循环应该像(不那么漂亮)吗?:myPosts=myUser.postsmyPosts.eachdo|post|endHere是我测试的ruby​​文件的粘贴箱。编辑修改了粘贴箱。这让我想起了Java中的代码for(inti=0;i应该是(除非数组被修改)for(inti=0,len=someExpensiveFunction();i我错过了什么吗?我看到一堆Rails

  2. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  3. ruby catch 和效率 - 2

    catch在Ruby中是为了跳出深度嵌套的代码。在Java中,例如Java用于处理异常的try-catch可以实现同样的效果,但它被认为是糟糕的解决方案,而且效率也很低。在用于处理异常的Ruby中,我们有begin-raise-rescue,我认为将它用于其他任务也很昂贵。Ruby的catch-throw真的是比begin-raise-rescue更有效的解决方案吗?或者还有其他原因可以使用它来打破嵌套block而不是begin-raise-rescue? 最佳答案 除了是摆脱控制结构的“正确”方式之外,catch-throw也明显

  4. ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器 - 2

    我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有

  5. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模 - 2

    “架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概

  6. ruby - 写密集型特征的架构 - 2

    我在当前项目中使用由Oracle数据库和memcached支持的RubyonRails。有一个非常常用的功能,它依赖于单个数据库View作为数据源,并且该数据源内部有其他数据库View和表。这是一个虚拟数据库View,能够从一个地方访问所有内容,而不是物化数据库View。大多数情况下,如果用户正在使用他们希望更新的功能,那么让数据保持最新很重要。从这个View获取数据时,我将安全表内部连接到View(安全表不是View本身的一部分),其中包含一些我们用来在更细粒度级别上控制数据访问的字段。例如,安全表有user_id,prop_1,prop_2列,其中prop_1,prop_2是数据库

  7. ruby - 为什么需要 mongo 给我 LoadError : no such file to load -- openssl - 2

    我正在使用UbuntuServer10,Ruby1.9.2当我尝试要求'mongo'时它给我这个错误:irb(main):001:0>require'mongo'LoadError:nosuchfiletoload--opensslfrom/usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in`require'from/usr/local/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in`require'from/usr/local/lib

  8. ruby-on-rails - ruby 中集合操作与数组操作的效率 - 2

    集合和数组在运算效率上有何不同?例子:查找迭代包括? 最佳答案 在Ruby中,Set是使用底层的Hash编写的,它通常应该与Hash等效。因此:include?:集合复杂度为O(1),数组复杂度为O(n)枚举:两者都是O(n)删除:集合复杂度为O(1),数组复杂度为O(n)...等等如果您所说的“查找”是指按索引查找,我会注意到默认的Set实现是无序的,因此它不像数组那样支持该操作。 关于ruby-on-rails-ruby中集合操作与数组操作的效率,我们在StackOverflow上找

  9. ruby-on-rails - 在一个 Rails 应用程序中使用 PostgreSQL 的 MongoDB - 2

    我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多

  10. ruby - 使用 mongodb/mongoid 运行时更改模型 - 2

    我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序

随机推荐