草庐IT

mongodb - 以下和提要的mongodb设计,我应该在哪里嵌入?

coder 2023-05-05 原文

我有一个基本问题,关于我应该在哪里嵌入一组追随者/追随者到 mongo db。在用户对象中嵌入关注集合是有意义的,但是也嵌入逆关注集合也有意义吗?这意味着我必须更新并嵌入以下两者的个人资料记录:

  1. 跟随者中的嵌入列表
  2. 以及followee嵌入的followee列表

除非我还以某种方式在某处保留事务或更新状态,否则我无法确保其原子性。是否值得在两个实体中嵌入,或者我应该只更新#1,将关注者嵌入关注者的个人资料中,然后在其上放置一个索引,以便我可以查询所有个人资料中的相反关注者?对性能的影响是不是太大了?

这是不应该嵌入的集合的候选者吗?我是否应该只拥有一个边缘集合,在其中使用 followerid 和 followbyId 将关注存储在其自己的集合中?

现在,如果我还必须在两个用户被关注或关注时更新他们的提要,我应该如何组织呢?

至于用例,用户在查看他们的提要时会看到他们正在关注的人,这种情况经常发生,当他们查看任何人的个人资料详细信息时,也会看到个人资料的关注者,这也经常发生,但不如第一种情况多。在这两种情况下,关注者和关注者的总数都会显示在每个个人资料页面上。

最佳答案

一般来说,将追随/被追随关系嵌入到用户文档中是个坏主意,原因如下:

(1) 最大文档大小限制为 16MB,一个订阅量大的网站的热门用户最终可能拥有数十万粉丝,这将接近最大文档大小,

(2) 追随者关系经常变化,因此如果您嵌入追随者,用户获得大量追随者的情况会转化为重复的文档增长。频繁的文档增长会严重影响 MongoDB 的性能,因此应该避免(偶尔的文档增长,尤其是文档趋于达到稳定的最终大小,对性能的影响较小)。

所以,是的,最好将跟随/被跟随关系拆分为一个单独的记录集合,每个记录有两个字段,例如 { _id : , oid : },索引在 _id 上(对于“谁是我关注?”查询)和 oid(用于“谁在关注我?”查询)。任何单个状态更改都由单个文档添加或删除建模,但如果您还显示关注者计数等内容,您可能应该保留在任何边缘插入/删除后更新的单独计数器。

(当然,这假设您的业务要求允许您在一致性细节上具有一定的灵 active :通常,如果您的显示代码告诉用户他有 304 个关注者,然后继续枚举他们,那么只有最挑剔的用户会检查追随者列举的总数高达 304。如果业务需求需要绝对一致性,您将需要一个为您隔离事务的数据库,否则您必须自己进行计数,作为显示所有用户身份的一部分。)

关于mongodb - 以下和提要的mongodb设计,我应该在哪里嵌入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8213637/

有关mongodb - 以下和提要的mongodb设计,我应该在哪里嵌入?的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  8. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  9. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  10. ruby-on-rails - ActiveRecord::Associations::CollectionProxy 从哪里获取.each 实例方法? - 2

    假设我有模型Topics和Posts,其中Topichas_many:posts和Postbelongs_to:topic。此时我的数据库中已经有了一些东西。如果我进入Rails控制台并输入Topic.find(1).posts我相信我得到了一个CollectionProxy对象。=>#]>我可以对此调用.each以获得枚举器对象。=>#]:each>我对CollectionProxy如何处理.each感到困惑。我意识到它在某些时候是继承的,但我一直在阅读API文档,他们并没有说得很清楚CollectionProxy是从什么继承的,除非我遗漏了一些明显的东西。Thispage似乎并没有

随机推荐