数据库之关系范式

一、关系的第一范式
  1. 定义:关系模式 R ( U ) R(U) R(U)中关系的每个属性都是不可分的数据项,且关系中有候选码,则称 R ( U ) R(U) R(U)属于第一范式,记为 R ( U ) ∈ 1 N F R(U) \in 1NF R(U)1NF注意: 1 N F 1NF 1NF要求关系中不能有复合属性、多值属性及其组合,且非主属性要函数依赖于主键。

举例:下图中的复合属性name、多值且复合的属性enrollment导致关系Student不属于 1 N F 1NF 1NF
在这里插入图片描述

  1. 1 N F 1NF 1NF转化为 1 N F 1NF 1NF的方法
  • 方法一:将复合属性拆分成多个不可再分的子属性,构成新的关系。如上面的关系化为Student(sid, Iname, fname, class, telephone, cno, major)。
  • 方法二:去掉复合属性的子属性,保留复合属性本身,构成新关系。如上面的关系化为Student(sid, name, class, telephone, enrollment)。
  • 总的来说,就是找到关系的嵌套属性,从上(左)到下(右)拆表(嵌套属性单独为一张),每拆一张就将前一张表的主键放进来,再确定新的主键。
二、关系的第二范式
  1. R ( U ) ∈ 1 N F R(U) \in 1NF R(U)1NF,且 U U U中的每一非主属性完全函数依赖候选键,则称 R ( U ) R(U) R(U)属于第二范式,记为 R ( U ) ∈ 2 N F R(U) \in 2NF R(U)2NF注意: 2 N F 2NF 2NF中不存在非主属性对候选键的部分依赖。

