包装视图是否复制了它们发出的值?

时间:2016-09-01 18:29:09

标签: pouchdb

我已经在pouchdb中使用了一段时间的视图,今天我开始思考它。我不确定我是在做正确的事还是我在浪费空间。

我的应用程序以两种方式请求文档: - 定期查询完整文档,一次一个 - A"列出所有查询"要求所有文件的瘦版本

一个瘦文档是一个文档,其中包含除了一个(文本)之外的所有字段,该文本通常是文档的大男孩。如果它们是单词文档,则瘦文本将包括所有元数据(作者,修改日期,标题...),但不包括文本。

对于第二个查询,我构建了一个视图,它发出除了大文本(文本)之外的所有字段(具有特定结构),然后我只查询该视图。这种方法是正确的还是我浪费空间,因为除文本字段外,所有文档都存储了两次?事实上,我不确定这些字段是存储两次还是仅被编入索引。

如果这种方法不正确,哪一方可能更好?

提前感谢

2 个答案:

答案 0 :(得分:0)

现行经验法则

我认为现行的经验法则是尽可能少地发射并依赖include_docs。由于在客户端上运行的商店数量如此之多,并且实际资源限制和资源限制不同,因此无法说出哪些商店在最重要的场景中表现最佳。但include_docs是更保守的方法,因为所需资源应该或多或少地保持数据库大小,而不是以实际数据库之间的波动,而是以相当不可预测的方式。

推理

相关密钥是不可避免的成本

就进行重要键排序/分组的字段的结构/顺序而言,总是需要复制一些字段来制作collatable key,这些字段不能通过引用与其输入共享因为它有一个新的结构。

发出不必要的密钥和值是可以避免的成本

当重复除了最长字段之外的所有字段以避免底层文档时,我认为这与PouchDb博客的变体很接近:

2. Don't emit(doc.foo, doc)

但是部分文档在低RAM场景中可能是有益的

从好的方面来说,由于你排除了最长的字段,我认为你有可能在某些时候保存一些RAM使用(商店+适配器设置,以避免在内存中加载文件)可能没有引用该JS字符串与已加载的文档共享,因此访问文档可能需要比使用视图的部分副本更多的内存。)

然而,这是不可预测的,RAM通常是次要问题

但在所有商店的所有操作中,我都不会真正依赖它,这可能会最大限度地减少错误的问题(对于浏览器永久存储限制,糟糕/昂贵的网络和/或时间建设的许多用例复制期间的视图可能更明显。)然后还有一个问题,即所有其他复制/序列化字段在打开时不太可能与文档副本共享引用。小字符串周围的元数据在运行时可能比它们的长度更重要。

替代

链接文件

如果我要尝试将大字段分开,我想我会使用linked documents这样做,然后需要一个视图来包含来自当前"单个文档的所有内容"查找,但允许有趣的方法为小/低带宽客户端进行过滤复制等。在该配置中,我认为备用视图设计可以通过发出对存根文档等的替代引用来平滑差异。

但可能不是附件

附件在字段之间创建了一个更柔和的分隔,这些字段仍然将它们置于相同修订字段的监视之下(如果某些字段仅在另一个字段的特定更新的上下文中正确,则这是依赖于链接文档的缺陷。)虽然附件可能会在某些商店中更频繁地留在磁盘上,但它们可能会在其他商店中成为Base64并使该字段成为更大的例外。他们还需要随文档一起旅行,这使得很难用最小复制的休息存储大小做任何有趣的事情等。

PouchDb-找到

Pouchdb-find使索引仅担心每个人的相关密钥,例如今天推荐的include_docs设置,但它允许您请求您的特定字段,这可以节省RAM,具体取决于确切的商店+适配器实现。不幸的是,API尚未在Couchdb兼容数据库中稳定和实施。

答案 1 :(得分:0)

我认为你做得对。您正在做的方式是更简单更快保存RAM 并正确使用CouchDB神奇索引功能。它也是灵活的,因为您可以稍后更改视图功能,并且您可以自动重新计算索引。

我反对将属于一起的文档数据分区到多个CouchDB文档中,正如我在this defense of "monolithic" documents中所解释的那样。简而言之:在一个文档中保存大量数据并从中发出任何需要的东西是CouchDB索引中唯一能够擅长的东西,没有其他数据库可以做到这一点。

当然存在磁盘空间问题,但我认为这应该比RAM更少关注,例如。此外,使用CouchDB视图,就像它们一样强大,只是简单的索引,有点难过。然而,现在应该清楚,这只是一个意见问题(它可能不属于StackOverflow)。

没有提到你必须检查你的具体案例,看看你想要什么和期望什么,没有答案对所有案件都是最好的。