0

我想在我的下一个 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 次。

4

2 回答 2

1

似乎没有多大意义。首先,你为什么决定让“词”成为一个对象?如果有的话,它应该是一个数组。似乎您正在构建某种间隔重复系统而不是字典,因此与其回答诸如:我们对“德国人”一词了解多少这样的问题,您更愿意回答问题:哪张卡片的显示优先级最高现在。因此,如果您将“单词”设为 形式的对象数组,{ "word" : "数据库", "state" : 7, "next_review" : "2013-09-21 19:43:37 +0100" }则可以在{"user":1, "words.next_review:1}.

接下来,似乎将“words”以及“next_words”也嵌入到用户文档中并不是一个好主意。你的“单词”会不断更新,这会导致整个用户文档被重写。如果文档不适合它的旧空间,它将被重新分配,这反过来意味着这个集合的所有索引都必须更新。

我要补充的最后一点是,您的文档中几乎有一半的空间是由键占用的。键是在每个文档中重复的东西,最好将它们缩短。

于 2013-09-12T20:44:26.220 回答
0

几乎可以肯定,您可以在 SQL、MongoDB 或其他类型的数据存储(如 Redis 或 Lux)中完成这项工作。如果您对学习 MongoDB 感兴趣,那么请使用 MongoDB 并找出解决问题的方法!但是,如果您只是想让项目快速运行并且可以轻松访问许多工具,遵循一条铺好的道路,您可能应该坚持使用 Postgres 或其他一些 SQL 数据库。这是我的建议。

于 2013-09-12T21:18:52.647 回答