新聞中心
這里有您想知道的互聯(lián)網營銷解決方案
MongoDB關系:文檔之間的關聯(lián)
MongoDB 中的關系表示多個文檔之間在邏輯上的相互聯(lián)系,文檔之間可以通過嵌入或引用來建立聯(lián)系,這種聯(lián)系可以是 1:1(1對1)、1:N(1對多)、N:1(多對1)、N:N(多對多)。例如我們要存儲用戶的收貨地址,一個用戶可以擁有多個收貨地址,從而形成 1:N 的關系。

創(chuàng)新互聯(lián)主要從事網站設計、成都網站建設、網頁設計、企業(yè)做網站、公司建網站等業(yè)務。立足成都服務肇東,十年網站建設經驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:13518219792
下面展示了一個記錄用戶信息的文檔的結構:
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "bianchengbang",
"phone": "15011226666",
"birth": "01-01-1991"
}
以下是記錄用戶地址的文檔結構:
{
"_id":ObjectId("52ffc4a5d85242602e000000"),
"place": "22 A, Indiana Apt",
"postcode": 123456,
"city": "Los Angeles",
"country": "California"
}
嵌入式關系
在嵌入式關系中,我們可以將記錄用戶地址的文檔嵌入到用戶文檔中,如下所示:
{
"_id" : ObjectId("603c8471f2c28d0fdf74ae78"),
"phone" : "15011226666",
"pincode" : "01-01-1991",
"name" : "bianchengbang",
"address" : [
{
"place" : "22 A, Indiana Apt",
"postcode" : 123456,
"city" : "Los Angeles",
"country" : "California"
},
{
"place" : "170 A, Acropolis Apt",
"postcode" : 456789,
"city" : "Chicago",
"country" : "Illinois"
}
]
}
這種將所有相關數(shù)據(jù)都保存在一個文檔中的方式,可以使得文檔的檢索和維護變的更加容易,當我們要查詢用戶地址時,可以像下面這樣:
> db.users.findOne({"name":"bianchengbang"},{"address":1})
{
"_id" : ObjectId("603c8471f2c28d0fdf74ae78"),
"address" : [
{
"place" : "22 A, Indiana Apt",
"postcode" : 123456,
"city" : "Los Angeles",
"country" : "California"
},
{
"place" : "170 A, Acropolis Apt",
"postcode" : 456789,
"city" : "Chicago",
"country" : "Illinois"
}
]
}
雖然這樣的結構在讀取數(shù)據(jù)時很方便,但這種數(shù)據(jù)結構也是有缺點的,當用戶和用戶地址不斷增加,數(shù)據(jù)量不斷變大時,會大大影響數(shù)據(jù)庫的讀寫性能。
引用式關系
引用式關系是設計數(shù)據(jù)庫時經常用到的方法,在這種方法中,用戶文檔和用戶地址文檔是分開的,通過引用文檔的 id 字段來建立它們之間的關系。如下所示:
{
"_id" : ObjectId("603c8471f2c28d0fdf74ae78"),
"phone" : "15011226666",
"pincode" : "01-01-1991",
"name" : "bianchengbang",
"address_ids" : [
ObjectId("603c8471f2c28d0fdf74ae79"),
ObjectId("603c8471f2c28d0fdf74ae80")
]
}
如上所示,在用戶文檔中包含一個 address_ids 字段,其中包含用戶地址文檔中相應的 ObjectId。使用這些 ObjectId,我們可以從用戶地址文檔中獲取地址的詳細信息。使用這種方法,我們將需要兩次查詢,第一次從用戶文檔中獲取 address_ids 字段,第二次從地址集合中獲取地址的詳細信息。
> var ids = db.users.findOne({"name":"bianchengbang"},{"address_ids":1})
> var addresses = db.address.find({"_id":{"$in":ids["address_ids"]}}).pretty()
> addresses
{
"_id" : ObjectId("603c9355f2c28d0fdf74ae79"),
"place" : "22 A, Indiana Apt",
"postcode" : 123456,
"city" : "Los Angeles",
"country" : "California"
}
{
"_id" : ObjectId("603c937bf2c28d0fdf74ae7a"),
"place" : "170 A, Acropolis Apt",
"postcode" : 456789,
"city" : "Chicago",
"country" : "Illinois"
}網頁題目:MongoDB關系:文檔之間的關聯(lián)
轉載來于:http://m.fisionsoft.com.cn/article/dpojjid.html


咨詢
建站咨詢
