CouchDB中的多个连接

时间:2016-05-27 15:18:52

标签: join couchdb nosql

我目前正在试图弄清楚CouchDB是否适合我的用例,如果适用,如何。我的情况类似于以下情况:

第一组文件(让他们称之为公司):

{
    "_id" : 1,
    "name" : "Foo"
}

{
    "_id" : 2,
    "name" : "Bar"
}

{
    "_id" : 3,
    "name" : "Baz"
}

第二组文件(让他们称之为项目):

{
    "_id" : 4,
    "name" : "FooProject1",
    "company" : 1
}

{
    "_id" : 5,
    "name" : "FooProject2",
    "company" : 1
}
...
{
    "_id" : 100,
    "name" : "BazProject2",
    "company" : 3
}    

第三组文件(让他们称之为事件):

{
   "_id" : "300",
   "project" : 4,
   "description" : "...",
   "cost" : 200
}

{
   "_id" : "301",
   "project" : 4,
   "description" : "...",
   "cost" : 400
}

{
   "_id" : "302",
   "project" : 4,
   "description" : "...",
   "cost" : 500
}
   ...

因此,简而言之,每家公司都有多个项目,每个项目都可能有多个事件。我对数据建模的一个原因是,我主要来自SQL背景,因此建模可能完全不合适。第二个原因是,我想通过使用couchdb提供的REST-API非常容易地添加新事件。所以事件必须是单个文件。

但是,我现在希望获得一个可以让我计算每家公司的总成本的视图。我可以使用map-reduce和链接文档轻松定义视图,这样可以获得每个项目的总金额。但是,一旦我在项目层面,我无法进一步达到公司的水平。

这是否可以使用couchDb?这种总结数据听起来像map-reduce的完美用例。在SQL中我只会做一个三表连接,但似乎在couchDb中我能得到的最好的是两表连接。

1 个答案:

答案 0 :(得分:2)

如上所述,你不能在CouchDb中加入,但这不是一个限制,这是一个邀请你去思考你的问题并以不同的方式处理它们。在CouchDb中执行此操作的正确方法是定义数据结构,例如:IncidentReference由以下组成:

  • 项目ID
  • 公司名称

这样你的数据就像:

{
   "_id" : "301",
   "project" : 4,
   "description" : "...",
   "cost" : 400,
   "reference" : {
         "projectId" : 1,
         "companyId" : 2
   }
}

这很好。一旦你拥有了它,你可以使用Map / Reduce来轻松实现你想要的任何东西。一般来说,您需要考虑查询数据的方式。