开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情
范式
范式指规范的表达形式,在关系数据库中指符合某一种级别的关系模式的集合。
- 关系数据库中的关系要满足一定的要求,满足不同程度要求的为不同的范式。
- 范式用来保证各种类型的不规范和不一致性不会引入到数据库。
范式种类
- 第一范式
- 第二范式
- 第三范式
- BCNF、4NF、5NF
- 范式越高,规范化的程度越高
第一范式
第一范式:表中字段都是单一属性,不可再分
第二范式
第二范式:如果R(U,F)∈1NF,并且R中的每个 非主属性都完全函数依赖于码,则 R(U,F)∈2NF
例: S-L-C(Sno, Sname,Ssex,Sdept, Sloc, Cno, Grade) Sno→Sname,Sno→Ssex,Sno→Sdept, (Sno,Cno)→Grade,Sdept→Sloc
码: (Sno, Cno) 因此存在(Sno, Cno)→Sdept
等多个部分函数依赖不是2NF
分解方法
- 首先,对于组成主码的属性集合的每一个子集,用它作为主码构成一个表
- 然后,将完全函数依赖于这些主码的属性放置到相应的表中
- 最后,去掉只由主码的真子集构成的表
对于S-L-C (Sno, Sname,Ssex,Sdept, Sloc, Cno, Grade)
表,首先分解为如下形式的三张表: S-L(Sno,…) C(Cno,…) S-C(Sno, Cno,…)
然后,将完全函数依赖于这些主码的属性放置到相应表中 S-L(Sno,Sname, Ssex, Sdept, Sloc) C(Cno) S-C(Sno, Cno, Grade)
最后,去掉只由主码的真子集构成的表,最终分解为: S-L(Sno, Sname, Ssex, Sdept, Sloc )
S-L(Sno,Sname,Ssex,Sdept, Sloc)
存在问题:
- 数据冗余 :有多少个学生就有多少个重复的SLOC
- 操作异常:当某栋宿舍新修建完工,还没有安排学生,则无法录入数据库。
第三范式
定义:如果R(U,F)∈2NF,且每个非主属性都不传递依赖于码,则R(U,F)∈3NF 例如:对S-L(Sno, Sname,Ssex,Sdept, Sloc)
- ∵
Sno → Sdept, Sdept -传递→ Sloc
- ∴
Sno → Sloc
, 不是3NF
分解过程
对于不是候选码的每个决定因子,从表中删去依赖于它的所有属性
- 新建一个表,新表中包含在原表中所有依赖于该决定因子的属性
- 将决定因子作为新表的主码
S-L(Sno,Sname,Ssex,Sdept,Sloc)
分解后的关系模式为:S-D(Sno,Sname,Ssex,Sdept)
S-L(Sdept,Sloc)
设有关系模式:R(A,B,C,D,E,F),其函数依赖集为:F={E->D, C->B,CE->F, B->A}。
- 分解为2NF如下:
R1(E,D) R2(C,B,A) R3(C,E,F)
关系模式:R(A,B,C,D,E,F),其函数依赖集为: F={E->D, C->B,CE->F, B->A}。
- 分解为2NF如下:
R1(E,D) R2(C,B,A) R3(C,E,F)
- 上述三个模式中,R1,R3属于3NF,但在R2中, A传递依赖于C,
- 因此继续分解为3NF:
R21(C,B) R22(B,A)
BCNF
定义:如果R(U,F)∈3NF,且不存在主属性对 非所在码(不包含本主属性的码)的传递依 赖和部分依赖,则R(U,F)∈BCNF 。即BCNF中每一个决定因素都包含码
关系范式的规范化与反规范化
- 规范化的过程是通过把范式程度低的关系模式分解为若干个范式程度高的关系模式来实现的。
- 分解的最终目的是使每个规范化的关系只描述一个主题。
- 规范化的方法是进行模式分解,但要注意的是分解后产生的模式应与原模式等价,即模式分解不能破坏原来的语义,同时还要保证不丢失原来的函数依赖关系。
- 规范化程度过低的关系可能存在操作异常,但这并不意味着规范化程度越高的关系模式就越好。
- 规范化的同时会增加数据连接查询的难度,降低数据查询效率,折衷的方式是引入受控冗余来降低规范化程度。
- 反规范化就是指在数据库规范化后,为了提高数据检索性能,在某些局部降低规范化标准,引入适当冗余的方法。
- 3NF消除了很大一部分数据冗余和更新异常,在通常的数据库设计中,一般要求达到3NF即可。