简体   繁体   中英

Modelling many-to-many relationships in MongoDB

I am having difficulty coming up with schemas for a school app.

In particular, I am trying to model the relationship between the different kinds of users (eg instructors, teaching assistants, and students) with the courses and tutorials that they belong to.

Here are my requirements:

  1. each course will have one to many tutorials;
  2. each course will be taught by one to many instructors;
  3. each course will have one to many students;
  4. each tutorial will have one to many teaching assistants;
  5. each instructor will teach one to many courses;
  6. each teaching assistant may have one to many tutorials in one to many course;
  7. each student will be enrolled in one to many courses;
  8. each student may belong to one tutorial in the course that they are enrolled in;

So far, the following are my schemas for the user, course, and tutorial collections.

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
};

The problem lies with my requirements 5 to 8 -- which is more so the relationship from the User to the other models. What could be a good way to model these relationships?

One way, I thought of doing it eg req 5 was to add a field to the User schema

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

But the problem happens when I do eg req 6. similarly because it will complicate the queries (eg "find all the tutorials in a course that the user is a teaching assistant in").

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

In your case, Design is many to many relations. So you have two approach for your problem.

  1. Reference Document
  2. Embedded Document

Embedded approach will have duplicate data which is difficult to update and delete where as the read operation will be much efficient due to single query.

In case of the Reference Approach, your data will be demoralized. So, update and delete operation will be easy where as the read operation will have multiple hits on the database.

So, based on the your application requirement you should have to decide the appropriate approach.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM