新聞中心

創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)肇東,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
下面展示了一個(gè)記錄用戶信息的文檔的結(jié)構(gòu):
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "bianchengbang",
"phone": "15011226666",
"birth": "01-01-1991"
}
以下是記錄用戶地址的文檔結(jié)構(gòu):
{
"_id":ObjectId("52ffc4a5d85242602e000000"),
"place": "22 A, Indiana Apt",
"postcode": 123456,
"city": "Los Angeles",
"country": "California"
}
嵌入式關(guān)系
在嵌入式關(guān)系中,我們可以將記錄用戶地址的文檔嵌入到用戶文檔中,如下所示:
{
"_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"
}
]
}
這種將所有相關(guān)數(shù)據(jù)都保存在一個(gè)文檔中的方式,可以使得文檔的檢索和維護(hù)變的更加容易,當(dāng)我們要查詢用戶地址時(shí),可以像下面這樣:
> 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"
}
]
}
雖然這樣的結(jié)構(gòu)在讀取數(shù)據(jù)時(shí)很方便,但這種數(shù)據(jù)結(jié)構(gòu)也是有缺點(diǎn)的,當(dāng)用戶和用戶地址不斷增加,數(shù)據(jù)量不斷變大時(shí),會(huì)大大影響數(shù)據(jù)庫(kù)的讀寫性能。
引用式關(guān)系
引用式關(guān)系是設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)經(jīng)常用到的方法,在這種方法中,用戶文檔和用戶地址文檔是分開(kāi)的,通過(guò)引用文檔的 id 字段來(lái)建立它們之間的關(guān)系。如下所示:
{
"_id" : ObjectId("603c8471f2c28d0fdf74ae78"),
"phone" : "15011226666",
"pincode" : "01-01-1991",
"name" : "bianchengbang",
"address_ids" : [
ObjectId("603c8471f2c28d0fdf74ae79"),
ObjectId("603c8471f2c28d0fdf74ae80")
]
}
如上所示,在用戶文檔中包含一個(gè) address_ids 字段,其中包含用戶地址文檔中相應(yīng)的 ObjectId。使用這些 ObjectId,我們可以從用戶地址文檔中獲取地址的詳細(xì)信息。使用這種方法,我們將需要兩次查詢,第一次從用戶文檔中獲取 address_ids 字段,第二次從地址集合中獲取地址的詳細(xì)信息。
> 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關(guān)系:文檔之間的關(guān)聯(lián)
瀏覽地址:http://www.5511xx.com/article/dpojjid.html


咨詢
建站咨詢
