天天看点

关系数据库:理解一二三范式

关系数据库规范化理论是E. F.Godd在1971年提出的,它按照属性间的不同依赖程度分为第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式、第四范式(4NF)和第五范式(5NF)等。

这些范式每一级都是在下一级的基础上制定的更严格的规则,满足3NF规则的数据库结构明晰的,可以避免发生插入、删除和更新操作异常,最大限度降低数据库的冗余度,提高了数据库的通用性和安全性[1]。

一些基本概念。

「实体」可以理解为表,如「学生」是一个表,其中有学号、姓名等属性。

「字段」即表中的属性。

「元组」即一张表中的每行记录。

「主键」当一张表中有多个候选码时,可以选定一个作为主码,选定的候选码称主键[2]。

「完整性约束」即在数据插入时按照一定约束条件检测数据的合法性。

「函数依赖」*

「部分函数依赖」设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X[3]。

如学生基本信息表R(学号,身份证号,姓名),假定学号属性取值唯一。(学号,身份证号)→(姓名),(学号)→(姓名),(身份证号)→(姓名);所以姓名部分函数依赖于(学号,身份证号)。

「完全函数依赖」设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。

如学生基本信息表R(学号,班级,姓名)假定不同的班级学号有相同,班级内学号不能相同,在R关系中,(学号,班级)→(姓名),但是(学号)→(姓名)不成立,(班级)→(姓名)不成立,所以姓名完全函数依赖与(学号,班级)。

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

如在关系R(学号,宿舍,费用)中,(学号)→(宿舍),(宿舍)!→(学号),(宿舍)→(费用),(费用)!→(宿舍),所以符合传递函数的要求。

范式相关概念解释[4]。

「第一范式」符合1NF的每个属性都不可再分割。1NF为关系型数据库基本要求。

如(学号,学生,政治背景(面貌,时间))非1NF,「政治背景」可再分;(学号,学生,政治面貌,时间)为1NF。

仅仅符合1NF可能导致数据冗余,插入、删除、修改异常(完整性约束导致)(开销性大)。

「第二范式」2NF在1NF的基础之上,使得非主属性不能部分函数依赖于主键。

如(学号,姓名,课程名,成绩)中(学号,课程名)为主键,可以决定其他属性,但其中非主属性「姓名」依赖于「学号」,即存在部分函数依赖。若要变为2NF则需拆分为(学号,姓名)(学号,课程名,成绩)。

「第三范式」3NF在2NF的基础之上,使得表中非主键字段不能传递依赖于主键。实体中不存在除了主键外的属性,可以决定其他属性的值。

「BC范式」BCNF要求每个属性都不部分或传递依赖于主键。

「反范式」牺牲规范化的要求。

规范化的优点即避免了大量的数据冗余,节省了存储空间,保持了数据的一致性。但范式越高意味着表也就越多,用户把多个表联接在一起的花费是巨大的,尤其是当需要连接的两张或者多张表数据非常庞大的时候,表的连接严重地降低了系统运行性能。

所以有时为了提高数据库的性能,需要适当采取所谓反范式的设计,即不完全按照范式的理论来设计数据表结构。

[1]邹琼 - 浅谈数据库设计中范式的应用

[2]taozitsl - 主键和主码:https://zhidao.baidu.com/question/518622618.html

[3]好儿郎-志在四方 - 函数依赖:https://blog.csdn.net/rl529014/article/details/48391465 

[4]刘慰 - 如何解释关系数据库的第一二三范式:https://www.zhihu.com/question/24696366/answer/29189700

继续阅读