MongoDB關聯關係


MongoDB中的關係表示各個文件在邏輯上的相互關聯。關係可以通過嵌入式和參照方法建模。 這種關係可以是1:11:NN:1N:N

假設有一種情況:要儲存使用者的地址。一個使用者可以擁有多個地址,這就是1:N關係。

以下是使用者(user)文件範例的文件結構 -

{
   "_id":10999110,
   "name": "Maxsu",
   "contact": "13888990021",
   "dob": "1992-10-11"
}

以下是地址(address)文件的範例文件結構 -

{
   "_id":12200,
   "building": "Hainan Building NO.2100",
   "pincode": 571100,
   "city": "Haikou",
   "province": "Hainan"
}

嵌入式關係建模

在嵌入式方法中,我們將地址(address)文件嵌入到使用者(user)文件中。

{
   "_id": 21000100,
   "contact": "13800138000",
   "dob": "1991-11-11",
   "name": "Maxsu",
   "address": [
      {
         "building": "Hainan Building NO.2100",
         "pincode": 571100,
         "city": "Haikou",
         "province": "Hainan"
      },
      {
         "building": "Sanya Building NO.2100",
         "pincode": 572200,
         "city": "Sanya",
         "province": "Hainan"
      },
   ]
}

該方法將所有相關資料儲存在單個文件中,這使得檢索和維護更容易。可以使用單個查詢來在整個文件檢索,例如 -

> db.users.findOne({"name":"Maxsu"},{"address":1, "name":1})

請注意,在上述查詢中,dbusers分別是資料庫和集合。缺點是如果嵌入式文件的大小如果不斷增長,可能會影響讀/寫效能。

建模參考關係

這是設計規範化關係的方法。 在這種方法中,使用者和地址檔案將分別維護,但使用者文件將包含一個將參照地址文件的id欄位的欄位。

{
   "_id":ObjectId("52ffc33321332111sdfaf"),
   "contact": "13800138000",
   "dob": "1991-11-11",
   "name": "Maxsu",
   "address_ids": [
      ObjectId("123123"),
      ObjectId("123412")
   ]
}

如上所示,使用者文件包含對應地址的ObjectId的陣列欄位address_ids。 使用這些ObjectIds,我們可以從那裡查詢地址檔案並獲取地址詳細資訊。 使用這種方法,需要兩個查詢:首先從使用者文件獲取address_ids欄位,然後從地址集中獲取這些地址。

>var result = db.users.findOne({"name":"Maxsu"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})