期末复习觉得BC范式有点难懂,于是索性整个整理了一遍,希望有用。

范式之所以叫做范式,就是因为它给数据库的设计提供了一种规范,能够最大可能的避免犯错,也减少了数据的冗余,提高数据库效率。

来自哈工大数据库mooc

5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF 5NF\subset 4NF \subset BCNF \subset 3NF \subset2NF\subset 1NF 5NF4NFBCNF3NF2NF1NF

第一范式 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。

第二范式消除了非主属性对候选键的部分依赖。

意思是:每一个非主属性都应该和码有关(不能只和码的一部分相关),即一个表只做一件事。

判断一个关系是否属于第二范式:

  1. 找出数据表中的所有码;
  2. 找出所有主属性和非主属性;
  3. 判断所有的非主属性对码的部分函数依赖。

示例:R (S#,SN,SD,CN,G)

其中,S#:学号,SN:姓名,SD:班级,CN:课程,G:成绩

函数依赖 : S#→\to>SN,S#→\toSD,(S#,CN)→\toG

候选键:(S#,CN),非主属性 : SN和SD

因为:(S#,CN) →P\overset P\toP (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 YXY为关系模式R(U)上的函数依赖。

  • 完全函数依赖:记为:X→FYX\overset F\to YXFY,在R(U)R(U)R(U)中,若X→YX\to YXY并且对于XXX的任何真子集X′X'X都有X′→YX'\to YXY, 则称YYY完全函数依赖于XXX

    例:如果我想知道某位学生的某一门课的成绩Grade,那我必须得同时知道他的学号Sno和课程号Cno。Sno、Cno缺一不可。记{Sno、Cno}=X,{Grade}=Y,此时X→FYX\overset F\to YXFY

  • 部分函数依赖:记为:X→PYX\overset P\to YXPY,在R(U)R(U)R(U)中,若X→YX\to YXY并但对于XXX的任一真子集X′X'X不一定有X′→YX'\to YXY, 则称YYY部分函数依赖于XXX

    例:显然我同时知道Sno、Cno、Cname也能唯一确定Grade,但是此时Cname是多余的,于是有,记{Sno,Cno,Cname}=X,{Grade}=Y,此时X→PYX\overset P\to YXPY

第三范式 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⊈\nsubseteqX时, 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→\toB,A→\toC,C→\toD,C →\to E,E→\toFG }

候选键: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 BCNFR1BCNF; R2BCNF; R3BCNF


参考资料:
[哈工大]数据库系统MOOC
https://www.cnblogs.com/yinyoupoet/p/13287430.html

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