2011-12-08 65 views
1

我正在尋找關於如何最好地實現MongoDB外鍵ObjectId字段的建議。似乎有兩種可能的選擇,或者包​​含嵌套的_id字段或不包含。MongoDB ObjectId外鍵實現建議

查看下面的fkUid字段。

{'_id':ObjectId('4ee12488f047051590000000'), 'fkUid':{'_id':ObjectId('4ee12488f047051590000001')} } 

OR

{'_id':ObjectId('4ee12488f047051590000000'), 'fkUid':ObjectId('4ee12488f047051590000001')} } 

任何建議將不勝感激。

回答

7

我很難找出任何可能的優勢,因爲我們可以將ObjectId直接存儲在fkUid中。

+0

完全同意。添加子文檔會使查詢更難,更新困難,佔用更多空間並可能更慢。我也會放棄'fk'前綴。如果你的'Message'有一個非常明顯的'SenderId'。 – mnemosyn

+1

是的,同意刪除該前綴。 – tkrajcar

0

如果你的問題是關於字段的命名(你在標題中有什麼),通常這個約定是在它引用的對象之後命名它。

1

我建議使用默認的dbref實現,這裏描述的是http://www.mongodb.org/display/DOCS/Database+References,並且與大多數特定的語言驅動程序兼容。

+0

我不同意。這篇引用文檔總結得非常好:「除非你有使用DBrefs的令人信服的理由,否則使用手動引用」。這當然取決於使用情況,但這不是一個好的通用實踐建議。 – johndodo

+0

「許多驅動程序自動解決DBRefs」 - 這對我來說足夠引人注目。在大型數據庫結構中支持這種引用也更容易。我同意,對於你完全確定你在做什麼的小任務,使用直接引用就好了。 – lig

0

你提到的兩種方式都是一樣的意思。但他們有不同的用法。

存儲fkUid像'fkUid':{'_id':ObjectId('4ee12488f047051590000001')}一個對象有它自己的優點。讓我舉個例子,假設有一個網站,用戶可以發佈圖像並查看其他用戶發佈的圖像。但是,當顯示圖片時,網站還會顯示用戶的名稱/用戶名。通過使用這種方式,您還可以存儲詳細信息,如'fkUid':{'_id':ObjectId('4ee12488f047051590000001'), username: 'SOME_X'}。當您從數據庫獲取詳細信息時,您不必再次發送請求以獲取特定_id的用戶名。

在第二種方式'fkUid':ObjectId('4ee12488f047051590000001')} }中,您必須發送另一個請求到服務器,僅用於獲取名稱/用戶名,而其他任何東西都不會從同一個對象中使用。