我一直在研究MongoDB,並遇到了一個特別有趣的模式來存儲文檔之間的關係。這種模式涉及包含ID數組引用子文檔如下父文檔:MongoDB和Mongoose:文檔引用ID的嵌套數組
//Parent Schema
export interface Post extends mongoose.Document {
content: string;
dateCreated: string;
comments: Comment[];
}
let postSchema = new mongoose.Schema({
content: {
type: String,
required: true
},
dateCreated: {
type: String,
required: true
},
comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }] //nested array of child reference ids
});
那孩子被引用:
//Child Schema
export interface Comment extends mongoose.Document {
content: string;
dateCreated: string;
}
let commentSchema = new mongoose.Schema({
content: {
type: String,
required: true
},
dateCreated: {
type: String,
required: true
}
});
這一點,直到我去送一切似乎很好,很正常來自前端的請求創建一條新評論。該請求必須包含Post _id(更新帖子)和新評論,這兩個都是使用普通關係數據庫時發送的請求的共同點。在將新評論寫入數據庫時出現問題。而不是像一個正常的關係數據庫那樣寫一個數據庫,我必須做2次寫入和1次讀取。第一次寫入插入新評論並檢索_id。然後讀取以檢索帖子_id與請求一起發送,以便我可以將新的Comment _id推送到嵌套參考數組。最後,最後一次寫入將Post更新回數據庫。
這看起來效率極低。我的問題是雙重的:
是否有處理這種關係的模式(包含子引用一組ID父母)更好/更有效的方式?
如果不是,使用這種模式的好處是什麼,而不是A)將父_id存儲在類似於傳統外鍵的子屬性上,或者B)利用MongoDB文檔並存儲評論數組,而不是評論的參考ID數組。
在此先感謝您的洞察!
而不是引用註釋作爲列表中的郵件只是使用一個引用在對帖子的評論中。你需要它的帖子ID,只寫一次。關於與一個職位相關的所有評論的撤回。 – Myonara
@Myonara,感謝您的反饋,我很感激。然而,我的問題更具體地是一個架構問題,爲什麼會選擇這種模式而不是你提到的模式,以及是否有更好的方法來實現所討論的第一種模式。 –
下面是一個CMS風格的用例https://docs.mongodb.com/ecosystem/use-cases/storing-comments/。這談到選項B.希望它可以幫助你清除一些東西。 – Veeram