高性能MySql笔记(2)-范式和反范式

范式和反范式

设计关系型数据库时,需要遵从不同的规范,设计合理的关系型数据库,不同的规范被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余约小。在关系型数据库中有六中范式:第一范式(1NF),第二范式(2NF),第三范式(3NF),BCNF,第四范式(4NF),第五范式(5NF)。一般数据库设计到第三范式就行了。

第一范式

1NF是对属性的原子性约束,要求属性具有原子性,不可分。属性不可分

下面这个例子就不满足第一范式:

姓名

年龄

地址

KCHE

24

省份          城市

S               N

上面这个例子就不满足第一范式,所以对于任意的关系型数据库都不能存储。

第二范式

2NF是对记录的唯一性约束,要求记录具有唯一的标识,即实体的唯一性。非主属性完全依赖于码。(消除非主属性对码的部分依赖)

主属性:通俗的说就是码。

非主属性:不包含在任何码中的属性。

一个关系模式不满足2NF就会产生以下几个问题:

(1)插入异常,例如有一张表slc(stu_id, dept, loc, c_id, grade ). slc的码为(stu_id, c_id)。Stu_id:学号,dept:系别,loc:系地点,c_id:课程号,grade_年级。如果插入一个学生stu_id=s1dept=CS, loc=HY, 但是该学生并没有选课,则该学生信息无法插入到表中。

(2)删除异常,如果学生s1选了c1这门课,但是又不想选了,需要删除c1这个数据项,因为c1是主属性,所以删除的话,整个s1的信息都会被删除,即不应该删除的信息也删除了。

(3)修改复杂,如果学生从计算机系转到数学系,则不仅需要修改dept,还需要修改loc

上述情况可以分解成两个表:

sl(stu_id,dept,loc)sc(stu_id, c_id, grade)

第三范式

对字段冗余性的约束,即任何字段不能由其它字段派生出来,要求字段没有冗余。

消除传递依赖。(消除非主属性对码的传递依赖)

例如表sl(stu_id,dept,loc)。知道一个系dept,就可以知道系地址loc,所以dept->loc存在传递依赖。

消除传递依赖可以使用将其分成两张表: sd(stu_id,dept)dl(dept,loc)

BCNF

每个属性都不传递依赖于码,主属性不依赖与主属性。(消除主属性对码的部分依赖和传递依赖)

第四范式

要求同一个表内的多对多关系删除。

第五范式

从最终结构重新建立原始结构

范式的优点和缺点

优点:

(1)范式化的更新操作比反范世化要快。

(2)数据较好的范式化时,表内冗余的数据较少,需要修改更少的数据

(3)范式化的表通常更小,可以放在内存操作,速度更快

(4)很少具有重复的数据,则检索表时更少需要DISTINCTGROUP BY语句

缺点:

通常需要关联,可能会使一些索引策略失效。

反范式化的优点和缺点

所有的数据都存储在一张表中,可以很好的避免关联。能够使用更有效的索引策略。

混用反范式化和范式化

常见的反范式化数据的方法是复制和缓存,在不同的表中存储相同的列。

 


你可能感兴趣的:(MYSQL数据库)