首页 > 代码库 > 数据库范式的理解
数据库范式的理解
函数:明确的数学上的关系,比如:总价=单价*数量。
函数依赖:已经知X,则有且只有Y,与之对应。比如:已经“学号1”,则有且只有“生日1”与之对应。这不是也不可能是数学上的关系。
完全函数依赖:设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
即:X是(A1,A2,A3)的集合,如果Y完全函数依赖于A,则:
(A1)!→Y, (A2)!→Y, (A3)!→Y,
(A1,A2)!→Y, (A1,A3)!→Y, (A2,A3)!→Y
部分函数依赖:设X’,Y是关系R的两个属性集合,存在X’→Y,若X是X’的真子集,存在X→Y,则称Y部分函数依赖于X’。
即:X’是(A1,A2,A3,B)的集合,它的真子集X(A1,A2,A3),若存在X’→Y,X→Y,则称Y部分函数依赖于X’。
通俗地讲:Y依赖于X‘,也依赖于“部分的X‘”。
部分函数依赖与完全函数依赖的区别是:完全函数依赖的意思是,集合X不能再拆分了,再拆分,便不能决定Y了;集合X也不能再添加元素了,再添加元素,便变成了部分函数依赖。集合元素不能增,不能减,叫完全函数依赖。
第一范式:是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
简言之:字段不可重复,不可拆分。
其实,不可拆分,需要根据实际情况进行判定。比如,一个学生的生日,可以认为是不可拆分的字段。但是,有时却可能拆分成:年,月,日。
违反第一范式,有什么害处,是不言而喻的。这是关系型数据库,最基本的要求,否则,数据库都建立不起来。
第二范式:非关键字段完全函数依赖于主健字段,或者说,不存在非关键字段对任一候选字段的部分函数依赖。
如果将(学号、姓名、性别、课程号、课程名、学分、成绩)置于同张表中,则违反了第二范式。解释如下:
1、主键(学号与课程号的集合),非关键字:姓名、课程名、成绩。
2、姓名是部分函数依赖于主键的。课程名是部分函数依赖于主键的。成绩则完全函数依赖于主键。
3、因为存在了姓名或课程名对主键的部分函数依赖,所以,违反了第二范式。
违反第二范式的害处:(以上图七个字段置于同一表中为例子来说明)
假如只有以下三条记录,如何查询体育的学分
学号 | 姓名 | 性别 | 课程号 | 课程名 | 学分 | 成绩 |
1 | 张三 | 男 | BB | 数学 | 2 | 99 |
2 | 李四 | 男 | BB | 数学 | 2 | 98 |
1 | 张三 | 男 | AA | 语文 | 4 | 97 |
因为没有学生学习体育,所以,不存在(学号、课程号)【主键不能为空】。因而无法记录体育的学分信息。违反范式二,极有可能丢失重要的数据而没有记录。
解决办法:将表拆分。
拆分成四张表:(学号、姓名、性别);(课程号、课程名);(课程号、学分);(学号、课程号、成绩)
问:为何不是(课程号、课程名、学分)?答:严格意义上,学分部分函数依赖于(课程号、课程名)二合一的主键。
但是,为了避免不必要多表查询,而且课程号与课程名,课程名与学分都是一对一的关系,所以,仍然会使用(课程号、课程名、学分)。
第三范式:不存在非关键字对任意一候选关键字的传递函数依赖。
若有表(学号、姓名、性别、班级、班主任),则违反了第三范式的。因为存在学生重名的情况,所以表(学号、姓名、性别、班级、班主任)并没有违反第二范式。
解释如下:
班级函数依赖于学号,班主任函数依赖于班级,即 学号->班级->班主任。
违反第三范式的危害是:
数据冗余,如果一个班有37名学生,将不断记录班主任达37次之多。
解决办法:将表拆分
(学号、姓名、性别、班级);(班级、班主任)
数据库范式的理解