在MongoDB中建模多对多关系

时间:2016-08-25 14:11:19

标签: mongodb mongoose many-to-many

我很难为学校应用程序提供架构。

特别是,我试图模拟不同类型的用户(例如教师,助教和学生)与他们所属的课程和教程之间的关系。

以下是我的要求:

  1. 每门课程都有一到多个教程;
  2. 每门课程将由一对多的教师授课;
  3. 每门课程都会有一到多名学生;
  4. 每个教程都会有一对多的助教;
  5. 每位教师将教授一对多课程;
  6. 每位助教可以在一对多的课程中有一对多的教程;
  7. 每个学生将参加一对多课程;
  8. 每个学生可以在他们注册的课程中属于一个教程;
  9. 到目前为止,以下是我的用户,课程和教程集合的模式。

    var CourseSchema = new mongoose.Schema({
        name: { type: String, required: true },
        code: { type: String,  required: true },
        tutorials: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Tutorial' }], // 1
        instructors: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], // 2
        students: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }] // 3
    });
    
    var TutorialSchema = new mongoose.Schema({
        number: { type: String, required: true },
        teachingAsst: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }] // 4
    });
    
    var UserSchema = new mongoose.Schema({
        email: { type: String, lowercase: true },
        password: String,
        name: {
            first: { type: String, lowercase: true },
            last: { type: String, lowercase: true }
        },
        roles: [String] // instrutor, teachingAsst, student
    };
    

    问题在于我的要求5到8 - 从用户到其他模型的关系更是如此。什么是塑造这些关系的好方法?

    一种方式,我想过这样做,例如req 5是向User schema

    添加一个字段
        instructor: {
            courses: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Course' }]
        }
    

    但问题发生在我做的时候,例如req 6.同样是因为它会使查询复杂化(例如“在用户是教学助理的课程中查找所有教程”)。

        teachingAsst: {
            courses: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Course' }]
            tutorials: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Tutorial' }]
        }
    

1 个答案:

答案 0 :(得分:1)

在您的情况下,设计是多对多的关系。所以你有两种解决问题的方法。

  1. 参考文件
  2. 嵌入文件
  3. 嵌入式方法将具有重复数据,难以更新和删除,因为单个查询会使读取操作高效。

    如果使用参考方法,您的数据将会士气低落。因此,更新和删除操作将很容易,因为读取操作将在数据库上有多个命中。

    因此,根据您的申请要求,您必须决定适当的方法。