簡體   English   中英

如何在MongoDB中建模多對多關系(對於MySQL用戶)

[英]How to model many-to-many relationships in MongoDB (for a MySQL user)

我來自MySQL背景,我試圖圍繞MongoDB 特別是,我正在努力構思我應該如何建模n:n關系“Mongo方式”。

對於這個例子,假設我們有兩個collectionsusersinterests 我們需要能夠在數據中表示或查詢幾件事:

  • 用戶的興趣
  • 用戶的興趣評級,例如“喜歡”或“不喜歡”
  • 具有特定興趣的用戶
  • 每個利息評級的計數器(可遞增/遞減)
  • 利息名稱

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM