对于数据库有三范式,自己也一致没有弄明白,今天重新看了一下这三个范式的定义,参照了一下别人的,并加了一些自己的理解,拿来和大家分享一下。
一范式
这个范式,只要是关系数据库,所设计的数据表都是满足第一范式的,因为关系数据库中不允许不是第一范式的情况。举个例子:
Field1
Field2
Field3
Field4
Field5
Field6
这个就是第一范式,数据表里的每个字段都是不可再分的,单一的属性,而
Field1
Field2
Field3
Field4
Field5
Field6
Field3-1
Field3-2
Field4-1
Field4-2
这个则是不符合第一范式的定义的,因为它的field3又分了两个字段,field4又分了两个字段!还有一种情况:
Field1
Field2+field3
Field4
Field5
Field6
其中field2和field3是可以再分的,所以这也不符合第一范式的要求。
第二范式
数据表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖是关键字中的某几个字段组合能决定出其它的非关键的字段),即所有非关键字段完全依赖于任何一组候选关键字,比如:选课关系表中存在SelectedCourse(学号,年龄,性别,姓名,课程号,成绩,学分),关键字为学号和课程号,存在如下的关系:
(学号,课程号)决定(年龄,性别,姓名,成绩,学分)
但其中存在着这样的问题:
关键字中的某一部分还是可以决定出其它的非关键字段
如:学号 决定 年龄,性别,姓名
课程号 决定 成绩,学分
这样就不满足第二范式的定义了,存在了非关键字段依赖于部分关键字段
不符合这2NF的数据表,会存在这些问题:
1、数据冗余:同一门课由n个学生选修,则学分会多出现n-1次,而如果一个学生选m门课,则会多出现m-1次年龄性别姓名等。
2、更新异常:若调整了某门课的学分,数据表里的这门课的学分都要更新。
3、插入异常:要插入一课,但无人选修,由于没有学号所以也无法插入学分。
4、删除异常:假如有的学生已经完成了课程的选修,要删除时,则会将成绩与学分同时删除掉。
三范式
在二范式的基础上,不存在非关键字段对关键字段的传递函数依赖,所谓传递函数依赖指的是"A->B->C"的决定关系,则C依赖于A,因此,满足三范式的数据表不应该存在如下的关系:关键字段->非关键字段X->非关键字段Y,假如,学生关系表(学号,姓名,年龄,学院,学院地址,学院电话),关键字为“学号”,因为存在如下的关系:学号->姓名,年龄,学院,学院地址,学院电话,这个是符合二范式的,但不符合三范式,因为,学号->学院->学院地址,学院电话,即非关键字段(学院地址,学院电话)存在对学号关键字段的传递函数依赖。
将学生关系表分为两个表:
(学号,姓名,年龄,学院)
(学院,学院地址,学院电话)
这样就符合第三范式了。
鲍依斯-科德范式(BCNF)
在第三范式的基础上,数据表中任何字段不存在对任一候选关键字段的传送函数依赖,
假如,仓库管理关系表StoreManager(仓库ID,存储物品ID,管理者ID,数量),且有一个管理员只在一个仓库工作,一个仓库可以存放多个物品,关系如下:
仓库ID,存储物品ID->管理者ID,数量
管理者ID,存储物品ID->仓库ID,数量
(仓库ID,存储物品ID)和(管理者ID,存储物品ID)都是StoreManager的候选关键字,表中的唯一的非关键字为数量,它是符合三范式的,但存在如下的问题:
仓库ID->管理员ID
管理员ID->仓库ID
即关键字存在决定关键字的情况,所以不符合BCNF