这是项目,粗略地说:我们有用户,我们有民意调查,用户可以创建民意调查或投票现有民意调查。当然,一个用户可以在每次投票时投票一次。
对我来说,这显然是关系型的,所以原则上NoSQL毫无意义。但后来我读了一下,得出的结论是你确实可以在MongoDB中建立关系,所以我来到这个方案,我想知道它是否是Mongo-ok或者之前没有。
在一个名为users的表/集合中,我们存储了所有用户数据,包括一个id(我猜mongo文件的默认_id会好吗?)
在另一个名为polls的表/集合中,我们将有一个id,问题,可能的答案和(这里是我开始怀疑的地方)一个包含所有已经投票的用户ID的数组?然后另外还有作者的userID以及它的用户名(我知道这是重复的,但是我在某个地方读到了我在mongo中这样做的意义,所以你不必为了知道用户的用户名而启动另一个查询)。 / p>
在MySQL中我会创建一个具有投票关系的表(userID已经投票了pollID),但我想在Mongo中将这些数据包含在poll文档中是有意义的吗?当然这个用户ID数组会不断更新,是吗?
如果我想列出给定userID创建的所有民意调查怎么办?我知道你可以使用find(),但至少在这种情况下它是否像在MySQL中一样高效?此外,每个民意调查都属于一个类别,你也必须能够按类别排序,所以,但我不想让它进一步复杂化。
答案 0 :(得分:1)
在我看来,一种有效的方法是使用Users
集合存储与用户相关的所有数据,然后设置Polls
集合,如您提到过,将一系列ObjectId
引用存储回给您的用户。
此数组还可以包含一些其他信息,例如任何给定用户何时回答的时间戳以及提供的答案。
但是,请注意,在数组中嵌入对象并不总是一个好习惯,特别是当它无界时(即:用户数量会随着时间的推移而增加,从而使得民意调查中的引用数组成为可能)对象也随着时间的推移而增加。)
尽管如此,我认为在您的情况下,这是一个很好的方法来处理您的应用程序用例场景,特别是因为用户只能回答一次任何给定的轮询,从而限制了对象数组的扩展速度。
此外,关于您对UserId查询投票集合的担忧,我认为只要您正确索引集合,就不会触发find
查询。如果您只想检索特定用户创建的轮询总数而不检索有关这些轮询的数据,则可以选择在用户上定义counter
字段,每次用户创建时都会增加轮询。