首页 > 代码库 > 数据库范式的理解

数据库范式的理解

函数:明确的数学上的关系,比如:总价=单价*数量。

函数依赖:已经知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也不能再添加元素了,再添加元素,便变成了部分函数依赖。集合元素不能增,不能减,叫完全函数依赖。

传递函数依赖:设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。

第一范式:是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。

  简言之:字段不可重复,不可拆分。

  其实,不可拆分,需要根据实际情况进行判定。比如,一个学生的生日,可以认为是不可拆分的字段。但是,有时却可能拆分成:年,月,日。

  违反第一范式,有什么害处,是不言而喻的。这是关系型数据库,最基本的要求,否则,数据库都建立不起来。

第二范式:非关键字段完全函数依赖于主健字段,或者说,不存在非关键字段对任一候选字段的部分函数依赖。

  如果将(学号、姓名、性别、课程号、课程名、学分、成绩)置于同张表中,则违反了第二范式。解释如下:

  1、主键(学号与课程号的集合),非关键字:姓名、课程名、成绩。

  2、姓名是部分函数依赖于主键的。课程名是部分函数依赖于主键的。成绩则完全函数依赖于主键。

  3、因为存在了姓名或课程名对主键的部分函数依赖,所以,违反了第二范式。

技术分享

  违反第二范式的害处:(以上图七个字段置于同一表中为例子来说明)

  假如只有以下三条记录,如何查询体育的学分

学号 姓名 性别 课程号 课程名 学分 成绩
1 张三 BB 数学 2 99
2 李四 BB 数学 2 98
1 张三 AA 语文 4 97

 

 

 

 

 

  因为没有学生学习体育,所以,不存在(学号、课程号)【主键不能为空】。因而无法记录体育的学分信息。违反范式二,极有可能丢失重要的数据而没有记录。

  解决办法:将表拆分。

  拆分成四张表:(学号、姓名、性别);(课程号、课程名);(课程号、学分);(学号、课程号、成绩)

  问:为何不是(课程号、课程名、学分)?答:严格意义上,学分部分函数依赖于(课程号、课程名)二合一的主键。

  但是,为了避免不必要多表查询,而且课程号与课程名,课程名与学分都是一对一的关系,所以,仍然会使用(课程号、课程名、学分)。

第三范式:不存在非关键字对任意一候选关键字的传递函数依赖。

  若有表(学号、姓名、性别、班级、班主任),则违反了第三范式的。因为存在学生重名的情况,所以表(学号、姓名、性别、班级、班主任)并没有违反第二范式。

  解释如下:

  班级函数依赖于学号,班主任函数依赖于班级,即 学号->班级->班主任。

  违反第三范式的危害是:

  数据冗余,如果一个班有37名学生,将不断记录班主任达37次之多。

  解决办法:将表拆分

  (学号、姓名、性别、班级);(班级、班主任)

 

数据库范式的理解