我有一个CouchDB数据库(我们会说它包含项目时间卡相关数据:项目代码,人员,人员职位,任务,日期,工作时间,账单费率等)。我希望按日...或按人,或按任务,按标题或任何单一属性创建项目的摘要视图。
我担心我会走上一条不可持续的道路,而且我的数据库大小可能会远远超过它所需的范围。
我创建了一个带有map函数的视图,该函数多次发出每个文档,每个属性一次。这样可行。但这是否会达到你应该停止的终点?
我有多个发射:
emit([doc.project, 'day', doc.day], doc);
emit([doc.project, 'month', doc.month], doc);
emit([doc.project, 'person', doc.person], doc);
emit([doc.project, 'job title', doc.persons-job-title], doc);
emit([doc.project, 'task', doc.task], doc);
然后始终使用[project,]的开始/结束键查询[project ,, {}]
我的数据库最终会变得如此巨大,以至于添加任何新数据会非常昂贵吗?多发射()是做我想做的事情的首选方法吗?那里有更好/不同的方式吗?
基于文档动态创建emit是否会在某些巨型文档出现并创建巨大的存储要求时遇到麻烦?
基本上,有一点我应该停止疯狂吗?
答案 0 :(得分:9)
首先:
不要将doc作为值发出...如果需要结果集中的数据,可以使用&include_docs=true
。
<强>第二强> 假设您的文档包含多个项目:
是否有意义,在没有月份的一天要求项目?
如果没有,您可以使用emit([doc.project,'monthday',doc.month,doc.day],1)
然后你可以要求一个月内的所有项目:
startkey=["project1","monthday",3]&endkey=["project1","monthday",3,{}]
一个月中的某一天:
key=["project1","monthday",3,9]
如果您使用的是简单的reduce函数(_sum),那么您可以查询项目有多少天(+一个月内):
startkey=["project1","monthday"]&endkey=["project1","monthday",{}]&group_level=3
...
"key":["project1","monthday",2],"value:1), // 1 Day in month 2
"key":["project1","monthday",3],"value:2) // 2 Days in month 3
使用group_level = 4(与reduce = false相同):
"key":["project1","monthday",2,20],"value:1),
"key":["project1","monthday",2,21],"value:1),
"key":["project1","monthday",3,1],"value:1),
当然你可以将最后一个案例与&amp; include_docs = true结合起来获取数据
第三:
每个文档可以发出多个值... 当然,您可以将发射分隔到不同的视图中,因此您不需要第二个键。 试着找出哪些信息属于一起,没有其他信息就没用了(比如日/月,人/工作标题?)
<强>第四:强>
添加数据并不昂贵..只是构建视图; - )