Couch DB - 复杂键和视图冗余

时间:2014-02-28 11:23:18

标签: optimization database-design mapreduce nosql couchdb

试图让这个问题尽可能简单......我正在考虑使用两个(Couch)数据库视图。

第一个签名看起来有点像这样;

{[username, group], value}

我可以查询 - startkey = [用户名]& endkey [用户名,{}]

...

两个视图中的第二个看起来像;

{[group, username], value}

我可以同样查询 - startkey = [group]& endkey [group,{}]

Afaik,我无法使用 - startkey = [{},propertyName]& endkey [{},propertyName] 查询视图 - 这就是为什么我觉得我需要两个视图。但问题是,使用看起来如此相似的键创建两个视图的感觉有多么麻烦。当然,最大的优点是两个视图中的一个将为我提供一个简单,直观的用户名搜索,另一个将对组进行相同的操作。

但是,这两个组都允许我使用reduce函数来识别每个组中的唯一用户名。

TLDR?

我是否可以只使用一个视图来唯一标识每个组中的用户数,或者使用键“组”或“用户名”属性来查询它?

1 个答案:

答案 0 :(得分:0)

不,你不能因为视图底层的B树按照包含从第一个到最后一个的索引的键进行排序,因此不允许通过二级,三级等键进行搜索,除非键在它面前也存在。这与在RDBMS中添加索引类似,因为相同的B树结构是其中的基础。在RDBMS中,查询要使用的索引必须至少包含索引的第一个键。在没有第一个键的情况下执行查询将导致表扫描(假设没有更好的索引存在),而以这种方式“查询”CouchDb视图只会导致无结果。所以CouchDb的视图是显式索引,没有对所有文档进行扫描的后退。

根据我在使用CouchDb时的体验,感觉有一种内在的倾向可以扩散视图,但实际上它只是迫使我们真正考虑搜索,因为没有内置的后备。