MongoDB - 親係
你好,有志於编程的們!今天,我們將要深入 MongoDB 親係的迷人世界。作為你們友好的鄰居計算機科學老師,我非常興奮能夠帶領你們開展這次旅行。如果你是編程新手,別擔心——我們會從基礎開始,逐步學習。所以,來一杯咖啡(或你喜歡的飲料),我們開始吧!
了解 MongoDB 親係
在我們深入細節之前,讓我們先來談談在數據庫語境中親係意味著什麼。想像你正在組織一個大型家族聚會。你擁有家族成員的信息、他們的地址以及他們帶來的百家樂菜肴。你會如何組織所有這些數據?這就是親係的用處!
在 MongoDB 中,我們有兩種主要方式來表示數據之間的親係:
- 嵌入式親係
- 參考式親係
讓我們詳細探索這兩種方法。
建模嵌入式親係
嵌入式親係就像套娃一樣——你將小的信息片段放入大的信息中。當你擁有緊密相關且經常一起訪問的數據時,這種方法非常完美。
範例:家族成員與他們的寵物
讓我們假設我們想要存儲家族成員和他們寵物的信息。以下是如何使用嵌入式親係來實現這一點:
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" })
當使用嵌入式親係
嵌入式親係在以下情況下非常理想:
- 嵌入數據總是與父文件一起訪問。
- 嵌入數據對於父數據是特定的,並不需要獨立查詢。
- 嵌入數據相對較小,不會無限制地增長。
請記住,在 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
})
在這個範例中:
- 我們首先將一個地址插入到
addresses
集合中。 - 然后,我們將一個家族成員插入到
familyMembers
集合中,僅存儲地址的 ObjectId。
要检索 Jane 的完整信息,包括她的地址,我們需要進行查找:
db.familyMembers.aggregate([
{ $match: { name: "Jane Doe" } },
{ $lookup: {
from: "addresses",
localField: "addressId",
foreignField: "_id",
as: "address"
}}
])
這個查詢:
- 匹配 Jane Doe 的文件。
- 执行查找以連接地址信息。
當使用參考式親係
參考式親係在以下情況下非常有益:
- 相關數據很大,如果嵌入可能會超出 16MB 的文件大小限制。
- 相關數據在多個文件中共享,並需要在多個地方更新。
- 你需要獨立查詢相關數據。
嵌入式與參考式親係的比較
讓我們在方便的表格中總結關鍵差異:
方面 | 嵌入式親係 | 參考式親係 |
---|---|---|
數據位置 | 在同一個文件中 | 分開的文件 |
查詢性能 | 查詢相關數據更快 | 需要額外的查找 |
數據重複 | 可能導致數據重複 | 减少數據重複 |
更新複雜性 | 文件內部的更新更簡單 | 可能需要在多個文件間進行更新 |
靈活性 | 對於共享數據較不靈活 | 對於跨文件數據共享更靈活 |
文件大小 | 受 16MB 文件大小限制 | 可以處理更大的相關數據集 |
結論
好了,各位!我們已經穿越了 MongoDB 親係的土地,探索了嵌入式和參考式親係。記住,沒有一種萬能的解決方案——最好的方法取決於你的具體使用案例。
當你繼續你的 MongoDB 冒險時,請記住這些概念:
- 嵌入式親係對於緊密相關且經常訪問的數據非常適合。
- 當處理共享或大量數據時,參考式親係閃耀。
- 決定兩者之間的選擇時,總是考慮你的查詢模式和數據增長。
實踐出真知,所以不要害怕嘗試不同的模型。誰知道?你也許會成為下一次家族聚會中的家族數據組織專家!
快樂編程,願你的數據庫總是和諧完美!
Credits: Image by storyset