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

  • 本文关键字:文档 视图 不应该 CouchDB couchdb
  • 更新时间 :
  • 英文 :


在CouchDB官方文档的"查看排序规则"一章中,第一个示例(http://docs.couchdb.org/en/1.6.1/couchapp/views/collation.html#views-排序规则),建议不建议在视图中发出文档本身,而是建议在请求视图时通过?include_docs=true请求视图来包括文档的主体。

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

emit(doc._id, doc);

并获得以下格式的结果:

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

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

emit(doc._id, null)

然后当使用include_docs参数查询我的视图时,会得到以下格式的结果:

{
    "id": "1",
    "key": "1",
    "value": null,
    "doc": {
        "_id": "1",
        "_rev": "1-0eee81fecb5aa4f51e285c621271ff02",
        "someProp": "someVal"
}

如果有人建议这样做,我认为它的性能会更好,但不幸的是,文档没有详细说明为什么和其他示例通常将文档作为值在emit中发出。有人能对此有更多的了解吗?

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

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

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

最新更新