0

比如我有模型UserPostEffeciently從 「外鍵」 查詢用戶名OBJECTID

用戶

{ 
    "_id": ObjectId("pretendThisIsAUserObjectId"), 
    "name": "someUser" 
} 

{ 
    "_id": ObjectId("pretendThisIsAUserObjectId"), 
    "title": "blah blah", 
    "user_id": ObjectId("pretendThisIsAUserObjectId"), 
    "content": "more blah" 
} 

用戶有很多的職位。所以我們有user_id存儲在Post。因此,當我們列出每個用戶的帖子時,我們將有N + 1個查詢(N個帖子加上1個用戶名查詢),因爲我們沒有加入MongoDB。

我們是否還可以將用戶名存儲在Post中進行優化?

回答

2

簡短的回答是是的。您可以根據自己的特定需求將數據規範化到任何程度。你甚至可以去儲存整個User文件在每個Post,但這將是一個愚蠢的重複量。

但是,我的第一個看法是考慮應用程序端緩存與每個用戶ID關聯的用戶名,而不是試圖在Post文檔中包含名稱或每次查詢時都要查詢它。

如果您的用戶名是唯一的,您可以考慮將您的User文檔的用戶名_id,而不是標準ObjectId。這使得您的用戶ID更加有用,因爲您不再需要執行其他查詢來查找每個用戶的名稱,因爲他們的名稱是他們的ID。

+0

關於存儲用戶名而不是ID的好主意! –

+0

是否適合MongoDB的「denormalisation」?我認爲數據庫規範化僅適用於具有模式的數據庫而不適用於無模式的MongoDB –

+0

沒有規範化適用於具有模式的數據庫,解規範適用於不具有模式的dbs,但據說您可以將SQL技術解除規範化以使其更快,這在大型網站中是很常見的做法。 – Sammaye

0

如果您啓用了Identity Map,則可以像平常一樣使用includes

Post.includes(:user)... 

參見Eager Loading

+0

謝謝。這很有幫助,但有沒有選擇嵌入用戶名和ID,所以我們根本不需要加載整個用戶文檔? –