天天看点

数据库规范化码和属性的关系函数依赖码范式

码和属性的关系

函数依赖

f ( X ) → Y f(X)\rightarrow Y f(X)→Y,则 Y Y Y函数依赖于 X X X。理解为知道 X X X后,就可以推出 Y Y Y;而且,能且仅能推出唯一的 Y Y Y。这类似于数学上的函数。

平凡函数依赖: X → Y X \rightarrow Y X→Y,同时 Y ∈ X Y \in X Y∈X,则是平凡函数依赖。

非平凡函数依赖: X → F Y X \xrightarrow{F} Y XF

​Y,同时 Y ∉ X Y \notin X Y∈/​X,则是非平凡函数依赖。

完全函数依赖: X → Y X \rightarrow Y X→Y,而且任何 X X X的真子集 X ′ X^{'} X′,都没有 X ′ → Y X^{'}\rightarrow Y X′→Y

部分函数依赖: X → P Y X \xrightarrow{P} Y XP

​Y,而且任何 X X X的真子集 X ′ X^{'} X′,存在至少一个 X ′ X^{'} X′, X ′ → P Y X^{'}\xrightarrow{P} Y X′P

​Y。

一个关系的所有属性。

候选码: 唯一标识一个关系的属性组

主码: 候选码多于一个,从候选码中选出的一个码作为主码。

主属性: 候选码的所有属性。

非主属性: 不包含在任何候选码中的属性

全码: 极端情况下,整个属性组都是码。

外码: X X X不是该关系模式的码,但是 X X X是另一个关系模式的码。比如 ( S n o , C n o , G r a d e ) (Sno, Cno, Grade) (Sno,Cno,Grade)中的Sno不是码,但 S n o Sno Sno是 ( S n o , S n a m e , S a g e ) (Sno, Sname, Sage) (Sno,Sname,Sage)的码,则 S n o Sno Sno是外码

范式

范式的作用是减少数据冗余和消除各种异常。

1NF

所有的关系模式都是1NF

2NF

在1NF的基础上,不存在部分函数依赖。

比如给出一个表:

( S n o , S d e p t , S l o c , C n o , G r a d e ) (Sno,Sdept,Sloc,Cno,Grade) (Sno,Sdept,Sloc,Cno,Grade)

其中 S n o Sno Sno学号, S d e p t Sdept Sdept是系, S l o c Sloc Sloc是寝室地址, C n o Cno Cno是课程号, G r a d e Grade Grade是该学生某个课程的成绩。

( S n o , C n o ) → F G r a d e S n o → S d e p t ,   ( S n o , C n o ) → P S d e p t S n o → S l o c ,   ( S n o , C n o ) → P S l o c (Sno, Cno)\xrightarrow{F} Grade \\ Sno \rightarrow Sdept, \ (Sno,Cno)\xrightarrow{P} Sdept\\ Sno \rightarrow Sloc, \ (Sno, Cno)\xrightarrow{P} Sloc (Sno,Cno)F

​GradeSno→Sdept, (Sno,Cno)P

​SdeptSno→Sloc, (Sno,Cno)P

​Sloc

那么上述存在了部分函数依赖,需要把部分函数依赖的进行消除:

S n o → S d e p t S n o → S l o c Sno \rightarrow Sdept \\ Sno \rightarrow Sloc Sno→SdeptSno→Sloc

因此得出新的关系模式:

( S n o , S l o c , S d e p t ) ( S n o , C n o , G r a d e ) (Sno, Sloc, Sdept) \\ (Sno, Cno, Grade) (Sno,Sloc,Sdept)(Sno,Cno,Grade)

3NF

在2NF的基础上,消除传递函数依赖。

传递函数依赖: X → Y X\rightarrow Y X→Y, Y ↛ X Y\nrightarrow X Y↛X, Y → Z Y\rightarrow Z Y→Z,则 Z Z Z传递依赖于 X X X。

比如上述的关系模式:

( S n o , S l o c , S d e p t ) (Sno, Sloc, Sdept) (Sno,Sloc,Sdept)

S n o → S l o c S d e p t ↛ S n o S l o c → S d e p t Sno\rightarrow Sloc \\ Sdept \nrightarrow Sno \\ Sloc \rightarrow Sdept Sno→SlocSdept↛SnoSloc→Sdept

那么 S d e p t Sdept Sdept函数传递依赖与 S n o Sno Sno。3NF需要消除这种模式。

( S n o , S d e p t ) ( S d e p t , S l o c ) (Sno, Sdept) \\ (Sdept, Sloc) (Sno,Sdept)(Sdept,Sloc)

BCNF

在3NF基础上,使得每一个决定因素都包含码。

给出一个BCNF的反例:

S T J ( S , T , J ) STJ(S, T, J) STJ(S,T,J)

其中 S S S是学生, T T T是教师, J J J是课程。所以有:

( S , J ) → T ( S , T ) → J T → J (S, J)\rightarrow T \\ (S, T)\rightarrow J \\ T\rightarrow J (S,J)→T(S,T)→JT→J

( S , J ) (S, J) (S,J)和 ( S , T ) (S, T) (S,T)都是候选码。 T T T是决定因素,但是 T T T不包含码。

在只考虑函数依赖的情况下,BCNF是规范化程度最高的范式。

4NF

多值依赖: 设 R ( U ) R(U) R(U)是属性集 U U U上的一个关系模式, X , Y , Z X,Y,Z X,Y,Z是 U U U的子集,且 Z = U − X − Y Z=U-X-Y Z=U−X−Y。当且仅当 R ( U ) R(U) R(U)的任一关系 r r r,给定的一对 ( x , y ) (x,y) (x,y)值,有一组 Y Y Y的值,这组值仅仅取决于 X X X的值而与 Z Z Z的值无关,则成 R ( U ) R(U) R(U)中的多值依赖 X → → Y X\rightarrow \rightarrow Y X→→Y成立。

平凡多值依赖: 若 X → → Y X \rightarrow \rightarrow Y X→→Y,而 Z = ∅ Z=\empty Z=∅,则称 X → → Y X\rightarrow \rightarrow Y X→→Y为平凡多值依赖。

4NF: 关系模式 R < U , F > ∈ 1 N F R<U,F>\in 1NF R<U,F>∈1NF,如果对于 R R R的每个非平凡多值依赖 X → → Y X\rightarrow \rightarrow Y X→→Y( Y ⊈ X Y \nsubseteq X Y⊈X),X都含有码,则 R < U , F > ∈ 4 N F R<U,F>\in 4NF R<U,F>∈4NF。