2012-03-16 86 views
2

所以我已经阅读了关于在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"] 
} 

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

+0

帮助我,理解你的问题..更经常的是什么?链接或凡是? ups ...同时你改变了问题... – okurow 2012-03-16 17:00:49

回答

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"]查询它,并获得所有发送者的列表,以查看任何给定值或值。

对于每个链接的文档,你有一个值来检查。因此,查询两者(或者一次一个,或同时,这是相当容易的Javascript例如):

  1. 与选项?key=["from","A"]
  2. 而且还认为视图与?key=["to","B"]

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

你会发现,因为你可能只有 CouchDB的(索引扫描)做出有效的请求,CouchDB的支持请求非常高的速率和高并发连接数。

这很简单吗?在Javascript中,它并没有那么糟糕,但是没有,基本上这并不容易。这个问题从根本上削减了CouchDB谷物和关系谷物。(我对Drizzle对这样的问题感到非常兴奋。)

+1

感谢您的回复,确实沙发已经给我带来了很多,我愿意为此付出更多的努力。你所描述的解决方案接近我最终实施的方案。但是,在这里或那里阅读各种博客,我确实已经掌握了将所有内容都放在一个请求/视图/列表中的可能性。 – 2012-03-17 13:32:46