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

Memory management NoSQL数据库中最好的文档存储策略是什么?,memory-management,cloud,storage,couchbase,nosql,Memory Management,Cloud,Storage,Couchbase,Nosql,像Couchbase这样的NoSQL数据库确实在内存中保存了大量文档,因此它们的速度非常快,但它也对运行它的服务器的内存大小提出了更高的要求 我正在寻找在NoSQL数据库中存储文档的几种相反策略之间的最佳策略。这些是: 优化速度 将整个信息放在一个(大)文档中的优点是,只需一次GET,就可以从内存或磁盘中检索信息(如果以前从内存中清除过)。对于无模式的NoSQL数据库,这几乎是我们所希望的。但最终文档会变得太大,占用大量内存,能够保存在内存中的文档总数会减少 优化内存 将所有文档拆分为多

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

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

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

  • 优化内存
将所有文档拆分为多个文档(如使用本问题中所述的复合键):特别是当这些文档仅保存特定读取/更新操作中所需的信息时,将允许在内存中保存更多(暂时)文档

我正在查看的用例是来自电信提供商的呼叫详细记录(CDR)。这些CDR通常每天都会达到数亿条。然而,其中许多客户在给定的每一天都不会提供一条记录(我正在查看以预付费为主、数据饱和程度更低的东南亚市场)。这意味着通常大量文档每隔一天进行一次读取/更新,只有一小部分文档每天有几个读取/更新周期

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

<> P>是否有其他人被这个问题所挑战,你的解决方案是什么?从你的POV和为什么会是最好的策略?显然这是两个策略的中间部分,只有一个文档或者一个大文档分成几百个文档不能成为IM.O/P>的理想解决方案。 编辑2014-9-14 好的,虽然这接近于回答我自己的问题,但目前还没有提供任何解决方案,下面的评论是我现在计划如何组织数据的更多背景信息,试图在速度和内存消耗之间找到一个最佳点:

手机号码:个人资料

  • 它保存表中的配置文件信息,而不是直接从CDR中获取。此处输入的数据较少,如年龄、性别和姓名。该键是由手机号码(MSISDN)和单词profile组成的复合键,以“:”分隔
流动电话号码:收入

  • 它保存瞬时信息,如使用计数器和累积客户花费的总收入的变量。该键也是一个复合键,由手机号码(MSISDN)和单词revenue组成,用“:”分隔
手机号码:Optin

  • 它保存有关客户何时选择加入该计划以及何时再次选择退出该计划的半暂时信息。这可能会发生多次,并通过数组进行处理。该键也是一个复合键,由手机号码(MSISDN)和单词optin组成,以“:”分隔
连接标识

  • 它保存有关通过语音或视频通话或SMS/MMS完成的特定a/B连接(发送方/接收方)的信息。该密钥由两个串联的手机号码组成
在对文档结构进行这些更改之前,我将所有配置文件、收入和optin信息放在一个大文档中,始终将连接id作为一个单独的文档保存。当我将主文档拆分为多个文档时,这种新的文档存储策略有望在速度和内存消耗之间达成更好的折衷这样,每个应用程序都只有在应用程序的单个步骤中读取/更新的重要信息


这还考虑到随着时间的推移,随着一些数据非常短暂,变化率也会有所不同(例如计数器和随着每个CDR的到来而更新的累积收入字段)配置文件信息基本不变。我希望这能更好地理解我想要实现的目标,欢迎评论和反馈。

感谢您更新您的原始问题。当您谈到在粗粒度文档和细粒度文档之间找到适当的平衡时,您是对的

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

  • 识别应用程序/服务的所有文档消耗用例。(读、读、写、可搜索项目)
  • 设计您的文档(最有可能的结果是,您将得到几个较小的文档,而不是一个拥有所有内容的大文档)
  • 为不同的文档类型设计可以共存于一个bucket中的文档键(例如,在键值中使用名称空间)
  • 根据您的用例对生成的模型进行“干运行”,以查看您是否有对noSQL和所有应用程序的最佳(读/写)事务