在设计数据库的时候,虽说将我们要的数据正确完整导入数据库是很关键的,但是对于数据库的设计者来说,如何将大量数据合理有效正确地导入数据库中也是极其关键的,好的数据结构不仅有助于对数据库进行相应的存取操作,还可以极大地简化应用程序中的其他内容(查询、窗体、报表、代码等)。所以数据库设计者在设计数据的过程中,按照“数据库规范化”对表进行设计,其目的就是减少数据库中的数据冗余,以增加数据的一致性。
在题几种范式之前,我们要先了解下函数依赖
定义:
说明:函数依赖是数据依赖的一种,它反映了同一关系属性之间的约束关系。函数依赖理论是关系范式的理论基础。
几种函数依赖
包含在任意候选码中的属性叫做主属性,不包含在任意候选码中的属性叫非主属性(注意:关系的候选码可能有多个,能确定多个主属性)
全码:整个属性组都是码,成为全码。
如果一个关系模式所有属性都是不可分的数据项,称这个关系满足第一范式
说明:第一范式是关系模式最起码的要求,如果不满足第一范式,不能称为关系。
对于上面这个表,商品属性可以分为商品名称和商品数量,即存在表中有表的现象,不满足第一范式
定义:若某关系R属于第一范式,且每一个非主属性完全函数依赖于任何一个候选码,则关系R属于第二范式。
第二范式要求,表中所有的实例必须可以被唯一地区分
不满足第二范式造成数据冗余
在选课关系表(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),但由于非主属性学分仅依赖于课程号,对关键字(学号,课程号)只是部分依赖,而不是完全依赖,因此此种方式会导致数据冗余以及更新异常等问题,解决办法是将其分为两个关系模式:学生表(学号,课程号,分数)和课程表(课程号,学分),新关系通过学生表中的外关键字课程号联系,在需要时进行连接。
一个不满足第二范式的例子
关系模式S-L-C(Sno, Sdept, Sloc, Cno, Grade),其中Sno, Sdept, Sloc, Cno, Grade依次表示学生的学号、所在的系、住处、课程号、班级,并且每个系的学生住在同一个地方。可知S-L-C的码为(Sno, Cno)
函数依赖
根据定义“每一个非主属性完全函数依赖于任何一个候选码”判断,这里面Sdept和Sloc都部分依赖(虚线表示)于主码(sno,cno),即存在非主属性部分函数依赖于码,不符合第二范式。
定义:如果关系模型R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R是第三范式的模式。
说明:要每个非主属性既不部分依赖于码,也不传递依赖与码,如果R符合第三范式则R符合第二范式。
不符合的例子
关系S-L(sno,sdept,sloc)中
函数依赖
我们可以得到
即关系存在非主属性对码的传递函数依赖,所以不符合第三范式
定义: 关系模式R中,若每一个决定因素都包含码,则R属于BCFN。
说明:BC范式是构建在第三范式的基础上,如果关系模型R满足第三范式,且每个属性都不传递依赖于R的候选键,那么称R满足BC范式
若R符合BCNF
有:
所有非主属性对每一个码都是完全函数依赖;
所有主属性对每一个不包含它的码也是完全函数依赖;
没有任何属性完全函数依赖于非码的任何一组属性。//所依赖的都是码或者说每个决定因素都含码
不符合BC范式的例子
关系SJP(S,J,P)S表示学生,T表示教室,J表示教室
函数依赖
关系SJP符合第三范式:没有任何非主属性部分函数依赖或传递函数依赖于码
关系SJP不符合BC范式:(S,J)依赖于T ,T是决定因素,但是T不含码
设R是一个关系模型,D是R上的多值依赖集合。如果D中存在凡多值依赖X->Y时,X必是R的超键,那么称R是第四范式的模式。
例如,职工表(职工编号,职工孩子姓名,职工选修课程),在这个表中,同一个职工可能会有多个职工孩子姓名,同样,同一个职工也可能会有多个职工选修课程,即这里存在着多值事实,不符合第四范式。如果要符合第四范式,只需要将上表分为两个表,使它们只有一个多值事实,例如职工表一(职工编号,职工孩子姓名),职工表二(职工编号,职工选修课程),两个表都只有一个多值事实,所以符合第四范式。