我们先来看一下查询出来的专题内容:
它包含 id、name、description、products、topic_img、head_img 这几个字段。
{
"id": 1,
"name": "专题栏位一",
"description": "美味水果世界",
"products": [
{
"id": 2,
"name": "梨花带雨 3个",
"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个",
"price": "0.01",
"stock": 995,
"main_img_url": "/product-dryfruit@3.png",
"summary": null,
"img_id": 36
},
{
"id": 10,
"name": "万紫千凤梨 300克",
"price": "0.01",
"stock": 996,
"main_img_url": "/product-dryfruit@5.png",
"summary": null,
"img_id": 38
},
{
"id": 12,
"name": "珍奇异果 3个",
"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"
}
}
细心观察 products 字段我们就会发现里面除了包含 img_id 还包含了 main_img_url 字段,因为我们也可以通过 img_id 关联 img 表查询出来对应的 url,所以这里构成了数据冗余。这里使用数据冗余设计表的原因是为了避免产生多层嵌套查询而降低查询的效率。这里我们的 theme 表已经和 products 表嵌套进行关联查询,如果 products 下继续嵌套 img,假如这个主题有 100 个 products(对于一个主题来说这很寻常,因为这是一个不确定数量的数据集)就会导致查询速度变慢,使用数据冗余是一个解决方案。
下面我们总结一下该在什么情况下合理运用数据冗余:
- 该数据结构在很多地方都需要用到。
- 数量是不可控的数据集。
一定不能滥用数据冗余的原因:
对于数据的完整性和一直性的维护时十分困难的。删除和更新数据时需要同时更改两个地方,否则会产生数据不一致。