第一范式(1NF):关系模式R的每个关系r的属性值都是不可分的原子值。
满足1NF的关系称为规范化的关系,否则称为非规范化的关系。
第二范式(2NF):关系模式R是1NF,且每个非主属性完全函数依赖于候选键。
如果A是关系模式R的候选键中的属性,则为主属性,否则为非主属性。
例子:
设关系模式R(SNO,CNO,GRADE, TNAME, TADDR)TADDR表教师地址。
(SNO, CNO)表示R的候选键。
R上存在两个FD:
(SNO,CNO)→ TNAME,TADDR
(CNO)→ TNAME,TADDR
第一个FD存在局部依赖,因此不是2NF,如果有100个学生选修同一门课,任课老师的信息就会重复100次。
可分解为R1(CNO,TNAME,TADDR)和R2(SNO,CNO,GRADE)。
R1和R2都是2NF。
完全依赖、局部依赖:对于FD W→A,如果存在X⊂W,有X→A成立,那么称W→A是局部依赖,否则称为完全依赖。
完全依赖也称为“左部不可约依赖”。
传递依赖:如果X→Y,Y→A,且Y ↛ X 和A ∉ Y,那么称X→A是传递依赖。
局部依赖的存在必定蕴含着传递依赖的存在,也就是说,R如果是3NF模式,也是2NF模式。(由局部依赖定义:W→X,X→A ⇒ W→A)
我的理解是,不存在传递依赖就不存在局部依赖!
第三范式(3NF):关系模式R是1NF。且每个非主属性都不传递依赖于候选键。
3NF等价定义:设F是关系模式的FD集,如果对于F中每个非平凡的FD X→Y,都有X是R的超键,或Y的每个属性都是主属性。
例子:
上述R1(CNO,TNAME,TADDR)为2NF,如果R1中存在CNO→TNAME,
TNAME→TADDR那么R1不是3NF,如果有一个教师开设了5门课,那么该教师的信息也会重复五次。
如果将R1分解为R11(CNO,TNAME),R12(TNAME,TADDR)两者都为3NF。
BCNF(Boyce and Codd):如果关系模式R是1NF,每个属性不传递依赖于R的候选键。
BCNF等价定义:设F是关系模式的FD集,如果对于F中每个非平凡的FD X→Y,都有X是R的超键。
例子:
设关系模式R(BNO, BNAME,AUTHOR)有两个FD:
BNO→BNAME,(AUTHOR和BNAME)→ BNO。
因此R有关键码(BNO,AUTHOR)或(BNO,BNAME),因此R的属性都为主属性,R是3NF模式,但(AUTHOR和BNAME)→ BNAME,因此R不是BCNF模式。
可分解为(BNO,BNAME)和(BNO,AUTHOR)但这个分解会造成
(AUTHOR,BNAME)→BNO丢失。
范式的分解:
2NF的分解:
设关系模式(WXYZ),主键为WX, R上还存在FD X→Z (也就是WX→Z是一个局部依赖)。此时应把R分解为两个模式:
R1(XZ),主键是X;
R2(WXY),主键是WX,外键是X(REFERENCE R1);
利用外键和主键的连接可以从R1和R2重新得到R。
如果R1和R2还不是2NF,则重复上述过程,直到每个关系模式都是2NF为止。
3NF的分解:
1. 对于关系模式R和R上成立的FD集F,先求出F的最小依赖集,然后再把最小依赖集中哪些左部相同的FD用合并性合并起来。
2. 对最小依赖集中每个FD X→Y去构成一个模式XY
3. 在构成的模式集中,如果每个模式都不包含R的候选键,那么把候选键作为一个模式放入模式集中。
举个栗子:
设关系模式R(ABCDE), R的最小依赖集为{A→B,C→D}。从依赖集可知R的候选键为ACE
根据最小依赖集,可知ρ = {AB,CD},再加入由候选键组成的模式ACE,因此最后结果
ρ = {AB,CD,ACE}
BCNF的分解:
对于关系模式R的分解ρ(初始ρ= {R}),如果ρ中有一个关系模式Ri相对于ΠRi(F)不是BCNF,由BCNF等价定义可知,Ri中存在一个非平凡的FD X → Y,有X不包含超键。此时把 Ri
分解成XY和Ri – Y两个模式。重复上述过程,一直到ρ中每一个模式都是BCNF。
这个方法能保证把R分解为ρ,但不一定能保证ρ保持FD。BCNF的例子说明了该情况。
一个好的模式设计方法应符合三条原则:
表达式:用无损分解和保持依赖来衡量。
分离性:只储存有直接联系的属性值,把有间接联系的属性放在不同的表中。在分解为BCNF模式集中,分离与依赖等价有时是不兼容的。
最小冗余性:最后分解的模式个数和模式中属性总数达到最少。