NoSQL 数据库中最好的文档存储策略是什么?

2023-12-01

像 Couchbase 这样的 NoSQL 数据库确实在内存中保存了大量文档,因此速度很快,但也对其运行的服务器的内存大小提出了更高的要求。

我正在寻找在 NoSQL 数据库中存储文档的几种相反策略之间的最佳策略。这些都是:

  • 优化速度

将整个信息放入一个(大)文档中的优点是,通过一次 GET 即可从内存或磁盘中检索信息(如果之前已从内存中清除)。对于无模式 NoSQL 数据库,这几乎是我们所希望的。但最终文档会变得太大并占用大量内存,总共能够保存在内存中的文档会减少

  • 优化内存

将所有文档拆分为多个文档(例如,使用复合键,如本问题中所述:为面向文档的数据库设计记录键 - 最佳实践特别是当这些文档仅保存特定读取/更新操作所需的信息时,将允许在内存中保存更多(临时)文档。

我正在查看的用例是来自电信提供商的呼叫详细记录 (CDR)。这些 CDR 通常每天都会达到数亿个。然而,这些客户中的许多人并没有在每一天提供单一记录(我正在研究预付费占主导地位且数据饱和度较低的东南亚市场)。这意味着通常大量文档可能每隔一天进行一次读取/更新,只有一小部分文档每天有几次读取/更新周期。

向我建议的一种解决方案是构建 2 个存储桶,将更多 RAM 分配给更临时的存储桶,将更少的 RAM 分配给保存较大文档的第二个存储桶。这将允许更快地访问更瞬态的数据,并更慢地访问更大的文档,例如保存根本不改变的配置文件/用户信息。不过,我确实看到了这个提议的两个缺点,一是你无法跨两个存储桶构建视图(Map/Reduce)(这是专门针对 Couchbase 的,其他 NoSQL 解决方案可能允许这样做),第二个会带来更多开销随着用户群的增长,密切管理两个存储桶的内存分配之间的平衡。

还有其他人受到过这个挑战吗?您对此问题的解决方案是什么?从您的角度来看,最好的策略是什么?为什么?显然,这最可能是两种策略的中间部分,在我看来,只有一个文档或将一个大文档分成数百个文档并不是理想的解决方案。

编辑2014-9-14 好吧,虽然这接近回答我自己的问题,但到目前为止还没有任何提供的解决方案,下面的评论是我现在计划如何组织数据的更多背景知识,试图在速度和内存消耗之间实现最佳平衡点:

手机号码:个人资料

  • 它保存来自表的配置文件信息,而不是直接来自 CDR。这里输入的数据较少,例如年龄、性别和姓名。该密钥是由手机号码(MSISDN)和单词配置文件组成的复合密钥,以“:”分隔

手机号码:收入

  • 它保存瞬时信息,例如使用计数器和累积客户支出总收入的变量。该密钥又是一个复合密钥,由移动号码 (MSISDN) 和单词 Revenue 组成,并用“:”分隔。

手机号码:选择

  • 这保存了有关客户何时选择加入该计划以及何时再次选择退出该计划的半临时信息。这可能会发生多次,并通过数组进行处理。该密钥又是一个复合密钥,由移动号码 (MSISDN) 和单词 optin 组成,并用“:”分隔

连接 ID

  • 它保存有关通过语音或视频通话或 SMS/MMS 完成的特定 A/B 连接(发送者/接收者)的信息。密钥由连接的两个 mobile_no 组成。

在文档结构发生这些变化之前,我将所有配置文件、收入和 optin 信息放入一个大文档中,始终将 connection_id 保留为单独的文档。这种新的文档存储策略有望在速度和内存消耗之间实现更好的折衷,因为我将主文档拆分为多个文档,以便每个文档仅包含在应用程序的单个步骤中读取/更新的重要信息。

这还考虑到了随着时间的推移而发生的不同变化率,其中一些数据非常短暂(例如随着每个 CDR 的到来而更新的计数器和累积收入字段),并且配置文件信息几乎没有变化。我确实希望这能让大家更好地理解我想要实现的目标,非常欢迎评论和反馈。


感谢您更新原来的问题。当您谈论在粗粒度文档与细粒度文档之间找到适当的平衡时,您是正确的。

文档的最终架构实际上属于您特定业务领域的需求。您必须在用例中识别出作为整体所需的数据“块”,然后以此为基础存储文档的形状。 以下是设计文档结构时需要执行的一些高级步骤:

  1. 确定您的应用程序/服务的所有文档消费用例。 (读取、读写、可搜索项目)
  2. 设计您的文档(很可能您最终会得到几个较小的文档,而不是一个包含所有内容的大文档)
  3. 设计可以针对不同文档类型共存于一个存储桶中的文档键(例如,在键值中使用命名空间)
  4. 针对您的用例对生成的模型进行“试运行”,以查看您对 noSQL 和所有事务是否具有最佳(读/写)事务 交易中所需的文档数据。
  5. 为您的用例运行性能测试(尝试模拟至少高 2 倍的预期负载)

Note:当您设计不同的文档时,可以有某种冗余(记住它不是具有规范化形式的 RDBMS),可以将其更多地视为面向对象设计。

Note2:如果您有键之外的可搜索项目(例如,按姓氏“开头为”和一些其他动态搜索条件搜索客户),请考虑使用 ElasticSearch 与 CB 集成,或者您也可以尝试 CB3.0 附带的 N1QL 查询语言。

通过拆分成几个较小的文档(所有文档均由 MSISDN 链接),您似乎朝着正确的方向前进,例如:MSISDN:profile、MSISDN:revenue、MSISDN:optin。我会特别注意您最后一个文档类型“A/B”连接。听起来它可能会生成大量文件,而且本质上是短暂的……因此您必须弄清楚这些文档必须在 Couchbase 存储桶中保存多长时间。您可以指定 TTL(生存时间),以便自动清除旧文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NoSQL 数据库中最好的文档存储策略是什么? 的相关文章

随机推荐

  • IntelliJ:将 jar 包含在 jar 工件中

    使用 IntelliJ 9 0 2 Community Edition 在 Mac 上进行开发 我有一个程序依赖于两个库罐子 我已经弄清楚如何让 IntelliJ 为我的源代码制作一个 jar 使用 Artifact 选项卡 甚至将两个 j
  • 如何重写此查询以避免错误:您无法在 FROM 子句中指定用于更新的目标表

    update websites set master 2 where url select url from websites where id 12 显然 mysql 不允许您对正在更新的表运行选择查询 将其放入派生表中 这会具体化为临时
  • 接口没有构造函数,那么如何继承呢?

    据我所知 子类构造函数通过使用调用超类构造函数super 但既然接口没有构造函数 那么如何实现继承呢 但是由于接口没有任何构造函数 如何进行继承 很简单 接口不能有任何实例字段 因此无需构造任何内容 您无法将代码放置在接口中 至少在 Jav
  • Chrome 内容脚本未在 about:blank 页面中加载

    我正在开发一个 Chrome 扩展 它将根据以下清单加载内容脚本 content scripts matches
  • EWS 管理:获取预约的必需和可选与会者

    就我现在而言 我知道如何从交换服务器获取约会 但是一旦我想查看必填和可选的与会者 这些字段都是空的 我检查了约会三次 有一个与会者 除了我 我是否必须以不同的方式配置 Outlook 或者我是否遗漏了某些内容 List
  • python - 在 memmap 和 CPU 中工作时进行快速矩阵乘法和归约的方法

    您好 我在进行快速矩阵乘法 加法 function overwrite 和轴缩减求和以及在没有 RAM 的 CPU 上使用 numpy memmaps 时遇到问题 我认为 仅当使用 numexpr 时 我才有可能避免从点创建数组 For e
  • Go中如何获取本地IP地址?

    我想获取计算机的IP地址 我使用了下面的代码 但它返回127 0 0 1 我想获取IP地址 例如10 32 10 111 而不是环回地址 name err os Hostname if err nil fmt Printf Oops v n
  • 如何使用 Node 正确地从 mysql 返回结果?

    在代码中 var stuff i want stuff i want get info parm 以及函数 get info get info data var sql SELECT a from b where info data con
  • 如何在zxing中触发批量模式扫描

    我读到有一个可以在 zxing 中启用批量模式扫描的键 我可以知道如何在 Android 应用程序中启用此键吗 我目前正在使用这样的代码来单独扫描条形码 Intent intent new Intent com google zxing c
  • 将类附加到 jQuery 对象

    我正在努力解决如何最好地结合 javascript 类和 jQuery 插件 这个问题不是很具体 我希望的是指向更多资源的指针 基本上 我想将状态数据和私有方法存储在一个类中 然后扩展我调用插件的每个 jQuery 对象以拥有这些私有方法和
  • ReactJS 和 jQuery 是互斥的吗?

    我是 ReactJS 的新手 ReactJS 似乎完全接管了渲染 DOM 节点的责任 并且不期望任何其他干扰 甚至是 jQuery 它带来了一个事实 即许多方便的 jQuery 插件无法在 React 中使用 其中一些插件已经实现了等效的
  • Angular.js、iframe 和 Firefox

    我有一种感觉 我错过了一些明显的东西 但我无法使 iframe 在 Firefox 中使用 Angular js 路由工作 这是一个示例 plunker 代码 The index html文件包含ng view哪个加载main html d
  • Matplotlib 轴标签将科学指数移动到同一行

    我目前正在制作一个 x 轴范围从 0 到 1 3e7 的图 我将其绘制如下 plt errorbar num vertices sampled ave path average yerr sampled ave path stdev fmt
  • 模板别名范围

    As per http en cppreference com w cpp language type alias 别名是块级声明 它没有说任何关于模板别名的特殊信息 因此应该理解模板别名也是块级声明 但是 不可能在块级别使用模板别名 根据
  • jQuery 获取所选选项值(不是文本,而是属性“value”)

    好的 我有这个代码
  • Django 过滤器排除外键

    我正在创建一个新闻网站 有两种模型 News 最佳新闻 BestNews有一个外键News News代表所有新闻 BestNews代表推荐新闻 现在我已经在index html中渲染了新闻列表和最佳新闻列表 但这两个部分中的一些新闻是重复的
  • 严格标准:只有变量应该通过引用传递

    我的 PHP 脚本显示错误 Strict Standards Only variables should be passed by reference in C php on line 551 代码如下 function trinity p
  • 使用美国县级数据创建 Choropleth 地图

    我正在尝试使用 R 制作有关 COVID 19 感染的县级数据的分区统计图 我对 R 来说是一个相对新手 所以 我已经用 ggmap 做了一些相当基本的事情来绘制空间数据 但从来没有做过这样的事情 通常 我只是需要将兴趣点叠加在地图上 因此
  • C:用数字 0 到 n -1 索引 pthread

    我有一套n需要编号为 0 到n 1 这不行 include
  • NoSQL 数据库中最好的文档存储策略是什么?

    像 Couchbase 这样的 NoSQL 数据库确实在内存中保存了大量文档 因此速度很快 但也对其运行的服务器的内存大小提出了更高的要求 我正在寻找在 NoSQL 数据库中存储文档的几种相反策略之间的最佳策略 这些都是 优化速度 将整个信