我們先來(lái)看一下查詢出來(lái)的專題內(nèi)容:
它包含 id锦针、name弟蚀、description拌消、products挑豌、topic_img、head_img 這幾個(gè)字段墩崩。
{
"id": 1,
"name": "專題欄位一",
"description": "美味水果世界",
"products": [
{
"id": 2,
"name": "梨花帶雨 3個(gè)",
"price": "0.01",
"stock": 984,
"main_img_url": "/product-dryfruit@1.png",
"summary": null,
"img_id": 10
},
{
"id": 5,
"name": "春生龍眼 500克",
"price": "0.01",
"stock": 995,
"main_img_url": "/product-dryfruit@2.png",
"summary": null,
"img_id": 33
},
{
"id": 8,
"name": "夏日芒果 3個(gè)",
"price": "0.01",
"stock": 995,
"main_img_url": "/product-dryfruit@3.png",
"summary": null,
"img_id": 36
},
{
"id": 10,
"name": "萬(wàn)紫千鳳梨 300克",
"price": "0.01",
"stock": 996,
"main_img_url": "/product-dryfruit@5.png",
"summary": null,
"img_id": 38
},
{
"id": 12,
"name": "珍奇異果 3個(gè)",
"price": "0.01",
"stock": 999,
"main_img_url": "/product-dryfruit@7.png",
"summary": null,
"img_id": 40
}
],
"topic_img": {
"url": "http://z.cn/images/1@theme.png"
},
"head_img": {
"url": "http://z.cn/images/1@theme-head.png"
}
}
細(xì)心觀察 products 字段我們就會(huì)發(fā)現(xiàn)里面除了包含 img_id 還包含了 main_img_url 字段氓英,因?yàn)槲覀円部梢酝ㄟ^(guò) img_id 關(guān)聯(lián) img 表查詢出來(lái)對(duì)應(yīng)的 url,所以這里構(gòu)成了數(shù)據(jù)冗余鹦筹。這里使用數(shù)據(jù)冗余設(shè)計(jì)表的原因是為了避免產(chǎn)生多層嵌套查詢而降低查詢的效率债蓝。這里我們的 theme 表已經(jīng)和 products 表嵌套進(jìn)行關(guān)聯(lián)查詢,如果 products 下繼續(xù)嵌套 img盛龄,假如這個(gè)主題有 100 個(gè) products(對(duì)于一個(gè)主題來(lái)說(shuō)這很尋常,因?yàn)檫@是一個(gè)不確定數(shù)量的數(shù)據(jù)集)就會(huì)導(dǎo)致查詢速度變慢芳誓,使用數(shù)據(jù)冗余是一個(gè)解決方案余舶。
下面我們總結(jié)一下該在什么情況下合理運(yùn)用數(shù)據(jù)冗余:
- 該數(shù)據(jù)結(jié)構(gòu)在很多地方都需要用到。
- 數(shù)量是不可控的數(shù)據(jù)集锹淌。
一定不能濫用數(shù)據(jù)冗余的原因:
對(duì)于數(shù)據(jù)的完整性和一直性的維護(hù)時(shí)十分困難的匿值。刪除和更新數(shù)據(jù)時(shí)需要同時(shí)更改兩個(gè)地方,否則會(huì)產(chǎn)生數(shù)據(jù)不一致赂摆。