2013-08-18 50 views
0

我試圖做一個類似於雅虎的網站& Answer或StackOverflow(不同的類別,沒有競爭),並且我被困在這一點上,我會非常感謝任何指導來自你們,因爲我對MongoDB非常陌生。(MongoDB)問答網站的數據庫結構

順便說一句,我在Node.js和MongoDB上使用Express框架。

問題是要找到最有效的方式來爲用戶和問題/答案數據構建數據庫。

目前,有一個問題模型,裏面有一個文件爲每個類別。每個文件包含的問題本身的答案,和其他信息,如下所述:

math{ 
    OpenQuestions{ 
     'x+2=5, whats x?' : { 
      asker: 'peter', 
      likes: 12, 
      answers: { 
       'x is 3' : { 
        answerer: 'john', 
        likes: 25 
       }, 
       'x is 2' : { 
        answerer: 'MATHSUX', 
        likes: 0 
       } 
      } 
     } 
    } 
    ClosedQuestions{ 
     //same as OpenQuestions 
    } 
} 

通過這種方式,很容易顯示的問題,我們可以輕鬆地檢索基於對象的創建時間問題,並據此獲取它們在主要問題頁面上。

然而,如果一個用戶希望看到他問的問題,我能想到的唯一的辦法就是要通過每個subject.OpenQuestions.QuestionItSelf.asker,並檢查它是否是用戶自己,然後獲取所有對象爲這個用戶名相匹配,這將是一個巨大的計算。我相信有更好的方法,你們都在想什麼?

+0

我認爲可以安全地說,你將有超過每個主題16meg的文件,所以不要嵌入 – Sammaye

回答

1

MongoDB每個文檔的限制爲16MB。另外,當你有大小的文檔時,MongoDB表現得並不好。出於性能方面的原因,MongoDB試圖將文檔保存在硬盤驅動器的連續部分,因此當文檔增長時,需要不斷重新分配硬盤空間。

由於這些原因,將所有問題存儲在單個文檔中並不是一個好主意。

最好是創建一個問題集合併爲每個問題提供一個單獨的文檔。要提高搜索性能,可以創建一些適當的indices

順便說一下:我不確定MongoDB是否適合您的項目。您的應用程序聽起來非常關係,並不像它可以從面向文檔的MongoDB概念中受益。另一方面,您的等級思維方式聽起來更符合「哲學」的理念。但這只是一種主觀意見。

1

首先,將問題作爲關鍵是一個壞主意。製作question屬性,並將該屬性的值作爲問題的文本。 MongoDB沒有很多工具來查詢關鍵值。幾乎所有的都是$exists,甚至不支持通配符。對每個答案做同樣的事情,而不是讓答案的文本成爲一個關鍵字,並且有一個answer鍵,並且其值爲答案的文本。

接下來,沒有理由將所有問題都保存爲子文檔。您可以將狀態移至文檔的屬性(例如狀態:「打開」或狀態:「關閉」或狀態:「已回答但未關閉」)。如果您需要預先計算狀態 - 那麼將答案作爲子文檔可能更有意義,然後您可以根據答案的狀態推導出狀態(即,如果問題沒有任何答案,然後它顯示爲未答覆,如果它有答案但沒有被標記爲解決方案,那麼它的答案但沒有解決,如果答案標記爲解決方案,然後關閉等)。

然後,讓主題成爲問題的屬性,而不是每個主題的集合。如果你這樣做,然後找出問題,爲提問者是那麼容易,因爲

db.questions.find({asker: 'John'}, {question:1, _id:0}) 

,將顯示的所有問題,約翰問

文本

您的最終方案將是一個問題,收集與文檔結構,看起來像這樣:

{ 
     question: 'x+2=5, whats x?' 
     asker: 'peter', 
     likes: 12, 
     subject: 'math', 
     answers: [ 
      { answer: 'x is 3', answerer: 'john', likes: 25, solution: true }, 
      { answer: 'x is 2', answerer: 'MATHSUX', likes: 0} 
     ], 
     status: 'solved' 
    }