什么更好/更快的复杂couchbase ID或内联文档类型=“my_document_type”

时间:2013-06-03 18:44:42

标签: nosql mapreduce couchdb couchbase

我当前的ID密钥包含3个或4个细分:

namespace::my_key::id
namespace::my_key::my_second_key::id

解决方案1。 使用复杂的id并通过在id中搜索密钥来创建视图

function (doc, meta) {

  if(meta.id.indexOf("::my_key::") !== -1){
    emit([doc.source_id], [doc.name,doc.title,doc.ui]);
  }


}

解决方案2。 对于每个文档,添加“type”,“namespace”等字段 并使用它们创建视图

function (doc, meta) {

  if(doc.type=='my_key'){
    emit([doc.source_id], [doc.name,doc.title,doc.ui]);
  }


}

如果我选择解决方案2, 我必须在我的应用程序上维护id,我可能会像在解决方案1中那样。

有没有人有过命名id和从中创建视图的经验? 你对这些解决方案有什么问题。 或者也许不建议使用indexOf()函数?

2 个答案:

答案 0 :(得分:4)

Couchbase在后台构建视图索引,因此如果您不使用stale=false参数,则在两种解决方案中从视图获取文档时都会获得相同的性能。

在第一个解决方案中,您可能会获得比第二个解决方案更长的密钥,因为在2解决方案中,您可以在doc中输入类型,而不是meta。 Couchbase将所有元数据保存在记忆中,因此您拥有更长的密钥,需要更多内存。另外indexOf=====慢,因此构建索引可能需要更长时间。

对我而言,第二种解决方案更好。

此外,您只需在客户端库中发出emit(doc.source_id, null)并使用IncludeDocs即可提高视图的磁盘使用率。它会减小它们的尺寸,几乎不会影响性能。

这里也是“最佳实践”的link。也许它也会有所帮助。

答案 1 :(得分:1)

我正在使用你的解决方案1.

在我的情况下(社交游戏后端服务器),键名表示存储的数据类型,例如“player:{zone_id}:{uid}”,“playerchar:{zone_id}:{player_uid}:{char_id} “所以我没有在文档中添加类型字段,因为应用程序知道它想要什么,从不需要来自值内容的信息进行反射。

关于性能/速度,抱歉我无法提供任何建议,我不需要查看查询数据,我创建的所有视图仅适用于开发和放大备份环境,数据分析和stats作业与其他系统不在Couchbase上运行。