为什么不应在视图中发出CouchDB文档建议文档?

时间:2016-03-24 21:43:14

标签: couchdb

在第一个示例(http://docs.couchdb.org/en/1.6.1/couchapp/views/collation.html#views-collation)下的CouchDB官方文档的View Collat​​ion一章中,建议不要在视图中自己发出文档,而是建议包含通过row_cache_size_in_mb请求视图时请求视图的文档正文。

如果我理解正确,而不是:

?include_docs=true

以下列格式获得结果:

emit(doc._id, doc);

建议发送具有空值的发射:

{"id":"1","key":"1","value":{"_id": "1", "someProp": "someVal"}},

然后在使用include_docs参数查询我的视图时获取以下格式的结果:

emit(doc._id, null)

如果有人建议,那么我认为其性能会更好,但不幸的是文档没有详细说明为什么和其他示例通常将文档作为值发布。任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:6)

当您在视图中emit整个文档时,您实际上是在磁盘上复制文档。这是因为每个视图都有自己的文件,其中包含在数据库上运行视图的结果。因此,如果您有3个输出文档的视图,则会有4个副本浮动。 (不包括多个文件修订版,当然会增加更多重复文件)

CouchDB非常自由地使用磁盘空间,以便使写入更快,主要是因为他们选择使用仅附加结构。因此,使用视图重复输出同一文档可能会导致磁盘使用量快速增长。 (压缩你的数据库和视图通常会有所帮助,但它不应该是你想要强迫自己进入的东西)

离开文档的权衡是,当您从视图中读取时,CouchDB将需要在内部查找文档并将其包含在视图的输出中。因为它是基于id查找的,所以它是一个非常快速的操作,但它仍然会产生开销。因此,虽然这种模式通常是最佳实践,但您应该愿意在应用程序的上下文中检查权衡。