在CouchDB中,模拟特殊类型查询的多发射映射函数会影响我的沙发尺寸吗?

在CouchDB中,模拟特殊类型查询的多发射映射函数会影响我的沙发尺寸吗?,couchdb,Couchdb,我有一个CouchDB数据库(我们会说它保存了项目时间卡相关的数据:项目代码、人员、人员的职称、任务、日期、工作时间、账单费率等)。我想按天创建项目的摘要视图。。。或按个人、任务、标题或任何单一属性 我担心我将走上一条不可持续的道路,我的数据库规模可能会远远超过需要 我创建了一个带有map函数的视图,它可以多次发送每个文档,每个属性一次。这很有效。但这是否达到了你应该停止的终点 我有多个发射: emit([doc.project, 'day', doc.day], doc); emit([doc

我有一个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,{}]

我的数据库最终会变得如此庞大,以至于添加任何新数据的成本都高得让人望而却步吗?multi-emit()是执行我尝试执行的操作的首选方法吗?有更好的/不同的方法吗

如果某个巨大的文档出现并产生了巨大的存储需求,那么基于文档动态创建emit是否只是自找麻烦


基本上,我应该停止这种疯狂吗?

首先: 不要将文档作为值发出。。。如果需要结果集中的数据,可以使用
&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),您可以询问一个项目有多少天(+一个月):

使用组_级别=4(与reduce=false相同):

当然,您可以将最后一个案例与&include_docs=true组合以获取数据

第三名:

每个文档可以发出多个值。。。 当然,您可以将发射分为不同的视图,因此不需要第二个关键点。 试着弄清楚,哪些信息属于一起,没有其他信息(如日/月、人员/职务)是无用的

第四名:

添加数据并不昂贵。。仅建筑视图;-)

 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
"key":["project1","monthday",2,20],"value:1), 
"key":["project1","monthday",2,21],"value:1),  
"key":["project1","monthday",3,1],"value:1),