[英]How to model many-to-many relationships in MongoDB (for a MySQL user)
我來自MySQL
背景,我試圖圍繞MongoDB
。 特別是,我正在努力構思我應該如何建模n:n
關系“Mongo方式”。
對於這個例子,假設我們有兩個collections
: users
和interests
。 我們需要能夠在數據中表示或查詢幾件事:
在MySQL
,我會創建一個在用戶ID 和興趣ID上編入索引的users_interests
表。 對於計數器,我會為每種評級類型設置單獨的列,並且每次用戶對興趣進行評級/未評級時,都要完成一項事務以確保計數永遠不會錯誤。
我試過閱讀一些架構設計 ,但無濟於事。
你能幫助失落的靈魂找到方向嗎?
好問題。 讓我先概述一下N:N關系的工作原理,然后我將詳細介紹每個要點。
在MySQL中N:N通常您的數據透視表與您的用戶和興趣(user_interests表)之間存在關聯。 在mongo你這樣做有點不同。 您仍然擁有用戶和興趣集合,但現在,您可以存儲用戶感興趣的密鑰列表。 這樣的事情:
User Collection {
"name":"Josh",
"user":"jsmith",
"interests":[
{
"_id":12345,
"rating":"like"
},
{..}..
]
}
通過將您的興趣存儲在您感興趣的表格中的關鍵列表中,您可以執行所需的每項操作。 如果您想進行查詢,可以根據興趣表中的ID進行查詢,然后使用$ in修飾符進行查詢。
現在為了您的興趣收集我會做以下事情:
User Interest {
"_id":objectId
"label":"Swimming",
"count":intValue
}
當向用戶文檔添加興趣時,count變量將取決於您的評級的定義。 如果您將評級存儲在單獨的區域(或邏輯)中,那么您分配給它們的值將與您感興趣的int值相關。 IE:用戶對它進行評級(值為1)然后將計數值加1。
希望這是有用的,至少帶來了一些關於如何構建它的其他想法!
祝你好運,記住MONGO真棒。
為了維護每個興趣的評級的全局計數,您將需要一個單獨的獨立集合,您可以使用原子更新運算符更新(添加或減少)評級,以及當用戶執行感興趣/不喜歡的操作時。
您可以將每個用戶的興趣存儲為User集合本身的子文檔數組。
此數據的JSON結構類似於:
db.User
{
name: 'joe',
....,
interests : [{ name: 'swimming', rating: 10},
{ name: 'cooking', rating: 22 }
]
}
現在您可以使用以下命令查詢內部鍵:
> db.User.find( { "interests.name" : "cooking" } )
這將返回特別感興趣的用戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.