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 来轻松实现你想要的任何东西。一般来说,您需要考虑查询数据的方式。
我目前正在尝试确定 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 来轻松实现你想要的任何东西。一般来说,您需要考虑查询数据的方式。