基于Mongodb的电子学习webapp的多对多关系?

时间:2014-05-31 21:54:59

标签: mongodb

我对No-SQL数据库比较陌生。我正在为电子学习网络应用程序设计数据结构。将有X个课程数量和Y个用户数量。

每位用户都可以参加任意数量的课程。

每门课程都是很多部分的复合(每个部分可能是视频或测验)。

我需要跟踪用户的每个部分,所以我认为整个课程应该是用户集的一部分(对于每个用户),如下所示:

{
   _id: "ed",
   name: "Eduardo Ibarra",
   courses: [
                {
                  name: "Node JS",
                  progress: "100%",
                  section: [
                      {name: "Introdiction", passed:"100%", field3:"x", field4:""},
                      {name: "Quiz 1", passed:"75%", questions:[...], field3:"x", field4:""},
                  ]
                },
                {
                  name: "MongoDB",
                  progress: "65%",
                  ...
                }
              ]
 }

这是最好的方法吗?

1 个答案:

答案 0 :(得分:2)

我会说根据您的查询设计您的数据库。有一件事是肯定的..你将不得不做一些嵌入。

如果您要对用户正在执行的操作执行更多查询,请将用户作为主要实体并将课程嵌入其中。您不需要嵌入整个课程信息。有关课程的信息是静态的。例如:关于Node JS课程的数据 - 即内容,课程作者,练习文件等 - 不会改变。所以你可以保持课程'信息分别在另一个集合。但是,用户完成的课程有多少取决于个人用户。因此,您应该只保留课程的ID(存储在单独的课程'集合中),并且对于每个用户,您可以存储与嵌入在该课程中的(用户,课程)对相关的信息。用户集合本身。

现在最重要的问题 - 如果您必须执行需要加入'的查询该怎么办?用户和课程集合?为此,您可以使用javascript首先获取课程(并可能将它们存储在数组或列表中等),然后从课程集合中获取每个课程的用户,反之亦然。网上有一些驱动程序可以帮助您完成此任务。一个是UnityJDBC,可用here

根据我的经验,我知道知道从MongoDB查询的内容对于设计数据库非常有帮助,因为MongoDB的NoSQL特性意味着你没有正确的设计方法。如果它不允许您完成任务,那么每种方式都是不正确的。很明显,事先知道你将要做什么(即你将要查询什么)与数据库是唯一的指南。