MongoDB - 親係

你好,有志於编程的們!今天,我們將要深入 MongoDB 親係的迷人世界。作為你們友好的鄰居計算機科學老師,我非常興奮能夠帶領你們開展這次旅行。如果你是編程新手,別擔心——我們會從基礎開始,逐步學習。所以,來一杯咖啡(或你喜歡的飲料),我們開始吧!

MongoDB - Relationships

了解 MongoDB 親係

在我們深入細節之前,讓我們先來談談在數據庫語境中親係意味著什麼。想像你正在組織一個大型家族聚會。你擁有家族成員的信息、他們的地址以及他們帶來的百家樂菜肴。你會如何組織所有這些數據?這就是親係的用處!

在 MongoDB 中,我們有兩種主要方式來表示數據之間的親係:

  1. 嵌入式親係
  2. 參考式親係

讓我們詳細探索這兩種方法。

建模嵌入式親係

嵌入式親係就像套娃一樣——你將小的信息片段放入大的信息中。當你擁有緊密相關且經常一起訪問的數據時,這種方法非常完美。

範例:家族成員與他們的寵物

讓我們假設我們想要存儲家族成員和他們寵物的信息。以下是如何使用嵌入式親係來實現這一點:

db.familyMembers.insertOne({
name: "John Doe",
age: 35,
pets: [
{ name: "Fluffy", type: "貓", age: 3 },
{ name: "Rex", type: "狗", age: 5 }
]
})

在這個範例中,我們直接在家族成員文件中嵌入了寵物信息。讓我們分解一下:

  • 我們正在將一個文件插入到 familyMembers 集合中。
  • 文件包含有關 John Doe 的基本信息。
  • pets 字段是一個包含 John 每個寵物的文件的數組。

這種結構非常好,因為我們可以通過單一查詢輕鬆地检索有關 John 和他寵物的所有信息:

db.familyMembers.findOne({ name: "John Doe" })

當使用嵌入式親係

嵌入式親係在以下情況下非常理想:

  1. 嵌入數據總是與父文件一起訪問。
  2. 嵌入數據對於父數據是特定的,並不需要獨立查詢。
  3. 嵌入數據相對較小,不會無限制地增長。

請記住,在 MongoDB 中,單個文件不能超過 16MB。所以,如果你處理的是可能非常大的嵌入數據,你可能需要考慮使用參考式親係。

建模參考式親係

參考式親係就像為你的家族聚會創建一個賓客名單。不是把所有信息放在一個地方,而是分開保存名單,在需要時引用。

範例:家族成員與他們的地址

讓我們建模一個場景,我們想要存儲家族成員和他們的地址,但我們預期地址可能在多個家族成員之間共享:

// 首先,我們插入一個地址
db.addresses.insertOne({
_id: ObjectId(),
street: "123 主街",
city: "Anytown",
state: "CA",
zipCode: "12345"
})

// 现在,我們插入一個家族成員,並引用地址
db.familyMembers.insertOne({
name: "Jane Doe",
age: 32,
addressId: ObjectId("...") // 地址文件的 ObjectId
})

在這個範例中:

  1. 我們首先將一個地址插入到 addresses 集合中。
  2. 然后,我們將一個家族成員插入到 familyMembers 集合中,僅存儲地址的 ObjectId。

要检索 Jane 的完整信息,包括她的地址,我們需要進行查找:

db.familyMembers.aggregate([
{ $match: { name: "Jane Doe" } },
{ $lookup: {
from: "addresses",
localField: "addressId",
foreignField: "_id",
as: "address"
}}
])

這個查詢:

  1. 匹配 Jane Doe 的文件。
  2. 执行查找以連接地址信息。

當使用參考式親係

參考式親係在以下情況下非常有益:

  1. 相關數據很大,如果嵌入可能會超出 16MB 的文件大小限制。
  2. 相關數據在多個文件中共享,並需要在多個地方更新。
  3. 你需要獨立查詢相關數據。

嵌入式與參考式親係的比較

讓我們在方便的表格中總結關鍵差異:

方面 嵌入式親係 參考式親係
數據位置 在同一個文件中 分開的文件
查詢性能 查詢相關數據更快 需要額外的查找
數據重複 可能導致數據重複 减少數據重複
更新複雜性 文件內部的更新更簡單 可能需要在多個文件間進行更新
靈活性 對於共享數據較不靈活 對於跨文件數據共享更靈活
文件大小 受 16MB 文件大小限制 可以處理更大的相關數據集

結論

好了,各位!我們已經穿越了 MongoDB 親係的土地,探索了嵌入式和參考式親係。記住,沒有一種萬能的解決方案——最好的方法取決於你的具體使用案例。

當你繼續你的 MongoDB 冒險時,請記住這些概念:

  1. 嵌入式親係對於緊密相關且經常訪問的數據非常適合。
  2. 當處理共享或大量數據時,參考式親係閃耀。
  3. 決定兩者之間的選擇時,總是考慮你的查詢模式和數據增長。

實踐出真知,所以不要害怕嘗試不同的模型。誰知道?你也許會成為下一次家族聚會中的家族數據組織專家!

快樂編程,願你的數據庫總是和諧完美!

Credits: Image by storyset