范式化和反范式化
范式化是指数据库设计的规范,目前说到范式化一般是指第三设计范式,也就是要求数据表中不存在非关键字段对任意候选关键字段的传递函数依赖,则符合第三范式。
呵呵,这说了个嘛玩意哈/(ㄒoㄒ)/~~,直接举例:
商品名称 价格 重量 有效期 分类 分类描述
可乐 3.00 250ml 2015.10 饮料 碳酸饮料
苹果 5.00 100g 2015.10 水果 新鲜水果
分类和分类描述相对于商品名称来说,他们是存在着依赖关系的,分类描述依赖于分类,而分类依赖于商品名称,也就是说存在非关键字段“分类描述”对关键字段“商品名称”的传递函数依赖,这就造成了很多的麻烦,比如进行增删改操作的时候。这就需要对表进行拆分,将分类和描述单独列出来。
1.
商品名称 价格 重量 有效期
可乐 3.00 250ml 2015.10
苹果 5.00 100g 2015.10
2.
分类 分类描述
酒水饮料 碳酸饮料
生鲜食品 水果
3.
分类 商品名称
酒水饮料 可乐
生鲜食品 苹果
这样将一个表一分为三之后就符合了第三范式要求。
反范式化
反范式化是指为了查询效率的提高把原本符合第三范式的表适当的增加冗余,以达到优化查询效率的目的,反范式化是一种以空间换时间的操作。
这个就不举列子了,简单的说,就是本来需要关联很多表的查询,把他们写到一张表中,这样只需要查一张表就可以了,虽然增加了数据冗余,但执行效率快了很多,说白了,少关联一些表。
表的垂直拆分
所谓垂直拆分,就是把原来一个很多列的表拆分成多个表,这解决了表的宽度问题,通常垂直拆分何以按照以下原则进行:
1. 把不常用的字段单独放到一个表中
2. 把大字段独立存放到一个表中
3. 把经常一起使用的字段放到一起
这个之前也有提到,不用多说。
表的水平拆分
表的水平拆分主要是为了解决单张表数据量过大的问题,水平拆分的表每一个表的结构都是完全一致的。
常用的水平拆分方法为:
对customer_id进行hash运算,如果要查分成5个表,则使用mod(customer_id,5)取出0-4个值
2. 针对不同的hashID把数据存到不同的表中
挑战:1. 跨分区表进行数据查询 2. 统计及后台报表操作。