Join 如何使用2个或更多SQL联接进行查询

Join 如何使用2个或更多SQL联接进行查询,join,nosql,couchdb,field,relationship,Join,Nosql,Couchdb,Field,Relationship,我的CouchDB数据库有3种类型的数据:A、B、C A的“b”属性是A b的ID和名称 B的“c”属性是c的ID和名称 C有一个名字 例如: { _id:"a1", type:"A", name:"aaaaa", b:"b1" } { _id:"b1", type:"B", name:"bbbbb", c:"c1" } { _id:"c1", type:"C", name:"ccccc" } 我希望在一个视图中查询所有As,并检索其B和B的C的名称,例如,我希望限制结果仅获取C的名称为cc的

我的CouchDB数据库有3种类型的数据:A、B、C

A的“b”属性是A b的ID和名称 B的“c”属性是c的ID和名称 C有一个名字 例如:

{ _id:"a1", type:"A", name:"aaaaa", b:"b1" }
{ _id:"b1", type:"B", name:"bbbbb", c:"c1" }
{ _id:"c1", type:"C", name:"ccccc" }
我希望在一个视图中查询所有As,并检索其B和B的C的名称,例如,我希望限制结果仅获取C的名称为cc的As

我怎样才能做到这一点

如果只得到A和B,答案是:

map: function (doc) {
  if (doc.type == "A") {
    emit([doc._id,0])
    emit([doc._id,1], { _id: A.b })
  }
}
但我不知道如何延伸到第二段关系

我对答案也很感兴趣,比如我们有一个“D”类,还有一个“E”类等等,它们有更多的嵌套关系


非常感谢

一般来说,在CouchDB中,只能遍历一层深度的图形。如果需要更多级别,使用专门的图形数据库可能是更好的方法

有几种方法可以在CouchDB中实现您想要的,但是您必须根据用例对文档进行建模

如果您的C类型大部分是静态的,那么可以将名称嵌入文档本身。无论何时修改C文档,只需批量更新引用此C的所有文档。 在许多情况下,甚至不需要C类型的文档或从B到C的引用。例如,如果C是标记文档,您可以只在B文档中存储字符串数组。 如果需要A中的C,还可以将对C的引用存储在A中,最好与缓存在A中的C的名称一起,这样,如果C已被删除,则可以使用缓存的值。 如果其中一种文档类型只有几个实例,也可以直接嵌入它们。根据用例的不同,您可以将B嵌入到A中,也可以将所有内容作为数组嵌入到B中,甚至可以将所有内容放入一个文档中。 对于CouchDB,考虑文档更新的频率和分布,而不是规范化数据是最有意义的

这种思维方式与使用SQL数据库的方式大不相同,但在web上典型的以读取为主的场景中,与昂贵的读取查询相比,对独立实体等文档进行建模是一种更好的权衡

当我为CouchDB文档建模时,我总是将其视为护照或商务信函。它是一个单一的实体,持有有效、正确和完整的信息,但不能严格保证我仍然和护照上的一样高,我看起来和照片上的一模一样,我没有改变我的名字,或者我的地址与商业信函上的地址不同


如果您提供了更多关于您实际想用一些示例做什么的信息,我将很高兴地进一步阐述

对于基本的一对多关系,可以使用查看和发出外来文档。否则,您必须聚合文档以切断关系,或者将请求拆分为多个查询