2012-02-23 57 views
19

在MongoDB中使用DBREF datatype,文檔可能如下所示。但是,每行中的$ref字段感覺是多餘的,因爲每行都明顯指向users集合。MongoDB - 是DBREF必需的嗎?

有沒有辦法引用其他文件,而沒有多少有點多餘$ref -field?

{ 
    $id: {$oid : "4f4603820e25f4c515000001"}, 
    title: "User group", 
    users: [ 
     {_id: {$ref: "users", $id: { $oid: "4f44af6a024342300e000002"}}, isAdmin: true } 
    ] 
], 
+4

是否有任何特定的原因,你爲什麼不使用簡單的直接/手動鏈接(只是把ObjectId如下建議)? – 2012-02-23 11:51:27

回答

31

Dbref在我看來應該避免使用mongodb時,至少如果您需要可擴展性的大系統。

據我所知,所有的驅動程序都提出了額外的請求來加載DBRef,所以它不是'加入'在數據庫中,它是非常昂貴的。

有沒有一種方法可以引用其他文件,而不需要多餘的$ ref-field? ?

是,保留引用在腦海中,創建「外鍵」(類似RefUserId或只是用戶ID)命名約定和存儲只是引用文件的ID。在需要時自行加載參考文件。對於任何非規範化,嵌入你也可以這樣做,因爲它通常會大大提高性能。

+3

這不是使用DBRef或者僅僅是_id的真正問題,而是如何使用鏈接語義來解決它們。如果你有不同的引用(多個集合),那麼你將需要集合和_id == DBRef。 – 2012-02-23 15:30:34

+1

只需重複Scott一點:如果您在同一個集合中引用對象,則可以使用ObjectId字段 – 2012-02-23 18:22:10

+0

,以便將來更新的代價更高?因爲更新沒有引用需要更新整個收藏嗯? – 2015-11-15 13:02:26

6

除非您使用驅動程序特定的方法訪問dbref,否則應該沒有必要。

在手動管理連接的情況下(即您知道要「連接」到的其他集合),僅存儲ObjectId就足夠了。

2

docs

Manual references是一種替代,和the docs say手冊參考文獻是優選DBREFS(though I'm not sure why)。 當引用的對象位於另一個數據庫中或集合名稱不會很明顯時,DBREF很有用。

非規範化/嵌入比任何類型的鏈接更可取,因爲這樣你就可以獲得原子更新並且不需要重新查詢相關數據。