数据库的三大范式+BC范式
期末复习觉得BC范式有点难懂,于是索性整个整理了一遍,希望有用。范式之所以叫做范式,就是因为它给数据库的设计提供了一种规范,能够最大可能的避免犯错,也减少了数据的冗余,提高数据库效率。
期末复习觉得BC范式有点难懂,于是索性整个整理了一遍,希望有用。
范式之所以叫做范式,就是因为它给数据库的设计提供了一种规范,能够最大可能的避免犯错,也减少了数据的冗余,提高数据库效率。

5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF 5NF\subset 4NF \subset BCNF \subset 3NF \subset2NF\subset 1NF 5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF
第一范式 1NF
若关系模式R(U)中关系的每个分量都是不可分的数据项(值、原子),则称R(U)属于第一范式,记为:R(U) ∈\in∈ 1NF。
这也是数据表的最低的最基本的要求。
大白话:不能有复合属性,不能有多值属性。即一列不能分作多个子列,一行不能分作多个子行。
满足第一范式的情况:
不满足第一范式的情况:
-
如何将非1NF转换为1NF?
将复合属性处理为简单属性;将多值属性与关键字单独组成一新的关系。
示例:
Star( name, address(street, city) )转换:
Star( name, address)或者Star(name, street, city )
第二范式 2NF
若R(U) ∈\in∈ 1NF,且U中的每一非主属性完全函数依赖于候选键,则称R(U)属于第二范式,记为:R(U) ∈\in∈ 2NF。
第二范式消除了非主属性对候选键的部分依赖。
意思是:每一个非主属性都应该和码有关(不能只和码的一部分相关),即一个表只做一件事。
判断一个关系是否属于第二范式:
- 找出数据表中的所有码;
- 找出所有主属性和非主属性;
- 判断所有的非主属性对码的部分函数依赖。
示例:R (S#,SN,SD,CN,G)
其中,S#:学号,SN:姓名,SD:班级,CN:课程,G:成绩
函数依赖 : S#→\to→>SN,S#→\to→SD,(S#,CN)→\to→G
候选键:(S#,CN),非主属性 : SN和SD
因为:(S#,CN) →P\overset P\to→P (SN、SD),所以R不属于2NF。
将其分解为R1R_1R1(S#, SN, SD),R2R_2R2(S#, CN, G), 则R1∈R_1 \inR1∈ 2NF,R2∈R_2 \inR2∈ 2NF
码:主键和候选键简称码。
候选键:能够唯一标识一条记录的最小属性集。比如你的身份证号就能在整个中国人数据库里唯一标识你。
主属性:包含在任一候选码中的属性称主属性。简单来说,主属性是候选码所有属性的并集
非主属性:不包含在候选码中的属性称为非主属性。 非主属性是相对于主属性来定义的。
函数依赖:在一个表里面,属性X可以映射到属性Y,也就是说知道了X就能确定Y,称X为决定因素。称X→YX\to YX→Y为关系模式R(U)上的函数依赖。
完全函数依赖:记为:X→FYX\overset F\to YX→FY,在R(U)R(U)R(U)中,若X→YX\to YX→Y并且对于XXX的任何真子集X′X'X′都有X′→YX'\to YX′→Y, 则称YYY完全函数依赖于XXX。
例:如果我想知道某位学生的某一门课的成绩Grade,那我必须得同时知道他的学号Sno和课程号Cno。Sno、Cno缺一不可。记{Sno、Cno}=X,{Grade}=Y,此时X→FYX\overset F\to YX→FY。
部分函数依赖:记为:X→PYX\overset P\to YX→PY,在R(U)R(U)R(U)中,若X→YX\to YX→Y并但对于XXX的任一真子集X′X'X′不一定有X′→YX'\to YX′→Y, 则称YYY部分函数依赖于XXX。
例:显然我同时知道Sno、Cno、Cname也能唯一确定Grade,但是此时Cname是多余的,于是有,记{Sno,Cno,Cname}=X,{Grade}=Y,此时X→PYX\overset P\to YX→PY。
第三范式 3NF
若R(U) ∈\in∈ 2NF,且U中的每一非主属性不传递依赖于码,则称R(U)属于第三范式,记为:R(U) ∈\in∈ 3NF。
表中每一个非主属性都要和码直接相关,非主属性既不传递依赖于码,也不部分依赖于码。第3范式消除了非主属性对码的传递依赖。
码可以唯一确定非主属性,且非主属性之间不存在依赖关系。
- 传递函数依赖:X→传递\overset {传递}\to→传递 Z。在R(U)中,若X →\rightarrow→ Y,Y →\to→ Z 且Y ⊈\nsubseteq⊈ X, Z ⊈\nsubseteq⊈ Y, Z ⊈\nsubseteq⊈ X, Y ↛\nrightarrow↛ X, 则称Z传递函数依赖于X。
例:假设某商业集团数据库有一关系模式R如下:
R(商店编号,商品编号,数量,部门编号,负责人)
现规定: (1)每个商店的每种商品只在一个部门销售。
(2)每个商店的每个部门只有一个负责人。
(3)每个商店的每种商品只有一个库存数量。
显然存在函数依赖:
(商店编号,商品编号)->部门编号
(商店编号,部门编号)->负责人
(商店编号,商品编号)->库存数量
因此:此关系模式的候选键只有一个,是(商店编号,商品编号)
且(商店编号,商品编号)->(部门编号,负责人,库存数量)是完全函数依赖。
所以该关系模式R属于2NF,但它并不属于3NF,因为存在(商店编号,部门编号)->负责人,而部门编号不是主属性。即存在传递函数依赖。
BC范式 BCNF
数据库的三大范式只是最基本的,而BC范式也常与他们放到一起讨论,因为BCNF也被称为修正的第三范式,又或者说是扩充的第三范式。
若R(U,F) ∈\in∈ 1NF,若对于任何X →\to→ Y ∈\in∈ F,当Y⊈\nsubseteq⊈X时, X必包含候选键,则称R(U)属于Boyce-Codd范式,记为:R(U) ∈\in∈ BCNF。
关系模式R(U)中,P为候选键,A属性是候选键的一个属性,若存在A →\to→ Y,Y为主属性,则该关系不属于BCNF。
示例:邮编(城市, 街道, 邮政编码)
函数依赖:(城市,街道) → 邮政编码; 邮政编码→城市. 邮政编码→城市。
候选键 : (城市,街道)
因非主属性对候选键是完全函数依赖,且无传递依赖,所以关系模式邮编属于第3范式;
因存在函数依赖:邮政编码$\to $城市,而邮政编码不是主属性,所以邮编不属于BCNF。
示例: 选课(学号, 课程号, 教师编号)
假设规定每位教师只开一门课
则有函数依赖: (学号,课程号)→教师编号;教师编号→课程号。
候选码:(学号,课程号)
显然该模式满足第3范式:非主属性对候选码完全函数依赖,且不存在传递函数依赖。
但不满足Boyce-Codd范式:存在函数依赖:教师编号→课程号,但教师编号不是主属性。
示例:R(A, B, C, D, E, F, G)
函数依赖集合:{ A→\to→B,A→\to→C,C→\to→D,C →\to→ E,E→\to→FG }
候选键:A;
有不依赖于候选键的其他函数依赖,R不满足BCNF。
分解规则:
将左侧不含候选键的函数依赖单独组成一个关系, 将包含候选键的组成一关系
ρ={R1(C,D,E),R2(E,F,G),R3(A,B,C)} \rho=\{ R1(C, D, E), R_2(E, F, G) , R_3(A, B, C) \} ρ={R1(C,D,E),R2(E,F,G),R3(A,B,C)}
可以看出:R1∈BCNF; R2∈BCNF; R3∈BCNFR1\in BCNF;\ R2\in BCNF;\ R3\in BCNFR1∈BCNF; R2∈BCNF; R3∈BCNF
参考资料:
[哈工大]数据库系统MOOC
https://www.cnblogs.com/yinyoupoet/p/13287430.html
更多推荐





所有评论(0)