使用Mongoose / MongoDB构建我的模型

时间:2017-07-12 12:22:40

标签: node.js mongodb database-design mongoose

我最近开始深入了解服务器方面,正在开发一款应用程序,我需要考虑如何规划模型。

我的用户是教师,在仪表板中可以创建学生列表。我的模式将包含更多指令以防止重复创建,但我在这里简化了它们。这是我到目前为止所做的尝试:

// Teacher Model
const Teacher = new Schema({
   fname: String,
   lname: String,
   email: String,
})

// Student Model
const Student = new Schema({
   fname: String,
   lname: String,
   full: String,
   uuid: String
   grades: {
    classwork: Array,
    quizzes: Array,
    tests: Array
   }
})

在这里,我对后端工作缺乏经验。这个设置对我来说并没有多大意义。说当我去保存学生时,它将在数据库中的学生集合下创建一个新学生。这并不理想,因为学生应该以创建它的老师严格访问的方式存储。

我正在考虑在我的教师模式中创建一个名为"学生"(这将是一个数组)的新密钥,每次创建时都会将学生推入其中。

我正确地计划这一点非常重要,因为教师将来会有更多的能力,比如创建作业,给学生评分等等。我想用最佳实践来设计这个请记住,确保教师数据对其他用户是安全的。

2 个答案:

答案 0 :(得分:2)

在mongo模型中使用嵌套数组并不是那么顺利。 我可以建议考虑这个数组的大小。

如果您的阵列有可能增长 - 请不要使用它。

我对您的数据库设计的建议很简单。 将teacherId添加到学生模型中。 这样,当您需要根据特定教师获取学生列表时 - 您可以通过teacherId轻松查询。

所以你的学生模式修改会这样:

const Student = new Schema({
   teacherId: {
     type: mongoose.Schema.Types.ObjectId,
     index: true,
     required: true
   },
   fname: String,
   lname: String,
   full: String,
   uuid: String
   grades: {
    classwork: Array,
    quizzes: Array,
    tests: Array
   }
});

答案 1 :(得分:2)

我不同意@Lazyexpert。 MongoDB是一个非关系型数据库 您可以存储每个文档16Mb的数据。这真的足以满足您的需求

  

最大BSON文档大小为16兆字节。最大文档大小有助于确保单个文档不会使用过多的RAM,或者在传输过程中使用过多的带宽。为了存储大于最大大小的文档,MongoDB提供了GridFS API。

即:https://docs.mongodb.com/manual/reference/limits/

所以我建议您直接在老师中添加每个学生的数据。

您可以在此处找到一些提示:https://www.safaribooksonline.com/library/view/50-tips-and/9781449306779/ch01.html

所以你的模型应该是这样的:

public $accountTypeFlag;

.......

public function getSecondType() {
      if (($this->$accountTypeFlag == 1)){
        return array (self::CURRENT_ASSETS=>'Current Assets',self::PROPERTY_AND_EQUIPMENT=>'Property and Equipment',self::OTHER_ASSETS=>'Other Assets');
        }
      if (($accountTypeFlag == 2)){
        return array (self::CURRENT_LIABILITIES=>'Current Liabilities');
        }
      if (($accountTypeFlag == 3)){
        return array (self::FUND_BALANCE=>'Fund Balance');
        }     
    }

如果你绝对想要一个学生集合,那么在学生模式的“保存”操作中使用“post”中间件。像这样:

const Teacher = new Schema({
   fname: String,
   lname: String,
   email: String,
   students : [
      {
         fname: String,
         lname: String,
         full: String,
         uuid: String
         grades: {
             classwork: Array,
             quizzes: Array,
             tests: Array
         },
      },
   ],
})

即:mongoosejs.com/docs/api.html#schema_Schema-post

祝你好运:)