2012-02-10 70 views
5

我目前正在嘗試實施類似Tumblr的用戶交互,如reblog,follow,followers,commenting,我目前正在關注的人的博客文章等。 還有一個要求顯示活動爲每個博客文章。創建與NoSQL數據庫的關係的有效方式

我堅持爲數據庫創建適當的架構。有幾種方法可以實現這種功能(定義像博客文章和評論一樣嵌入的數據結構,爲每個動作創建活動文檔等),但目前我無法確定哪種方式在性能和可伸縮性方面最好。

例如,讓我們看看我關注的人的實施。這裏是示例用戶文檔。

User = { id: Integer, 
     username: String, 
     following: Array of Users, 
     followers: Array of Users, 
     } 

這似乎微不足道。我可以管理每個用戶操作的下一個字段(關注/取消關注),但如果我當前關注的用戶被刪除,該怎麼辦?更新跟隨已刪除用戶的所有用戶記錄是否有效。

另一個問題是從我關注的人中創建博客文章的視圖。

Post = { id: Integer, 
      author: User, 
      body: Text, 
     } 

那麼它是有效的查詢最新的帖子,如;

db.posts.find({ author: { $in : me.followers} }) 

回答

0

有效的一種方法稱爲「星型模式」。如果你搜索網頁或維基百科,那麼你會發現很多信息。

3

看起來(對我)你試圖使用單個數據存儲(在這種情況下是一個面向文檔的NoSQL數據庫)來滿足(至少)兩種不同的需求。你似乎試圖做的第一件事是將數據存儲在面向文檔的商店中。我假設你有這樣做的合法理由。

您似乎試圖做的第二件事是建立您正在存儲的文檔之間的關係。你的例子顯示了FOLLOWS關係。我建議將此視爲將數據存儲在面向文檔的NoSQL數據庫中的不同要求,並將關係存儲在面向圖的NoSQL數據庫(如Neo4j)中。這樣,您的實體可以使用文檔ID存儲在文檔存儲和圖形存儲中的關係中。

我的經驗是,要獲得一個NoSQL數據庫來滿足大中型應用程序的所有功能和非功能需求將會很困難(如果不是不可能的話)。例如,我正在使用的最新應用程序除RDBMS外還使用MongoDB,Redis和Neo4j。我花了很多時間試驗技術,並且決定採用這種組合。我已經致力於使用Spring 3以及Spring Data項目,迄今爲止我的經驗非常棒。

+0

感謝您的親切回答。我實際上非常適合使用適合Node.js的MongoDB。我不想使用任何其他技術(因爲我必須學習它並處理其他問題),只要它能夠通過有效地使用MongoDB來實現。 – 2012-02-10 16:11:35

+0

我當然可以看到繼續嘗試使用MongoDB維護文檔關係的擔憂,因爲擔心其他技術會造成更多複雜性。然而,在我看來,這將是一個不可擴展的解決方案,除非應用程序非常小,並且總是由單個開發人員維護。隨着團隊中開發人員的增加,每個人都必須瞭解更新和刪除文檔與文檔關係的含義。從長遠來看,它只會導致更多的錯誤和複雜性。 – manish 2012-02-12 15:43:29