如果全部符合一二三范式,会使表数目增大很多,关系非常复杂。例如快递地址要拆分为四张表:
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.不合理的反范式设计会让表变得臃肿不堪
总结:渐近式的反范式设计,假设几个高频访问的字段,放入单表查询当中,如果发现这些字段不足以支撑单表查询,不断增加字段。