2016-12-31 18 views
0

架構:Mongodb:將所有相關數據存儲在一個集合或抽象的數據片段中?

articles: [ 
    { 
    _id: uid, 
    owner: userId, 
    title: string, 
    text: text, 
    } 
], 
comments_1: [ 
    { 
    // single comment 
    articleId: uid, 
    text: text, 
    user: { 
     name: string, 
     id: uid 
    } 
    } 
], 
comments_2: [ 
    { 
    // all comments at once 
    articleId: uid, 
    comments: [ 
     { 
     _id: commentId, 
     text: text, 
     user: { 
      name: string, 
      id: uid 
     } 
     } 
    ], 
    } 
], 

我有點困惑與MongoDB的建議: 說,我需要檢索文章頁面的信息。我需要做2個請求,首先通過ID找到文章,然後找到評論。如果我在每篇文章中包含註釋(comments_2)作爲屬性,我只需要執行一個查詢即可獲取我需要的所有數據,並且如果我需要列出20個文章的標題,我會執行具有指定屬性的查詢來檢索,對嗎?

  1. 我應該將評論和文章存儲在不同的集合中嗎?
  2. 如果意見將在不同的商店,我應該存儲評論comments_1方式或comments_2方式?

我會避免深入的解釋,因爲架構解釋清楚我的觀點,我猜。簡而言之,我不知道是否最好將所有內容都存儲在一個地方,然後指定我想在查詢時檢索的屬性,或者將數據片段抽象到不同的集合中?

回答

1

在關係數據庫中,這可以通過JOIN來實現。顯然,there is a NoSQL equivalent in MongoDB,從3.2版本開始叫$查找

這可以讓你保持評論和文章在不同的模式,但仍檢索註釋列表與單個查詢的文章。

堆棧溢出Source

1

這是一個典型的權衡你必須做出。這兩種方法都有各自的優點和缺點,你必須選擇最適合你的用例。輸入夫婦:

單表:

  • 快速加載單篇文章,因爲您加載的所有數據在一個查詢
  • 沒有問題與20篇裝載標題(您可以使用查詢字段的唯一子集projection

多表:

  • 容易得多每做pendicular查詢(例如,由特定用戶提出的意見等)
  • 我將與第1版去的,因爲它的簡單和版本2不會給你任何好處
+0

謝謝@YaroslavAdmin,多了一個澄清:如果我要在一個集合(包括評論)存儲一切信息,有沒有方法來檢索,比如,所有的數據,但具體的意見數量? – stkvtflw

+0

@stkvtflw是的,這是可能的。看[這個答案](http://stackoverflow.com/a/8452577/1377864)。 –

1

好,MongoDB的模型通常意味着持有數據和關係,因爲它不提供聯接($ lookup是最接近加入並且代價高昂,最好避免)。

這就是爲什麼在DB造型還有巨大強調非規範化,由於有保存在一起

  1. 兩個好處,你就不必加入收藏,你可以在一個單一的查詢中獲取數據。
  2. 由於mongo提供原子更新,您可以一次更新評論和文章,而不必擔心事務和回滾。

那麼幾乎可以肯定,你想提出意見裏面的文章集合。所以它會是這樣的

articles: [ 
    { 
    _id: uid, 
    owner: userId, 
    title: string, 
    text: text, 
    comments: [ 
     { 
     _id: commentId, 
     text: text, 
     user: { 
      name: string, 
      id: uid 
     } 
     } 
    ] 
    } 
] 

在我們同意之前,讓我們看看上面的方法的缺點。

  1. 每個文檔這是巨大的16MB的限制,但認爲如果你的文章的文本大,對文章的評論也很多,也許它可以跨越16 MB。

  2. 你在哪裏得到文章,你可能必須排除意見欄其他目的的所有地方,否則這將是沉重而緩慢。

  3. 如果你要做的聚集,我們再次可能進入內存限制問題,如果我們需要聚集基於評論也單程或其他。

這些都是嚴重的問題,我們不能忽視的是,現在我們可能要保持它的不同的集合中,看看我們正在失去。

首先評論和文章雖然掛的,但不同的實體,那麼你可能永遠需要一起更新它們的任何領域。

其次,你就必須分裝的意見,這是有道理的在正常使用情況下,在這就是我們如何進行,所以那也是不成問題大多數應用。

在我看來伯仲

所以是一種有兩個單獨收集

articles: [ 
    { 
    _id: uid, 
    owner: userId, 
    title: string, 
    text: text, 
    } 
], 
comments: [ 
    { 
    // single comment 
    articleId: uid, 
    text: text, 
    user: { 
     name: string, 
     id: uid 
    } 
    } 
] 

你不會想去comment_2方式,如果你正在爲同樣的原因選擇了兩個集合的方式,再次彷彿有什麼對於單篇文章來說是巨大的評論。

相關問題