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

时间:2018-01-06 10:34:48

标签: join nosql couchdb field relationship

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

  • A有一个' b'属性是B的ID,名称
  • B有一个' c' attribute是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的名称(例如,我想限制结果只获得As其中C的名字是" cc")。

我怎样才能实现这个目标?

(只获得A和B,答案是:

map: function (doc) {
  if (doc.type == "A") {
    emit([doc._id,0])
    emit([doc._id,1], { _id: A.b })
  }
}

但我不知道延伸到第二关系)

如果我们有一个' D'我也对答案感兴趣。上课,' E'具有更多嵌套关系的类等。

非常感谢!

1 个答案:

答案 0 :(得分:1)

以通用的方式,在CouchDB中,它只能遍历一个深度的图形。如果您需要更多级别,使用专门的图形数据库可能是更好的方法。

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

  • 如果你的" C" type主要是静态的,你可以在文档中嵌入名称。无论何时修改C文档,只需批量更新引用此C的所有文档。
  • 在许多情况下,甚至不需要具有C类型文档或从B到C的引用。例如,如果C是标签文档,则可以在B文档中存储字符串数组
  • 如果您需要来自A的C,您还可以在A中存储对C的引用,最好附带A中缓存的C的名称,这样如果C已被删除,您可以使用缓存的值。
  • 如果其中一种文档类型只有少数几个实例,您也可以直接嵌入它们。根据用例,您可以在B中嵌入B,您可以将所有As嵌入B中的数组中,或者甚至可以将所有内容都放在一个文档中。

使用CouchDB,最有必要考虑文档更新的频率和分布,而不是规范化数据。

这种思维方式与您使用SQL数据库的方式完全不同,但在我们在网络上的典型读取方案中,与独立模型文档等昂贵的读取查询相比,它是更好的权衡。实体。

当我为CouchDB文档建模时,我总是将其视为护照或商业信函。它是一个拥有有效,正确和完整信息的单一实体,但我并没有严格保证我仍然像护照一样高,我看起来和图片完全一样,我没有&#39改变了我的名字,或者我的地址不同于商业信函上所说的地址。

如果你提供更多关于你真正想要做些什么的例子的信息,我将很乐意进一步阐述!