mysql 表的范式化_数据库MySQL-数据库表的范式化优化

2、数据库表的范式化优化

1、表范式化

范式化是指数据库设计的规范,目前说道范式化一般是指第三设计范式。也就是要求数据表中不存在非关键字段对任意候选关键字段的传递函数依赖则符合第三范式。

bc21232c59e65e9626d92b44c72ad686.png

存在以下传递函数依赖关系:

(商品名称)->(分类)->(分类描述)

也就是说存在非关键字段 “分类描述”对关键字段“商品名称”的传递函数依赖。

不符合第三范式要求的表存在以下问题:

1、数据冗余:(分类,分类描述)对于每一个商品都会进行记录。

2、数据的插入异常

3、数据的更新异常

4、数据的删除异常(删除所有数据,分类和分类描述都会删除,没有所有的记录)

如何转换成符合第三范式的表(拆分表):

将原来的不符合第三范式的表拆分为3个表

商品表、分类表、分类和商品的关系表

d47d103ede61b8bd6650b293b8c24068.png

2、反范式化

反范式化是指为了查询效率的考虑把原本符合第三范式的表“适当”的增加冗余,以达到优化查询效率的目的,反范式化是一种以空间来换取时间的操作。

f6a090bbef26a50f207aa24bce488d55.png

如何查询订单信息

select b.用户名,b.电话,b.地址,a.订单ID,sum(c.商品价格*c.商品数量)as 订单价格

from 订单表 as a

join 用户表 as b on a.用户ID=b.订单ID

join 订单商品表 as c on c.订单ID=b.订单ID

group by b.用户名,b.电话,b.地址,a.订单ID

对于这样的表结构,对于sum(),group by会产生临时表,增加IO量。我们怎么优化都效率不高,那我们怎么样才能让它效率高了,就需要一些字段进行冗余。

86148b2f49ff56a86eca6ee6b9a7b196.png

订单表中增加了冗余字段,那SQL该怎么写了?

select a.用户名,a.电话,a.地址,a.订单ID,a.订单价格

from 订单表 as a

说明:表结构的设计直接涉及到SQL的查询效率及优化。

本文同步分享在 博客“cwl_java”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值