通俗理解数据库范式
第一范式 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的关系模式有:
- 所有非主属性对每一个码都是完全函数依赖。
- 所有主属性对每一个不包含它的码也是完全函数依赖
- 没有任何属性完全函数依赖于非码的任何一组属性。
举个例子:关系模式C(Cno,Cname,Pcno),它只有一个码Cno,,这里没有任何属性对Cno部分依赖或传递依赖,所以C是3NF。
同时C中Cno是唯一的决定因素,所以C是BCNF。

浙公网安备 33010602011771号