2015-11-13 84 views
0

这是该项目,粗略地说:我们有用户,我们有民意调查,用户既可以创建民意调查,也可以投票现有民意调查。当然,一个用户每次投票只能投一次。MongoDB“关系型”应用程序的体系结构

对我来说这显然是关系型的,所以原则上NoSQL是没有意义的。但后来我读了一点,得出的结论是,你确实可以在MongoDB中建立关系,所以我来到这个计划中,我想知道在继续之前它是否是Mongo-OK。

在我们店所有的用户数据,包括ID的表/集合称为用户(我猜蒙戈文件的默认_id会好吗?)

在另一台/收集所谓民意调查,我们将有一个id ,问题,可能的答案和(这里是我开始怀疑的地方)一个包含所有已经投票的用户ID的数组?另外还有作者的用户ID和用户名(我知道这是重复的,但是我在某处读到我在mongo中这样做是有道理的,所以你不必为了知道用户的用户名而启动另一个查询)。

在MySQL中,我会创建一个带有投票关系的表(用户ID已经投票pollID),但我猜想在Mongo中,将这些数据包含在投票文件本身中是否有意义?当然,这个用户ID数组将会不断更新,是吗?

如果我想列出由给定的用户ID创建的所有民意调查?我知道你可以使用find(),但至少在这种情况下它和MySQL一样高效?此外,每个民意调查将在一个类别,你也必须能够按类别进行排序等,但我不想进一步复杂化。

回答

1

在我看来,一个有效的方法去做这件事将是有一个Users集合,其中存储所有与用户有关的数据,然后有一个Polls集合,正如你所提到的,它存储一组数组ObjectId引用回您的用户。

此数组还可以包含一些其他信息,例如任何给定用户何时应答以及提供的答案的时间戳。

尽管如此,请注意将对象嵌入到数组中并不总是一种好的做法,特别是当它是无界的时候(即:用户数量将随着时间增加而增加,从而使得投票对象也会随时间增加)。尽管如此,我认为在你的情况下,这对你的应用程序用例场景来说是一个很好的方法,特别是因为用户只能对任何给定的轮询只回答一次,因此限制了对象数组的扩展速度。

此外,关于您对UserId查询投票集合的担心,我认为只要您正确索引您的集合,就不会有任何问题发出find查询。如果您只想检索某个用户创建的民意调查总数而不检索有关这些民意调查的数据,则可能会在用户定义一个counter字段,每次用户创建民意调查时都会增加该字段。

+0

感谢您的回答!但我有一个疑问,当你说:“将对象嵌入到数组中”时,你的意思只是userId整数或“真实对象”类型?我的意思是,数据类型是一个整数还是一个对象?如果问题有任何意义(我不认为......),它有什么区别吗?另外:总体而言,您认为这种应用程序可以比Mongo更好地使用Mongo而不是MySQL吗?(我想这是更'个人',但我想听听你的意见) –

+0

正如你所暗示的,当我说'对象'我指的是一个对象数据结构,因为我假设你想存储更多关于用户的投票,而不仅仅是原始行动。我认为这一切都取决于您的堆栈和您计划使用数据的方式。即使我是MongoDB的拥护者,我认为这都归结为衡量您的特定应用程序的优点和缺点。因为我没有关于您的应用程序的所有信息,所以我不可能推荐一个或另一个。尽管如此,如果配置得当,两者都可以表现出色。 –