meteorjs app的MongoDB模型设计

时间:2014-12-25 18:16:19

标签: mongodb meteor

我更习惯于关系数据库,并且很难想到如何在mongoDB中设计我的数据库,并且在考虑meteorjs的数据库设计的一些特殊注意事项时更加不清楚了解您通常更喜欢单独的集合而不是嵌入式文档/数据,以便更好地利用您从集合中获得的一些好处。

假设我想跟踪学生在高中的进步情况。他们需要在每个学年完成某些必修课,以便进入下一年(新生,大二,大三,大四),他们也可以完成一些选修课。我需要跟踪学生何时完成每项要求或选修课。而且每年的要求可能略有变化,但我需要记住,例如Johnny完成了两年前存在的所有新生要求。

所以我有:

生 要求 选修课 成绩(frosh等) 年

大多数情况下,我正在考虑如何设置要求。在关系数据库中,我有一个需求表,包括className,grade和year,以及一个student_requirements表,用于跟踪学生完成每个需求。但是我想在MongoDB / meteorjs中,我会为每个等级/级别建立一个模型,该模型使用studentID进行存储,并且最初使用每个需求的假值进行实例化,例如:

{
    student: [studentID],
    class: 'freshman'
    year: 2014,
    requirements: {
        class1: false,
        class2: false
    }
}

当学生完成一项要求时,它会更新如下:

{
    student: [studentID],
    class: 'freshman'
    year: 2014,
    requirements: {
        class1: false,
        class2: [completionDateTime]
    }
}

因此,通过这种方式,每个学生将收集四个Requirements文档,这些文档在某种程度上取决于其初始实例化值。而不是生活在数据库中的每个年级/年的实际要求,它们基本上都存在于代码本身中。

我希望能够支持的一些行动是同时标记一组学生的要求,并显示用户/要求的网格,以查看谁需要什么。

听起来合理吗?或者有更好的方法来解决这个问题吗?我在这个应用程序中很早,我希望避免把自己画成一个角落。任何帮助建议表示赞赏。谢谢! : - )

1 个答案:

答案 0 :(得分:1)

目前我正在考虑我的应用程序数据设计。我已经阅读了MongoDB手册中的例子

查看MongoDB手册数据模型设计 - docs.mongodb.org/manual/core/data-model-design /

在这里 - > MongoDB手册一对一的关系 - docs.mongodb.org/manual/tutorial/model-embedded-one-to-one-relationships-between-documents /

(抱歉,我不能在答案中发布多个链接)

他们说:

通常,在以下情况下使用嵌入式数据模型:

  • 实体之间有“包含”关系。
  • 实体之间有一对多的关系。在这些关系中,“许多”或子文档始终在“一个”或父文档的上下文中显示或查看。

规范化方法使用文档中的引用到另一个文档。就像在Meteor.js book中一样。他们创建了一个显示帖子的网络应用程序,每个帖子都有一组评论。他们使用两个集合,帖子和评论。添加评论时,它与post_id一起提交。

因此,在您的示例中,您有一个学生集合。每个学生都必须满足要求吗?每个学生都有自己的要求,比如帖子有他自己的评论吗?

然后我会像在书中那样处理它。有两个系列。我认为这应该是规范化的方法,而不是嵌入式方法。

我自己有点困惑,所以也许你可以告诉我,如果我的回答是有道理的。

也许你也可以帮助我?我正在尝试制作管理跳蚤市场的应用程序。

该应用的用户创建活动。

该活动的创建者邀请用户成为该活动的收银员。

用户创建他们想要出售的东西的列表。最大。每个活动的名单/卖家数量。最大。列表中的位置数(25/50)。

收银员在活动中输入这些清单的位置,以跟踪销售的内容。

活动创建者为每个列表中的已售东西进行计费,然后分发钱。

我很困惑如何设置数据设计。我需要事件和列表。我是使用规范化方法还是嵌入方法?

编辑:

阅读percona.com/blog/2013/08/01/schema-design-in-mongodb-vs-schema-design-in-mysql/后,我找到了以下建议:

  • 如果您在99%的时间内阅读了人员信息,那么拥有2个独立的馆藏可能是一个很好的解决方案:它可以避免保留内存数据几乎从不使用(护照信息)以及何时需要获取给定人员的所有信息,可以接受在申请中加入。
  • 如果您想在一个屏幕上显示人名,在另一个屏幕上显示护照信息,也一样。
  • 但是,如果您想显示给定人员的所有信息,将所有内容存储在同一个集合中(使用嵌入或平面结构)可能是最佳解决方案