我想在我的下一个 Web 项目中使用 MongoDB。到目前为止只熟悉 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 数据库吗?我担心词汇表用户表很快就会变得无法管理,因为用户很多,每个用户平均有 100 个条目。
由于这是一个间隔重复系统,大多数时候我会访问这个文档以确定接下来应该学习哪些单词(使用“state”和“next_review”的混合)。第二种最常见的访问类型是在学习会话后必须更新“state”或“next_review”时。第三种最常见的访问类型是更新“curr_lesson”。在用户的整个生命周期中,其他所有事情都发生不到 10 次。