2011-12-19 33 views
5

我想在node.js應用程序中用Mongoose分解我的RDBMS心態,並且可以使用一些關於最佳實踐的指導。Mongoose模式/查詢最佳實踐(MongoDB,node.js)

一個簡單的例子:假設有兩個集合,組織和聯繫人。這是一對多的關係,他們都需要孤獨。但是,在索引方法中,我想返回一個組織對象數組,每個組織對象都有一個成員聯繫對象數組。 (後來我想返回一組聯繫人,每個聯繫人都有一個組織對象。)

在我看來,我誤解了完成此操作的最佳方式。以下是我到目前爲止看到的選項:

  1. 將聯繫人與他們的ID在組織文檔中嵌入。索引查詢可以是Organization.find({}, function(err, orgs) { orgs[n].contacts[n]...})缺點:需要大量額外存儲空間,並且每次更改「主」聯繫人文檔時都必須更新嵌入式聯繫人文檔。

  2. 利用Mongoose的populate/DBRef結構在兩個表中存儲「外鍵」標識符。查詢可以是:Organization.find({}}.populate('contacts').run(...)缺點:你必須在雙方存儲密鑰。

  3. 轉到更傳統的「外鍵」路線,只將組織ID存儲在聯繫人文檔中。查詢組織文檔,然後查詢組織查詢回調中的所有聯繫人,將數據合併到一個要返回的對象中。 缺點:多個查詢和額外的處理開銷(我相信我們必須獨立地爲這些組織找到組織和聯繫人,然後迭代每個組織,在公共_id字段上手動匹配,將它們組合到一個新的輸出對象中) 。

我必須缺少一個更好的選擇。允許#3模式的東西,但返回所需的組合對象的開銷較小。

注意async模塊似乎可以幫助這個,但這真的是唯一/最好的方式?

回答

2

這實際上取決於你要做的查詢。 - 您的網站是否更多地依賴聯繫人或組織? - 您是否經常需要顯示組織中的所有聯繫人? - 您需要在組織頁面上顯示哪些聯繫人的詳細信息?

等等

所以這真的取決於您的項目的需求。你的組織和聯繫人頁面不斷更新嗎?如果不是重複數據似乎不是一個壞主意,尤其是如果您的網站更重讀。

底線:想一下你在網站上有什麼頁面,以及那些頁面需要顯示什麼(因此需要做什麼查詢)。

+0

感謝您的回覆。該應用程序同樣取決於聯繫人和組織。也就是說,一些用戶更傾向於組織,一些更傾向於聯繫。在所有情況下,需要爲每個組織顯示所有聯繫人。總的來說,讀取要求會比寫入要求更大,但如果我們要將聯繫人數據嵌入到所有組織文檔中,存儲空間最終會成爲問題。就目前而言,我認爲堅持#2是最有意義的,因爲它可以減輕其他方面的負擔。但在雙方存儲ID仍然看起來很荒唐! – glortho 2011-12-19 21:00:02

+0

這並沒有那麼糟糕,你只是做了2個查詢(一個用於收集,另一個用於參考數據)。這是目前最安全的解決方案,那麼如果你願意,你可以在將來改變結構。 – alessioalex 2011-12-19 21:04:01