2014-01-23 196 views
3

假設我正在使用Node.js和貓鼬構建討論論壇。用戶可以有多個論壇,而論壇可以有多個評論。用戶也可以邀請其他用戶加入論壇。因此,我的問題是關於使用參考或嵌入式文檔的模型設計!嵌入式文檔與參考貓鼬設計模型?

如果我和嵌入文檔去,它看起來像:

var Comment = new Schema({ ... }); 

var Forum = new Schema({ 
    title: {type: String}, 
    content: {type: String}, 
    comments: [Comment], 
    attendees: [User] 
}); 

var User = new Schema({ 
    name: {type: String}, 
    email: {type: String}, 
    forums: [Forum] 
}); 

var Account = mongoose.model('Account', User); 

使用上面的設計,我掙扎:當用戶添加評論到論壇,該論壇是在我的論壇,我不認爲我可以在我的論壇列表中獲得新評論的更新。我呢?你知道如何讓嵌入式文檔在這種情況下工作嗎?

因此,我想在貓鼬中使用參考。在這種情況下,我將有兩個收藏:帳戶論壇。在這種情況下向論壇添加新評論不是問題。我對嗎?

參考比爲這個應用程序嵌入文檔更好?

在此先感謝,

+0

下面的答案有幫助你嗎? – Chev

+0

這篇文章對我理解嵌入很有幫助。 – DataEngineer

回答

26

這主要取決於您如何查詢和更新您的數據。在這種情況下,一致性和文檔大小也很重要。下面是引用或嵌入文檔時,在一個很好的總結:

嵌入:

  • 小的子文檔
  • 數據不改變定期
  • 最終一致性是可以接受的
  • 文件,通過一個小的增長amout
  • 您經常需要執行第二個查詢以獲取數據的數據
  • Fas牛逼讀取

引用:

  • 大的子文檔
  • 性數據
  • 立即一致性是必要
  • 文件是長出了大量
  • 數據,你會經常從結果中排除
  • 快寫

這是我讀過的一本關於mongo的書。這些只是一般規則,但根據我的經驗,使用它們可以非常明確地指出或嵌入大部分時間。

我寧願在這種情況下參考論壇。但請考慮您的所有要求。例如,如果您從用戶引用論壇,並且您需要查詢特定論壇的所有用戶,則在這種情況下查詢可能會很慢。如果我是你,我會編寫一份我需要的一切清單,然後使用一般規則可以在嵌入和引用的優點和缺點之間找到平衡點。

希望它能幫助!

+0

我認爲這應該被標記爲現在的答案。 – Chev

+0

@AlexFord嗯我不敢打賭,一:MongoDB自從「立即一致性」以來一直在閱讀什麼MongoDB書?我不確定他的意思,但在MongoDB中手動引用不提供內置的一致性 – Sammaye

+2

@Sammaye「即時一致性」 - 許多其他引用的對象。如果你更新它,你會從任何對象中獲得最新的數據,並引用這個數據。 「最終的一致性」 - 一個對象嵌套在許多其他對象中,所以如果你改變它,你必須在任何地方改變它,所以你可能會想出一些情況,當他們中的一些更新,但有些不是。當然,這與事務一致性無關,例如當你需要更新拖拽對象或沒有時。 –

3

我個人喜歡在你的情況下做參考。通過這種方式,我可以從用戶,論壇用戶,評論論壇,用戶論壇等獲得評論,而無需擔心複雜的嵌入式文檔查詢。我甚至不打擾存儲嵌入的參考文檔。如果論壇和評論之間存在一對多的關係,那麼我會在評論中存儲論壇參考,並在論壇上沒有評論參考,因爲當您從評論集中添加/刪除評論時,您還必須去除嵌入來自論壇評論集的參考文件。

我可以使用論壇參考來查詢論壇的評論,我可以通過查詢該論壇參考的評論集合來獲得論壇的所有評論(這只是一個ID號,直到貓鼬填充它在幕後您)。