1

假设我们有一些包含N文档、每个S字节大小和V视图计数的 couchbase 存储桶。我们需要检索这些文档,包括。它们包含的所有信息。

一种方法:创建一个具有这种地图功能的视图:

function (doc, meta) {
  if (meta.type == "json" && doc.type == "mytype"){
    emit([doc.field1, doc.field2], doc);
  }
}

这个 map 函数将在一个步骤中返回我们需要的所有数据。但另一方面,它会产生大量安静的数据。

另一种方法:创建一个只返回类似文档 ID 的视图(甚至使用 的文档键meta.id):

function (doc, meta) {
  if (meta.type == "json" && doc.type == "mytype"){
    emit([doc.field1, doc.field2], doc.id);
  }
}

然后在客户端得到这个之后,我们需要通过提供的 id 来获取每个文档,例如:

couchbase.getMultiple([key1,key2,...,keyX]) *

* 从哪里keyXdoc.ids。

在这种情况下,我们生成的视图数据量较少,但操作将通过 X+1 个请求完成。

因此,第一种方式加载 couchbase 服务器并为视图消耗大量磁盘空间。第二种方式消耗更少的视图空间,但会加载客户端并向 couchbase 服务器产生更多请求。

所以有一些关于这个的问题:

  1. 这些方式中哪一种更容易接受/经常使用,或者几乎不依赖于它和N价值观?SV
  2. 如果正确的方式取决于N, SV那么这些变量的哪些值(高/中/低)一种方式比其他方式更容易接受?
  3. Couchbase 可以轻松地水平缩放。如果客户端更难扩展,首选第一种方式吗?
  4. 可能有一些测试结果可以比较这两种方式。
4

1 回答 1

2

您使用哪个 SDK 来访问视图?

好的做法通常是避免发出文档 ID,因为它会自动放入视图索引中。

基本规则:

  • 不要发出文档(或过多的值)
  • 不发射密钥

看看: http: //www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views-writing-bestpractice.html

然后,如果您的应用程序需要访问您只需要执行的完整文档(以 Java 为例):

query.setIncludeDocs(true);

在这种情况下,客户端会自动为您执行“获取”以调用服务器并将文档加载到缓存中。(实际上 SDK 正在做一个多获取。

于 2013-04-16T20:05:12.840 回答