我想将MongoDB用于我的下一个Web项目。到目前为止只熟悉SQL数据库,我想知道这个设计是否对MongoDB有意义,是否可扩展,或者是否有更好的方法:
基本上我会有很多用户都会按照相同的课程在我的网站上学习词汇。对于每个用户,我需要跟踪他所研究的单词(0到2000之间,平均可能是100),他对他们的了解程度以及何时需要再次查看。我还想跟踪他为了便于参考而应该学习的下几个单词,以及有关用户的其他一些细节。我想到了这样的设计:
{
"user" : "Judith",
"country" : "Germany",
"curr_unit" : 1,
"curr_lesson" : 2,
"words" :
{
"我" : { "state" : 7, "next_review" : "2013-09-21 19:43:37 +0100" },
"你" : { "state" : 7, "next_review" : "2013-09-21 19:43:37 +0100" },
"是" : { "state" : 7, "next_review" : "2013-09-21 19:43:37 +0100" },
"学生" : { "state" : 2, "next_review" : "2013-08-31 19:43:37 +0100" },
"医生" : { "state" : 1, "next_review" : "now" },
"吗" : { "state" : 1, "next_review" : "now" },
... (could be 0-2000 such items) ...
},
"next_words" : [ "他", "不", "她", "中国人", "美国人", "这", "老师", "好", "很", "谢谢" ],
}
基本上,我怀疑MongoDB是如何使用的,因为我似乎无法通过状态检索单词,我只能一次检索有关用户的所有信息。此外,将时间戳视为字符串也很烦人。
我应该使用SQL数据库吗?我担心vocabulary_users表会很快被大量用户无法管理,平均每个都有100个条目。
由于这是一个间隔重复系统,我大多数时候都会访问这个文档,以便找出接下来要研究的单词(使用“state”和“next_review”的混合)。第二种最常见的访问类型是在研究会议之后必须更新“state”或“next_review”。第三种最常见的访问类型是更新“curr_lesson”。在用户的整个生命周期中,其他所有内容都会少于10次。
答案 0 :(得分:1)
似乎没有多大意义。首先,为什么你决定将“单词”作为对象?如果有的话,它应该是一个数组。看起来你正在构建某种间隔重复系统而不是字典,所以不要回答如下问题:我们对“德国人”这个词有什么了解,你更愿意回答问题:哪个卡具有最高优先级来显示现在。因此,如果您以{ "word" : "数据库", "state" : 7, "next_review" : "2013-09-21 19:43:37 +0100" }
的形式创建“单词”对象数组,则可以在{"user":1, "words.next_review:1}
上构建索引。
接下来,似乎将“单词”,也许“next_words”嵌入到用户文档中似乎并不是一个好主意。您的“单词”将不断更新,这将导致整个用户文档被重写。如果文档不适合其旧空间,则将重新分配该文档,这反过来意味着必须更新此集合的所有索引。
我要添加的最后一篇文章是文档中几乎一半的空间是按键占用的。键是在每个文档中重复的东西,这是一个很好的做法,使它们非常短。
答案 1 :(得分:0)
几乎可以肯定,这可以在SQL,MongoDB或其他类型的数据存储(如Redis或Lux)中使用。如果您对学习MongoDB感兴趣,那么使用MongoDB并找出问题的解决方案!但是如果你只是想让项目快速运行并且可以轻松访问很多工具,那么你应该坚持使用Postgres或其他一些SQL数据库。这是我的建议。