这将是一个奇怪的问题。我想我知道答案,但经过近一个小时与我的程序员讨论正确的解决方案后,我需要一个现实/健全性检查。如果这不符合stackoverflow上的格式,请道歉。
我们正在使用MeteorJS& MongoDB的。
我们的收藏品设置如下:
时间表属于事件。 活动属于课程。
时间表包含以下字段: _id,start_time,end_time,eventId,lecturerId。 事件和课程的字段无关紧要。
然后,我们有一个民意调查功能。每个计划可以有一个或多个民意调查。因此,民意调查属于附表。
现在这就是事情变得奇怪的地方。
我们如何找到特定时间表的民意调查?
我的解决方案是这样的:
Polls.find({scheduleId: _id-of-schedule})
我的程序员认为民意调查应该属于课程而不是附表,而是希望利用时间和讲师来寻找民意调查。像这样:
Polls.find({
lecturerId: id-of-lecturer,
activate_timedate: {
$gte: ISODate(start-time-of-schedule),
$lt: ISODate(end-time-of-schedule)
}
})
现在,他绝对肯定这是要走的路,而不是使用scheduleId。他说,速度惩罚将是可以忽略不计的,并且这在某种程度上“更加灵活”。
他认为,如果民意调查属于课程而不是计划,那么显示早期计划中的民意调查会更容易。这是真的。
但是,做下面这样的事情真的是一个混乱的解决方案吗?
courseId = schedule.courseId;
schedules = Schedules.find({courseId: courseId}, {fields: {_id:1}})
scheduleIds = _.pluck(schedules, '_id')
polls = Polls.find({scheduleId: {$in: {scheduleIds} }})
当然,更好的方法可能是在民意调查文件中存储courseId和scheduleId,并且只是:
polls = Polls.find({courseId: _id-of-course})
我问这个的原因是他是CS学生,而我是业余爱好者。所以我很乐意接受我错了。但我想知道我是怎么错的,如果是这样的话。
如果我需要提供任何额外信息,请告诉我。提前谢谢。
答案 0 :(得分:1)
检查我的理解:
如果是这种情况,我建议对事件+时间表进行非规范化,因此事件如下所示:
活动:_id, lecturer, startTime, stopTime, poll, eventName, courseId
比较不同讲师如何教授同一事件:Events.find({eventName: desiredEventName})
根据poll
的大小,您可以将其作为嵌套的objet内部事件,或使其成为自己的集合。就像你拥有它一样,它是一个单独的集合,所以现在你的查询将是:
Polls.find(event.poll);
然而,除非它是巨大的&有可能超过16MB的文件上限,我会嵌套它。