couchdb很多很头疼

时间:2012-03-16 15:51:12

标签: couchdb

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

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

{name:"whatever1", from:"A"}
{name:"whatever2", from:"A"}
{name:"whatever3", to:"B"}
{name:"whatever4", to:"C"}

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

{name:"link1", link: true, from: "A", to: "B"}
{name:"link2", link: true, from: "A", to: "C"}

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

{ name: "link1",
  froms: ["whatever1", "whatever2"],
  tos: ["whatever3"]
}

有人知道如何编写这样的地图,我应该更改文档的结构吗?如果您只想链接指南,请不要发帖。

1 个答案:

答案 0 :(得分:5)

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

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

您的困难恰恰是您必须为CouchDB支付其他功能所需的成本:HTTP API,灵活的群集,多主机或离线操作等。根据设计,其同步功能是可行的,因为documents are simple, and unrelated to each other

然而,CouchDB的另一个优势是并发性。因此,如果您已经享受CouchDB的其他功能,并且您只需要克服这一个驼峰,那么您可能只是在客户端“加入”。

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

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

  1. 带有选项?key=["from","A"]
  2. 的视图
  3. 以及?key=["to","B"]
  4. 的视图

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

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

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