专栏首页MongoDB中文社区使用模式构建:子集模式

使用模式构建:子集模式

在MongoDB中文社区学习更多关于MongoDB的知识和技能

在多年前,第一代PC拥有高达256KB的RAM和两个5.25英寸的软盘驱动器。没有硬盘,因为在当时它们极为昂贵。这些限制导致在处理大量(对那时来说)数据时由于内存不足,必须在物理上交换软盘。如果当时有办法只把我经常使用的数据(如同整体数据的一个子集)放入内存就好了。

现代应用程序也无法幸免于资源消耗的影响。MongoDB将频繁访问的数据(称为工作集)保存在RAM中。当数据和索引的工作集超过分配的物理RAM时,随着磁盘访问的发生以及数据从RAM中转出,性能会开始下降。

我们如何解决这个问题?首先,我们可以向服务器添加更多的RAM,不过也就只能扩展这么多。我们也可以考虑对集合进行分片,但这会带来额外的成本和复杂性,而我们的应用程序可能还没有准备好来应对这些。另一种选择是减小工作集的大小,这就是我们可以利用子集模式的地方。

子集模式

此模式用来解决工作集超出RAM,从而导致信息从内存中被删除的问题。这通常是由拥有大量数据的大型文档引起的,这些数据实际上并没有被应用程序使用。我这么说到底是什么意思呢?

假设一个电子商务网站有一个产品评论列表。当访问该产品的数据时,我们很可能只需要最近10个左右的评论。将整个产品数据与所有评论一起读入,很容易导致工作集的膨胀。

相比于将所有的评论与产品存储在一起,我们可以将其分为两个集合。一个集合具有最常用的数据,例如当前的评论;另一个集合具有不太常用的数据,例如旧的评论、产品历史记录等。我们可以复制在一对多或多对多关系中最常用的那部分数据。

在Product集合中,我们只保留最近十次的评论。这允许通过只引入整体数据的一部分或子集来减少工作集。附加信息(本例中的reviews)存储在单独的Reviews集合中,如果用户希望查看更多的评论,则可以访问该集合。在考虑将数据拆分到何处时,文档中使用最多的部分应放入“主”集合,而使用频率较低的数据应放入另一个集合。对于我们例子中的评论,这个分割点可能是产品页面上可见的评论数。

应用场景示例

当我们的文档拥有大量数据而其并不常用时,子集模式就非常有用。产品评论、文章评论、电影中的演员信息都是这个模式的应用场景案例。每当文档大小对工作集的大小产生压力并导致工作集超过计算机的RAM容量时,子集模式便成为一个可以考虑的选项。

结论

通过使用包含有频繁访问数据的较小文档,我们减少了工作集的总体大小。这使得应用程序所需要的最常用信息的磁盘访问时间更短。在使用子集模式时必须做的一个权衡是,我们必须管理子集,而且如果我们需要引入更旧的评论或所有信息,则需要额外的数据库访问才能做到这一点。

本文分享自微信公众号 - Mongoing中文社区(mongoing-mongoing)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MongoDB 4.2 亮点功能之——按需式物化视图

    基于聚合的创建集合听起来就像是$out,它是聚合框架中的一个执行阶段,从很早的MongoDB 2.6就有了。$out阶段可以获取聚合结果,将其放到新的集合中,并...

    MongoDB中文社区
  • 使用insert () 在MongoDB中插入数组

    “insert”命令也可以一次将多个文档插入到集合中。下面我们操作如何一次插入多个文档。

    MongoDB中文社区
  • MongoDB部署检查列表建议

    MongoDB Manual (Version 4.2)> Administration

    MongoDB中文社区
  • centos6.9安装npm环境

    洗尽了浮华
  • 移动行业2014年第一季度数据报告

    腾讯大数据发布移动行业2014年第一季度数据报告 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    腾讯大数据
  • 【笔记】《人月神话》——从"削足适履"到"另外一面"

    这是最近看《人月神话》时中途记录的一些笔记,稍稍改变下计划,这个是9-15章节的笔记,这样后面的银弹和记录能记录得比较连贯些。

    ZifengHuang
  • 群晖NAS搭建测速网站,支持万兆

    开源项目链接:https://github.com/XGHeaven/homebox

    zeruns
  • PTA刷题记录:L1-063 吃鱼还是吃肉 (10分)

    题目要求: 国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。

    英雄爱吃土豆片
  • Python运算符可不只有加减乘除

    数学里面的加减乘除,就是运算符,但是 Python 的运算符更多样,更复杂,分为算术运算符、比较运算符、赋值运算符、位运算符、逻辑运算符、成员运算符、身份运算符...

    dongfanger
  • Java 开发如何高效正确管理 IDEA?

    作者:穿越人海zx 链接:www.jianshu.com/p/35f48022a00b

    Java技术栈

扫码关注云+社区

领取腾讯云代金券