2016-08-25 177 views
0

我很難爲學校應用提供模式。在MongoDB中建模多對多關係

特別是,我試圖用不同類型的用戶(例如教師,助教和學生)與他們所屬的課程和教程建立關係。

這裏是我的要求:

  1. 每門課程都會有一對多的教程;
  2. 每門課程將由一對多教員授課;
  3. 每門課程都會有一對一的學生;
  4. 每個教程都會有一對多的助教;
  5. 每位教練將教授一對多課程;
  6. 每位助教可在一對多課程中有一對多的教程;
  7. 每個學生都將參加一對多的課程;
  8. 每個學生在註冊過程中可能屬於一個教程;

到目前爲止,以下是我的用戶,課程和教程集合的架構。

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 - 這是更因此從用戶到其他機型的關係。什麼可能是模擬這些關係的好方法?

其中一種方法,我想過做例如要求5是添加一個字段到用戶架構

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

但是,當我做,請求6.類似地,因爲它會使查詢複雜化(例如「查找用戶是教學助手的課程中的所有教程」)。

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

回答

1

在你的情況下,設計是多對多的關係。所以你有兩個方法來解決你的問題。

  1. 參考文件
  2. 嵌入文檔

嵌入式的方式將重複數據是難以更新和刪除其中的讀操作會更加有效,因爲單查詢。

如果使用參考方法,您的數據將會失去知覺。所以,更新和刪除操作將很容易,因爲讀取操作將在數據庫上有多個命中。

因此,根據您的應用要求,您應該決定適當的方法。