mysql 逆范式化,MySQL 逆范式

数据库设计需要遵守三范式

1.原子性

数据不可以再分割

2.数据没有冗余

Order -goods

id a   编号相同  下单时间 商品信息1 商品价格 商品产地

id b   编号相同  下单时间 商品信息2 商品价格 商品产地

id  c   编号相同  下单时间 商品信息 3 商品价格 商品产地

如果order中无需写入商品价格 商品产地 下单时间与goods表重复

3.数据表每个字段与当前表的主键产生直接关联(非间接关联)

userid  name height weight orderid 编号 订单时间

评析:编号 订单时间是与此表不是直接关联的

优化:

设计三张表

表1:userid  name height weight

表2:userid   orderid

表3:orderid 编号 订单时间

例1 一个逆范式的例子

商品表Goods1与分类表Category1

Goods1:id      name     cat_id       price

101     海尔冰箱   2003   6000

分析:

建表

create table Goods1(

id int(11) not null primary key auto_increment,

name varchar(33) not null,

cat_id  int(11) not null,

price   mediumint unsigned not null

)engine =innodb charset=utf8;

14ed5d9f77f3

Category  cat_id    name

2003      手机

create table Category1(

name varchar(33) not null,

cat_id int(11) not null

)engine =innodb charset=utf8;

14ed5d9f77f3

需求:

计算每个分类下商品数量是多少?

select c.cat_id,c.name,count(c.*) from category1 as c left join goods1 as  g on g.cat_id=c.cat_id;

14ed5d9f77f3

上表sql语句是一个多表查询,并且还有count的聚合计算

如果这样的需求很多,类似sql语句查询速度没有优势,

如果需要查询速度的提高,最好设置单表查询,并且没有聚合计算

解决方法:

给Category表增加一个商品数量的字段goods_num

优化后sql语句

select cat_id,name,goods_num from category

但是需要维护额外的工作:

goods商品增加,减少数据都需要维护goods_num字段的信息

增加一个字段做聚合计算获得。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值