[英]Mongo DB Schema Design
我正在努力為應用找到最佳的數據庫設計。 我有一個SQL背景,並且傾向於創建或多或少的非規范化數據庫設計。
我有以下問題。 我收集了包含大約2000篇文章的“文章”。 每篇文章都有很多信息。 在實施推薦系統時,我想為每個“用戶”與每個“文章”關聯一個“ PredictedRating”。 在SQL中,我將使用三個表對此模型進行建模:“文章”,“用戶”,“ UserToArticle”。 該查詢應如下所示:我想為每個“ Article”關聯當前登錄用戶的“ PredictedRating”。在SQL中,我將通過“ Article”和“ Users”進行聯接,從而預先選擇相應的用戶。 具有正確的索引,這非常快。
我如何以mongo方式實現呢? 當我以描述的方式實現此功能時,我被迫對每篇文章都進行findOne()查詢,這效率非常低而且很慢(即使使用索引)。
你有什么想法嗎? 重要的是,僅發布當前用戶的預測收視率。
經驗法則
因此,對文檔數據庫進行建模並不像對關系數據模型進行標准化那樣簡單。 掌握了這些經驗法則后,您應該閱讀MongoDB手冊中的數據模型 。
例
我們需要將三個域對象放入MongoDB中: 用戶 , 文章和預測等級 。 我假設有很多用戶,甚至更多的文章。 很顯然,我們不應該將用戶和文章放入一個集合中(項目符號2、4和5)。 因此,我們只需要決定將預測收視率放在哪里。
將評分嵌入文章
由於您的用例是獲取用戶的所有預測評分,因此將其放入文章中會適得其反(6)。 您將需要搜索所有文章以獲得評分。 除此之外,如果您刪除用戶,則需要更新每篇文章。
將評分嵌入用戶
將評分嵌入用戶中的優勢在於,您只需要一個查詢即可獲取用戶和評分數據。 但是您可能需要為每個用戶的每篇文章添加一個評分,因此數組將增加很多(3)。
將評分放入自己的收藏中
因此,將評級放入自己的收藏夾是可行的。
{
_id: ObjectId("f01..."),
userId: ObjectId("123..."),
articleId: ObjectId("abc..."),
predictedRating: 5.4
}
如前所述,這取決於您的數量結構。 如果您只有很少的用戶或幾篇文章,則嵌入預測的收視率可能是一個更簡單,更快速的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.