CouchDB 中的多个连接

Multiple Joins In CouchDB

我目前正在尝试确定 CouchDB 是否适用于我的用例table,如果适用,如何适用。我遇到类似下面的情况:

第一组文件(姑且称之为公司):

{
    "_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 背景,因此建模可能完全不合适table。第二个原因是,我想通过使用 couchdb 提供的 REST-API 非常轻松地添加新事件。所以事件必须是单个文档。

但是,我现在想要获得一个视图,使我能够计算每家公司的总成本。我可以使用 map-reduce 和链接文档轻松定义一个视图,这让我得到了每个项目的总金额。但是,一旦我处于项目级别,我就无法进一步达到公司级别。

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

如前所述,您不能在 CouchDb 中进行联接,但这不是限制,这是一种邀请,让您思考您的问题并以不同的方式处理它们。在 CouchDb 中执行此操作的正确方法是定义数据结构,例如:IncidentReference 由 :

组成
  • 项目编号
  • 以及公司编号

这样您的数据将如下所示:

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

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