我剛開始接觸MongoDB
(遲到了,我知道...)許多一對多的DB
我仍然試圖讓10歲以上的關係DBing的從我的頭在思考文檔設計時。
可以說我有很多用戶使用很多應用程序。任何用戶都可以使用多個應用程序,任何應用程序都可以被任意數量的用戶使用。
在登錄過程中,我想訪問用戶使用的所有應用程序。在另一個程序中,我希望獲得特定應用程序的所有用戶。
我應該只是有重複的數據?也許在App文檔中有一組用戶,並且在用戶文檔中有一組應用程序?這有意義嗎?這是文檔數據庫中的傳統方法嗎?
我剛開始接觸MongoDB
(遲到了,我知道...)許多一對多的DB
我仍然試圖讓10歲以上的關係DBing的從我的頭在思考文檔設計時。
可以說我有很多用戶使用很多應用程序。任何用戶都可以使用多個應用程序,任何應用程序都可以被任意數量的用戶使用。
在登錄過程中,我想訪問用戶使用的所有應用程序。在另一個程序中,我希望獲得特定應用程序的所有用戶。
我應該只是有重複的數據?也許在App文檔中有一組用戶,並且在用戶文檔中有一組應用程序?這有意義嗎?這是文檔數據庫中的傳統方法嗎?
根據你的情況,你不需要有重複的數據。由於它是多對多的關係,並且數據會不斷變化,所以您需要使用文檔引用而不是文檔嵌入。
所以,你將有兩個類別:
應用集:
{
_id : appId,
app_name : "appname",
// other property of app
users : [userid1, userid2]
}
用戶收集:
{
_id : userId,
// other details of user
apps: [appid1, appid2, ..]
}
正如你所說,你需要有用戶的陣列應用集&陣列用戶集合中的應用程序。
當您在客戶端獲取數據時,首先當用戶登錄時,您將從用戶文檔中獲取應用程序ID數組。
然後,再次使用應用程序ID,您需要查詢應用程序集合中的應用程序詳細信息。
在我們使用參考文獻的情況下,此往返將會在那裏。但是你可以通過具有適當的索引來緩存細節&來提高性能。
這是傳統的mongodb多對多的關係
好問題!
您有許多場景。 在Mongo中,你可以用很多方式解決這個問題: 使用類似於SQL或有數組的查找表。 你應該考慮的是索引,和SQL一樣,但是這次你有更多的選擇。 由於其多對多的情況下,我可能會去查找表。 這是獲取用戶的應用和應用用戶的最有效方式。 對於動態值而言,數組不適用於動態值,尤其是如果您需要兩個數組字段(app/user),而app.users數組字段將經常更改。 缺點是你可以「加入」,並且必須從兩個表中「選擇」數據,並自己進行「加入」,但這不應該成爲問題,尤其是因爲你總是可以緩存結果(本地緩存在你的應用程序)和蒙戈得到的結果是超級快,如果你將默認爲user字段添加索引
{
_id: "<appID>_<userID>" ,
user: "<userID>"
}
_id索引。應該爲「用戶」字段創建另一個索引,然後Mongo將把btree加載到內存中,並且你都很好。
謝謝。這正是我想到的。我只是想檢查這是否是mongodb使用的可接受模式。 –