2013-10-26 77 views
2

我有一個:MongoDB的數據關係

  • 的MongoDB數據庫上的NodeJS
  • REST API
  • 角JS前端

現在我想創建數據庫SCHMA 。它將是:

故事 - 用戶插入帶有說明的故事。

問題 - 與故事的關係。一個故事可以有超過100個問題。

答案 - 與問題的關係。一個問題只能有一個答案。

我應該在MongoDb中選擇哪種類型的關係?我需要更快的靈魂。 例如:

{ 
title: "Story title", 
descr: "Story descr", 
questions: [ 
       {body: "Question body", user: "User} 
      ] 
} 
+0

問關於模式設計的榮譽。許多人開始使用MongoDB並實施3NF(最終讓他們不快樂)。 +1 – SethO

回答

2

由於每層問題的數量可能很大,並且假設它不是必需的展示時的故事(特別是顯示新聞列表時)來顯示所有的問題,有很多原因作家到一個文檔附帶了許多複雜性,我建議以下簡單的模式:

stories { 
    _id 
    title 
    description 
} 

questions { 
    _id 
    storyId 
    user 
    body 
    answer { ... } 
} 

找到所有問題的故事很簡單(storyId應該有一個指標),發現這個故事對於一個給定問題是微不足道的。我認爲answer可以嵌入。儘管如此,還是要注意併發寫入,即在別人編寫答案的同時編輯問題。當使用單個嵌入式文檔而不是數組時,這比使用單個嵌入式文檔要容易得多,而併發作者的數量最多可能是兩個,而不是可能數百個。

唯一稍微棘手的操作是刪除故事,需要您手動刪除問題,但這實際上只是一個調用。

+0

但如果我想回顧故事和問題,我必須做出分離的API調用? –

+0

不一定。我會*做*它,以保持簡單(也可以做到這些並行,無論如何是Angular的默認行爲)。但是,如果您確實想要,可以將查詢結果合併到服務器上,並將合併的DTO發送到前端。還是你的意思是「API調用」的數據庫操作?在這種情況下,我不擔心,它們不應該比單次調用慢很多,並且可以並行化,因爲您可以從問題中引用故事標識。 – mnemosyn

+0

我看到你在Mongo中有很多經驗:)我會用你建議的這種方式來實現。我也想實行故事,答案,問題的投票系統。我應該爲此創建新的collentios嗎? –