通俗理解数据库范式

第一范式 1NF

表中的每一列都是不可分割的最小单元。例如下表就是一个符合第一范式的一个表。

 表一:符合第一范式
学号 姓名 专业
1001 错过 大数据
1002 假象 Java开发
1003 梦魇 全栈工程师
 表二:不符合第一范式
学生 
 学号  姓名  专业
1001  错过  大数据 
1002 假象  Java开发 
1003  梦魇   全栈工程师

 

 

 

 

 

 

 

 表一中,学号、姓名、专业都不可再分,这就是符合第一范式的一种表。

表二中,学生列可以分为学号、姓名、专业,学生列并不是最小的不可分割单元,所以表二不符合第一范式。

第二范式  2NF

了解第二范式之前,先要了解几个概念。

函数依赖:某个属性集决定另一个属性集时,称另一属性集依赖于该属性集。

举个例子,就拿上面的学生表的例子,当我们确定学号时(每个学生的学号唯一),那我们也就确定了该学生的姓名。这我们就可以说学生姓名依赖于学生的学号。即学号——>姓名

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

举个例子,我们可以把学号和课程看做是X、成绩是Y,那么Y是依赖于X的。我们不能根据X中的学号,来确定成绩,因为课程不止一门,同样的,我们也不能只根据课程来确定成绩,因为学号不止一个。但是确定了学号和课程,那么成绩也就唯一确定了。

 学生成绩表
 学号 课程  成绩
 1001  政治  83
 1001  英语  96
1001 数学 150
1001 专业课 150
1002 政治 76
1002 英语 76
1002 数学 96
1002 专业课 150

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

举个例子,班级依赖于学号,即只要知道了学号、就可以确定班级。但是如果知道了班级,你却不知道学号,因为一个班级有很多学生,也就是说,学号不依赖于班级。每个班级只有一个班主任,确定了班级也就确定了班主任,即班主任依赖于班级,那我们就可以说,班主任传递依赖于学生的学号

学号 班级 班主任
001 计算机班 苏半夏
002 教育班 张素
003 教育班 张素
004 教育班 张素

 

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

 举个例子,表{学号、姓名、专业},我们可以通过学号和专业获得姓名,也可以只通过学号来获得姓名。即Y(姓名)依赖于集合X(学号、专业),且学号是集合X的真子集,集合Y依赖于学号,因此集合Y部分依赖于集合X

码:能唯一标识实体的属性,它是整个实体集的性质,而不是单个实体的性质。

候选码:K为属性集合U中的属性或属性组合,若U完全依赖于K,则K为候选码,候选码是最小的超码。

超码:U(属性集合)部分依赖于K,则K为超码。{学号,姓名,性别,年龄,所在地,身份证号}为U,{学号}or{身份证号}为K。

主码:若候选码多于一个,则选定其中一个为主码,也就是我们常说的主键。

学号 姓名 性别 年龄 所在地 身份证号
001 张三 22 北京 1001
002 李四 20 上海 1002
003 王五 17 深圳 1003
004 张三 17 深圳 1004

        对于旁边表中的每一个学生,它的学号和身份证号是唯一的,它能够标识学生实体的属性,因此学号和身份证号是码

        学号是超码,那么学号+任意个字段都是超码,比如,学号+身份证号是超码,学号+姓名也是超码,

        最大的超码就是学号+姓名+性别+年龄+所在地+身份证号。

        身份证号也是超码

        候选码就是学号、身份证号。这个表中的候选码为2个,我们可以选取其中任意一个作为主码,暂且选取学号作为主码,也就是主键。

包含在任何一个候选码中的属性称为主属性,不包含在任何候选码中的属性称为非主属性或非码属性。

例如,上表中的,学号和身份证号就是主属性,而其余的就是非主属性。

每一个非主属性完全依赖于任何一个候选码,则为第二范式。

例如:关系模式S-L-C(学号、系别、所住地、课程号、成绩)每个系的学生都住在同一个地方。则函数依赖有:

成绩   完全依赖于(学号、课程号),  系别  部分依赖于  (学号、课程号),

系别  依赖于  学号,  所住地   依赖于  学号,  所住地  部分依赖于  (学号、课程号)

所住地  依赖于    系别。

因为系别和所在地并不完全函数依赖于任何一个候选码,所以S-L-C不是第二范式。

3NF:在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

如S1(SNO,SNAME,DNO,DNAME,LOCATION) 各属性分别代表学号,姓名,所在系,系名称,系地址。

学号 姓名 所在系 系名称 系地址
1001 苏半夏 001 计算机系 A楼
1002 苏夏夏 002 教育系 B楼
1003 苏小夏 001 计算机系 A楼
1004 苏小半 002 教育系 B楼

候选码:学号,非主属性:姓名、所在系、系名称、系地址

学号决定各个属性。因为只有一个候选码,没有部分依赖的问题,所以肯定是2NF。但是系名称、所在系、系地址存在大量的重复数据,这样会造成数据的冗余。

存在冗余的原因是:存在传递依赖关系,即学号→所在系,所在系→系地址。也就是说,学号不直接决定的非主属性中的系地址。

解决思路:消除传递依赖。将关系S1,分成两个关系S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)

BCNF(巴斯-科德范式):在3NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖)

满足BCNF的关系模式有:

  1. 所有非主属性对每一个码都是完全函数依赖。
  2. 所有主属性对每一个不包含它的码也是完全函数依赖
  3. 没有任何属性完全函数依赖于非码的任何一组属性。

举个例子:关系模式C(Cno,Cname,Pcno),它只有一个码Cno,,这里没有任何属性对Cno部分依赖或传递依赖,所以C是3NF。

同时C中Cno是唯一的决定因素,所以C是BCNF。

posted @ 2021-02-04 16:24  山石满棠  阅读(564)  评论(0)    收藏  举报