2011-10-12 62 views
3

我們假設我設計了一個像Foursquare這樣的服務,它可以根據用戶位置跟蹤用戶檢查。我使用MongoDB作爲後端。mongo schema(嵌入vs參考)

的這裏的前提是,用戶可以簽入到一個位置,所以在架構集合可能是這樣的:

db.places.find() 
{ "_id" : ObjectId("4e6a5a58a43a59e451d69351"), "address" : { "street" : "2020 Lombard  St", "city" : "San Francisco", "state" : "CA" }, "latlong" : [ 37.800274, -122.434914 ], "name" : "Marina Sushi", "timezone" : "America/Los_Angeles" } 
{ "_id" : ObjectId("4e6a59c3a43a59e451d69350"), "address" : { "street" : "246 Kearny St", "city" : "San Francisco", "state" : "CA" }, "latlong" : [ 37.79054, -122.40361 ], "name" : "Rickhouse", "timezone" : "America/Los_Angeles" } 

db.users.find() 
{ "_id" : ObjectId("4e936bc1da06d5e081544b8b"), "_class" : "com.gosociety.server.common.model.User", "email" : "[email protected]", "password" : "asdfasdf"} 

所以在上面的藏品,我們有地方和用戶。用戶可以「登記」到某個地方,因此當用戶登記時,我們會在數據庫中保存一份記錄。登記手續包括:登記時間(UTC)和記事(150個字符),以及它是否發送到他的Facebook飼料或不(布爾)。

基礎上的描述,我可以在蒙戈認爲兩個備選方案的架構設計:

  • 創建一個簽入的收集,並使用蒙戈產生的參考ID來存儲用戶收集,和將收藏放入每個收藏中作爲簽入[]。通過這種方式,可以輕鬆確定每個用戶和每個場所的彙總統計信息。

  • 不要'創建簽入集合,但更新地方和用戶數據與相同的簽入信息。

我相信我蒙戈文件如果被聚合的數據幾乎從來不含有聚合信息的顯示對象應直接使用的聚集讀取。如果我們按照foursquare應用使用的方法進行操作,則僅當我們查看他們的個人資料或查看他們的地點詳情時,纔會顯示用戶的全部登記入住情況。

這裏的任何建議將不勝感激。

謝謝。

回答

3

就我個人而言,我會帶着一個單獨的集合,主要是爲了保持您的用戶/地點對象很小,因爲您可以爲每個用戶/地點提供無限的checkin。如果您在checkin集合中放置user_id/timestampl和place_id/timestamp的索引,那麼針對特定用戶或地點的查詢將會很有效。使用單獨集合的第二個好處是MongoDB不會在用戶或地點對象變大時繼續移動。相反,它會繼續附加到checkins集合,這應該是非常有效的(每個碎片每秒1000個插入的10秒)。

我還要提到,我會店簽入的ID在任何地方,也不是用戶的文檔,因爲你不必在簽入文檔中place_id或user_ID的索引得到相同的性能優勢。

0

我同意裏克,雖然你可能想要存儲彙總數據簽入你的地方/用戶文件(例如totalCheckinCount)快速檢索。

這對Rick強調的增長/移動問題是安全的,因爲簡單的聚合數據在O(1)處有限地增長,而不像存儲實際的簽名本身,當然這會增長到O(n),其中n是簽入次數。