couchdb很多很头疼

plu*_*us- 2 couchdb

所以我已经阅读了关于在couchdb上翻译关系的内容,但我仍然无法想出一个合适的地图函数来表示多对多.

想象一下你有一些文档(注意这是一个例子,而不是实际的模型):

{name:"whatever1", from:"A"}
{name:"whatever2", from:"A"}
{name:"whatever3", to:"B"}
{name:"whatever4", to:"C"}
Run Code Online (Sandbox Code Playgroud)

以及定义关系的其他一些类型的文档:

{name:"link1", link: true, from: "A", to: "B"}
{name:"link2", link: true, from: "A", to: "C"}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用正确的函数来返回组合列表:

{ name: "link1",
  froms: ["whatever1", "whatever2"],
  tos: ["whatever3"]
}
Run Code Online (Sandbox Code Playgroud)

有谁知道如何这样的地图,我应该改变我的文档结构吗?如果您只想链接指南,请不要发布.

Jas*_*ith 6

一般来说,CouchDB库存中根本不可能存在多对多.你看起来像是一个只想直接没有糖衣的人,所以就是这样.

加入相关数据不是CouchDB的优势,当然它是关系数据库的主要优势.然而,这个事实有点混乱,因为大多数人"直观地"对他们的数据进行关系建模,因为这就是我们所有人的训练方式.

您的困难恰恰是您必须为CouchDB获得其他功能所需的成本:HTTP API,灵活集群,多主机或离线操作等.通过设计,其同步功能是可行的,因为文档很简单,并且与每个功能无关其他.

但是,CouchDB的另一个优势是并发性.因此,如果您已经享受了CouchDB的其他功能,并且您只需要克服这一个驼峰,您可能只是在客户端"加入".

更简单的map函数只会发出所有froms(key:["from", "A"], value:"whatever1")和tos(key:["to","B"], value:"whatever3").因此,您可以查询它?key=["from","A"]并获取任何给定的值或值的所有whatever的列表.

对于每个链接文档,您都有要检查的fromto值.因此,查询两者(一次一个,或同时,这在Javascript中非常容易):

  1. 带选项的视图 ?key=["from","A"]
  2. 而且还有观点 ?key=["to","B"]

一旦两个结果都返回,您就可以得到该链接的答案.

您会发现,由于您只能从CouchDB(索引扫描)发出有效请求,因此CouchDB可以支持非常高的请求率和大量并发连接.

这很容易吗?在Javascript中,它并不是那么糟糕,但不是,基本上它并不容易.这个问题从根本上削弱了CouchDB的粒度和关系粒度.(对于像这样的问题,我个人对Drizzle感到兴奋.)