1NF,2NF,3NF,BCNF 数据库范式的详解

前言

数据库范式是事业单位计算机专技岗位考试中经常考察的点。

该类型的题经常会以选择题的形式出现。

掌握数据库范式的相关知识是很重要的。

-------------------------------------------------------------

/////////////////////////////////////////////////////////////////////////////

在解读数据库范式之前,我们先要了解一些基本知识。

函数依赖 函数依赖简单点说就是:某个属性集决定另一个属性集时,称另一属性集依赖于该属性集。

设R(U)是属性集U上的关系模式,X、Y是U的子集:
如果X和Y之间是1:1关系(一对一关系),如学校和校长之间就是1:1关系,则存在函数依赖X → Y和Y →X。
如果X和Y之间是1:n关系(一对多关系),如年龄和姓名之间就是1:n关系,则存在函数依赖Y → X。
如果X和Y之间是m:n关系(多对多关系),如学生和课程之间就是m:n关系,则X和Y之间不存在函数依赖。

完全函数依赖(Full functional dependency):在一个关系中,若某个非主属性数据项依赖于全部关键字称之为完全函数依赖。
例:成绩表(学号,课程号,成绩)关系中,
完全函数依赖:(学号,课程号)→ 成绩,学号 -\→ 成绩,课程号 -\→ 成绩,所以(学号,课程号)→ 成绩 是完全函数依赖

候选码/候选键:若关系中的某一组属性的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码/候选键;
主码:若一个关系有多个候选码,则选定其中一个为主码;
主属性&&非主属性:候选码的诸属性都称为主属性,不包含在任何候选码中的属性称为非主属性;

/////////////////////////////////////////////////////////////////////////////

1NF
       
满足最低要求的叫第一范式。
说人话:第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。

2NF
     
若R属于第一范式,且每一个非主属性完全函数依赖于任何一个候选码,则R属于2NF

说人话:第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。

第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。


3NF
   
若R中的每一个非主属性既不传递依赖于码,也不部分依赖于码,则R属于第三范式
说人话:第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。  

BCNF
所有非主属性对每一个候选码都是完全函数依赖;
所有的主属性对每一个不包含它的候选码,也是完全函数依赖;
没有任何属性完全函数依赖于非候选码的任何一组属性。

例一:关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。每一个教师只教一门课。每门课有 若干个教师,某一学生选定某门课,就对应一个固定的教师。由语义可得到如下函数依赖:
(S,J)->T;(S,T)->J;T->J。
(S,J),(S,T)都是候选键。
STJ是3NF,因为没有任何非主属性对键传递依赖或部分依赖。但STJ不是BCNF关系,因为T是决定因素而T不是超键。
例二:假设仓库管理关系表为StorehouseManage(仓库ID,存储物品ID,管理员ID,数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID,存储物品ID)→(管理员ID,数量) (管理员ID,存储物品ID)→(仓库ID,数量)
所以,(仓库ID,存储物品ID)和(管理员ID,存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID)→(管理员ID) (管理员ID)→(仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。

如果各位看官程序员们过腻了996的生活,想考个事业单位混日子,却苦于不知道该从何开始准备、找不到备考资料,加我咨询就对了,小弟我已经上岸多年,拥有数次笔试、面试经验。

↓↓↓↓↓↓我的微信↓↓↓↓↓↓

猜你喜欢

转载自www.cnblogs.com/kingsgao/p/12721422.html