我目前正在试图弄清楚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中我能得到的最好的是两表连接。
答案 0 :(得分:2)
如上所述,你不能在CouchDb中加入,但这不是一个限制,这是一个邀请你去思考你的问题并以不同的方式处理它们。在CouchDb中执行此操作的正确方法是定义数据结构,例如:IncidentReference
由以下组成:
这样你的数据就像:
{
"_id" : "301",
"project" : 4,
"description" : "...",
"cost" : 400,
"reference" : {
"projectId" : 1,
"companyId" : 2
}
}
这很好。一旦你拥有了它,你可以使用Map / Reduce来轻松实现你想要的任何东西。一般来说,您需要考虑查询数据的方式。