今天看啥  ›  专栏  ›  周行知

MySQL 逆范式

周行知  · 简书  ·  · 2019-01-20 08:43

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

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;



Category  cat_id    name  

                  2003      手机

create table Category1(


name varchar(33) not null,

cat_id int(11) not null


)engine =innodb charset=utf8;


需求:

计算每个分类下商品数量是多少?
select c.cat_id,c.name,count(c.*) from category1 as c left join goods1 as  g on g.cat_id=c.cat_id;


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

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

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

解决方法:

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

优化后sql语句

select cat_id,name,goods_num from category

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

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

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




原文地址:访问原文地址
快照地址: 访问文章快照