举例:学生关系 R ( S # , S N , S D , C N , G ) R(S\#, SN, SD, CN, G) R(S#,SN,SD,CN,G),其中 S # S\# S#为学号、 S N SN SN为姓名, S D SD SD为班级, C N CN CN为课程, G G G为成绩。
首先,从中找到函数依赖: S # → S N , S # → S D , { S # , C N } → G S\# \rightarrow SN, S\# \rightarrow SD, \{S\#, CN\} \rightarrow G S#SN,S#SD,{S#,CN}G.
接着,从中找出候选键: { S # , C N } \{S\#, CN\} {S#,CN},从而判断出非主属性: S N , S D , G SN, SD, G SN,SD,G.
可以发现存在部分函数依赖: { S # , C N } ⟶ p { S N , S D } \{S\#, CN\} \stackrel{p}{\longrightarrow} \{SN, SD\} {S#,CN}p{SN,SD},所以 R R R不属于 2 N F 2NF 2NF.

  1. 2 N F 2NF 2NF转化为 2 N F 2NF 2NF的方法
  • 分解关系 R R R,将存在部分函数依赖的属性及其决定因素分到一个关系中,其他有函数依赖的属性为另一个关系。如上面的关系化为: R 1 ( S # , S N , S D ) , R 2 ( S # , C N , G ) R_{1}(S\#, SN, SD), R_{2}(S\#, CN, G) R1(S#,SN,SD),R2(S#,CN,G),得到的两个新关系都属于 2 N F 2NF 2NF.
三、关系的第三范式
  1. 这里先给出书本定义:若 R ( U , F ) ∈ 2 N F R(U, F) \in 2NF R(U,F)2NF R R R中不存在这样的情况:候选键 X X X,属性组 Y ⊆ U Y \subseteq U YU和非主属性 A A A, 且 A ∉ X , A ∉ Y , Y ⊄ X , Y ↛ X A \notin X, A \notin Y, Y \not \subset X, Y \not \rightarrow X A/X,A/Y,YX,YX,使得 X → Y , Y → A X \rightarrow Y, Y \rightarrow A XY,YA成立。满足以上条件则称 R ( U ) R(U) R(U)属于第三范式,记为 R ( U ) ∈ 3 N F R(U) \in 3NF R(U)3NF.
  • 其实就是 3 N F 3NF 3NF中不存在非主属性对候选键的传递依赖。

举例:商店关系 S t o r e ( S i d , P i d , D i d , M g r ) Store(Sid, Pid, Did, Mgr) Store(Sid,Pid,Did,Mgr),其中 S i d Sid Sid为商店, P i d Pid Pid为商品, D i d Did Did为经营部, M g r Mgr Mgr为经理。
函数依赖: { S i d , P i d } → D i d , { S i d , D i d } → M g r \{Sid, Pid\} \rightarrow Did, \{Sid, Did\} \rightarrow Mgr {Sid,Pid}Did,{Sid,Did}Mgr.
候选键: { S i d , P i d } \{Sid, Pid\} {Sid,Pid},非主属性 D i d , M g r Did, Mgr Did,Mgr.
从给出的函数依赖可以看出,它恰好符合了定义中给出的情况,所以不满足3范。

  1. 3 N F 3NF 3NF转化为 3 N F 3NF 3NF的方法
  • 消除关系中的传递依赖即可。如上面的例子化为: R 1 ( S i d , P i d , D i d ) , R 2 ( S i d , D i d , M g r ) R_1(Sid, Pid, Did), R_2(Sid, Did, Mgr) R1(Sid,Pid,Did),R2(Sid,Did,Mgr).得到的两个新关系都满足3范。
  • A → B , B → C A \rightarrow B, B \rightarrow C AB,BC,要将 B , C B, C B,C单独拆成一张表, B B B保留在原表中。
四、关系的BCNF
  1. 定义: R ( U , F ) ∈ 1 N F R(U, F) \in 1NF R(U,F)1NF,对于任何 X → Y ∈ F X \rightarrow Y \in F XYF,当 Y ⊄ X Y \not \subset X YX时, X X X必含有候选键,称 R ( U ) R(U) R(U)属于Boyce-Codd范式,记为 R ( U ) ∈ B C N F R(U) \in BCNF R(U)BCNF. 即关系中所有函数依赖的左侧必须包含候选键。

举例:邮编(城市,街道,邮政编码)。
函数依赖:{城市,街道} → \rightarrow 邮政编码;邮政编码 → \rightarrow 城市。
候选键:{城市,街道} ⟶ f U \stackrel{f}\longrightarrow U fU
在函数依赖 “邮政编码 → \rightarrow 城市” 中,因左侧不含候选键,所以不满足BCNF,但是它是满足3NF的(可以对照3NF的定义)。

  1. 关系模式分解成 B C N F BCNF BCNF
  • 示例: R ( A , B , C , D , E , F , G ) R(A, B, C, D, E, F, G) R(A,B,C,D,E,F,G),函数依赖集合 { A → B , A → C , C → D , C → E , E → F G } \{A \rightarrow B, A \rightarrow C, C \rightarrow D, C \rightarrow E, E \rightarrow FG\} {AB,AC,CD,CE,EFG}.

候选键: A A A,显然有不依赖于候选键的其他函数依赖, R R R不满足BCNF.

分解规则:将左侧不含候选键的函数依赖单独组成一个关系,将包含候选键的组成一个关系
从而得到 ρ = { R 1 ( C , D ) , R 2 ( C , E ) , R 3 ( E , F , G ) , R 4 ( A , B , C ) } \rho = \{R_1(C, D), R_2(C, E), R_3(E, F, G), R_4(A, B, C)\} ρ={R1(C,D),R2(C,E),R3(E,F,G),R4(A,B,C)},这里每个关系都满足BCNF.
接着,可以将决定因素相同的关系合并
从而得到 ρ = { R 12 ( C , D , E ) , R 3 ( E , F , G ) , R 4 ( A , B , C ) } \rho = \{R_{12}(C, D, E), R_3(E, F, G), R_4(A, B, C)\} ρ={R12(C,D,E),R3(E,F,G),R4(A,B,C)}.

  • 还有一种说法是:将所有 X → Y X \rightarrow Y XY,但 X X X不是候选键的函数依赖找出来,拆成以下两个表:R1(原表除去 Y Y Y),R2( X Y XY XY)。
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值