Mysql三范式

范式,就是指设计数据库需要(应该)遵循的原则。

每个范式,都是用来规定某种结构或数据要求——后一范式都是在前一范式已经满足的情况用来“加强要求”。

第一范式(1NF):原子性

存储的数据应该不可以再分。

Mysql三范式

上图的学生这一字段的数据还是可以拆分的,应该如下图:

Mysql三范式

第二范式(2NF):唯一性

需要实现每一行数据具有唯一可区分的特性,并不能有部分依赖关系。

通常,给一个表加主键(也是推荐做法),就可以做到“唯一可区分”。

一个表只要有主键,则其他非主键一定是依赖于主键的。

部分依赖是指某个非主键字段,依赖于联合主键字段的其中部分字段。

Mysql三范式

这个表虽然满足1NF,但是还有冗余。主要是学生信息和课程信息有冗余。

这个表主要记录学生成绩,所以可以通过(学生+课程)来确定(成绩),但是性别,地区和学分属于部分依赖,(学生)可以确定(性别+地区),(课程)可以确定(学分)。所以为了达到第二范式需要将这两个部分依赖独立出来。

Mysql三范式

第三范式(3NF):独立性,消除传递依赖

在一个具有主键的表中,假设主键为A,其必然其他非主键都依赖于该主键,比如:B依赖于A,C依赖于A,D依赖于A。。。但同时:如果该表中的某个字段B的值一确定,就能够确定另一个字段的值C,则我们称为C依赖于B。

那么,就出现了:C依赖B,B依赖A——这就是传递依赖。

则消除该传递依赖的的通常做法,就是将C依赖于B的数据,分离到另一个表中。

Mysql三范式

这个表虽然遵守了2NF,但是还存在一个传递依赖,(学生ID)>(所在院系)>(系办地址,系办电话),所以做如下修改:

Mysql三范式

第三范式的要求就是一个表只记录一种数据。

通常,在实践中,满足3范式只要做到“一个表只存一种数据”基本就可以实现。

另外,范式不是绝对要求,有时候我们为了数据的使用方便,还会(需要)故意违反范式。

评论

目前评论:0   

点击加载更多评