如果全部符合一二三范式,会使表数目增大很多,关系非常复杂。例如快递地址要拆分为四张表:
address_id | address | town_id |
1 | XX小区 | 1 |
town_id | town | city_id |
1 | 长安区 | 1 |
prov_id | province |
1 | 河北省 |
city_id | city | prov_id |
1 | 石家庄 | 1 |
查找地址的SQL语句如下:
SELECT
a.*,p.province,c.city,t.town
FROM
Address a, province p, city c, town t
WHERE
a.town_id = t.town_id and
t.city_id = c.city_id and
c.prov_id = p.prov_id
反范式设计:
address_id | address | prov_id | city_id | town_id | province | city | town |
1 | XX小区 | 1 | 1 | 1 | 河北省 | 石家庄 | 长安区 |
SELECT a.* FROM address a
反范式设计的优缺点:
1.单表查询易于优化,易于管理
2.SQL语句简单,有利于程序开发,团队协作
3.存在数据冗余,更新操作时需要额外更新冗余数据
4.不合理的反范式设计会让表变得臃肿不堪
总结:渐近式的反范式设计,假设几个高频访问的字段,放入单表查询当中,如果发现这些字段不足以支撑单表查询,不断增加字段。