1. 程式人生 > >關系數據理論

關系數據理論

primary 規範化 -1 tps mage lin 定義 研究 好的

寫在前面,???∈?符號的區分:

?:包含於

?:包含於或等於

?:不包含於或等於

∈:屬於 ?:不屬於

?和∈的區別:"包含於"用於說明集合與集合之間的關系,"屬於"用於說明集合與元素之間的關系。

什麽是好的關系模式(表結構)?

不好的關系模式會有什麽問題?

怎樣把不好的關系模式轉化為好的?

這就是下面要學的──關系數據庫的規範化理論

本節要點:

  • 函數依賴
  • 範式
    • 1NF
    • 2NF
    • 3NF

首先看4個定義。

1 函數依賴

定義1設R(U)是一個屬性集U上的關系模式,X和Y是U的子集。若對於R(U)的任意一個可能的關系r,r中對於X的每一個具體值,Y都有唯一的具體值與之對應, 則稱 “X

函數決定Y” 或 “Y函數依賴於X”,記作X→Y。y=f(x)

X稱為這個函數依賴的決定屬性集。

等價定義:r中不可能存在兩個元組在X上的屬性值相等,而在Y上的屬性值不等

示例: Student(Sno, Sname, Ssex, Sage, Sdept)

則有:

Sno → Sname , Sno → Ssex,

Sno → Sage , Sno → Sdept,

但Ssex技術分享 Sage

介紹一些術語:

若X→Y,並且Y→X, 則記為X←→Y。

若Y不函數依賴於X, 則記為X 技術分享 Y。

若 X→Y,則X稱為這個函數依賴的決定屬性組,也稱為決定因素。

若X→Y,但Y í X, 則稱X →Y是非平凡的函數依賴

若X→Y,但Y ? X, 則稱X→Y是平凡的函數依賴。對於任一關系模式,平凡函數依賴都是必然成立的,若不特別聲明,總是討論非平凡的函數依賴。

示例:在關系SC(Sno, Cno, Grade)中

平凡函數依賴: Sno → Sno

(Sno, Cno) → Sno

(Sno, Cno) → Cno

非平凡函數依賴: (Sno, Cno) → Grade

定義2:設X,Y是關系R的兩個屬性集合,X’是X的真子集,存在X→Y,但對每一個X’都有X’!→Y,則稱Y完全函數依賴於X。若存在X’→Y,則稱Y部分函數依賴於X。

示例:學生成績表中(學號,課程號)→成績是完全函數依賴,(學號,課程號)→學生所在系

是部分函數依賴,因為學號→學生所在系成立,而學號是(學號,課程號)的真子集。

定義3設X,Y,Z是關系R中互不相同的屬性集合,存在X→Y(Y!→X),Y→Z,則稱Z傳遞函數依賴於X。

註:如果Y→X,即X←→Y,則Z直接依賴於X。

示例:在關系R(學號 ,宿舍, 費用)中,(學號)->(宿舍),宿舍!=學號,(宿舍)->(費用),費用!=宿舍,所以符合傳遞函數的要求。

2

第二章關於候選碼(Candidate key)的定義:若關系中的某一屬性組的值能唯一地標識一個元組,則稱該屬性組為候選碼,候選碼簡稱為碼。

定義4設K為關系模式R<U,F>中的屬性或屬性組合。若U對K完全依賴,則K為R的候選碼。若關系某事R有多個候選碼,則選定其中一個為主碼(Primary key)。

主屬性與非主屬性:包含在任何一個候選碼中的屬性稱為主屬性,不包含在任何碼中的屬性稱為非主屬性

全碼(All Key):一個關系中所有屬性的組合為碼,稱為全碼。

然後研究數據庫的規範化。

3 範式

關系數據庫中的關系是要滿足一定要求的,滿足不同程度要求的為不同範式。滿足最低要求的叫第一範式,簡稱1NF。在第一範式中滿足進一步要求的為第二範式,其余以此類推。

範式的種類:(這裏僅學習前三種)

第一範式(1NF)

第二範式(2NF)

第三範式(3NF)

BC範式(BCNF)

第四範式(4NF)

第五範式(5NF)

各範式之間的關系:5NF?4NF?3NF ?2NF ?1NF。

3.1 1NF

定義5如果一個關系模式R的所有屬性都是不可分的基本數據項,則R∈1NF。

回憶關系的性質:

① 列是同質的

② 不同的列可出自同一個域

③ 列的順序無所謂

④ 任意兩個元組不能完全相同

⑤ 行的順序無所謂

⑥ 分量必須取原子值

如下面關系中,一個學生需要學習多門課程,所以一個屬性裏面包含多個值,不符合“⑥分量必須取原子值”的性質。所以不滿足1NF。

關系模式:SCG(SNO, SNAME, SAGE, CNO, GRADE)

技術分享

改成下面樣式,使關系滿足1NF:

技術分享

3.2 2NF

上面滿足1NF的關系可能存在的問題:

1.數據冗余:賀小華學生的基本信息進行了多次保存

2.修改困難:如果想修改“賀小華”為“賀大華”則需要更改4次,而且要保證沒有遺漏

3.插入和刪除異常--該插入的不能插,不該刪的刪了:當前關系是以學號和課程號作為主碼,那麽如果僅僅只想插入一條學生信息就不能實現,因為沒有課號信息。

那麽怎麽才能規避這些問題呢?

分析上述關系的函數依賴。

關系模式:SCG(SNO, SNAME, SAGE, CNO, GRADE)

函數依賴包括:

GRADE對(SNO, CNO)完全函數依賴

SNAME 依賴於SNO

SNAME對(SNO, CNO)部分函數依賴

同樣SAGE依賴於SNO

SAGE對(SNO, CNO)部分函數依賴

分析上面的例子,可以發現問題在於有兩種非主屬性。一種如GRADE,它對碼是完全函數依賴。另一種如SNAME,SAGE對碼不是完全函數依賴。所以解決1NF這些問題就是使所有非主屬性完全依賴於碼。

定義6若關系模式R∈1NF,並且每一個非主屬性都完全函數依賴於R的 碼,則R∈2NF。(2NF也就是不允許關系模式存在非主屬性對碼的部分函數依賴)

所以SCG(SNO, SNAME, SAGE, CNO, GRADE)不屬於2NF。

解決辦法:

SCG分解為兩個關系模式

S(SNO, SNAME, SAGE)

SC(SNO, CNO, GRADE)

S: SNO→SNAME SNO→SAGE

SC:(SNO, CNO) → GRADE

沒有非主屬性對碼部分函數依賴S,SC分別達到2NF,1NF的3個問題也得到解決。

3.3 3NF

有關系模式 SL(Sno, Sname, Sdept, Sloc)表示學生的信息和系地址信息。

關系如下:

Sno

Sname

Sdept

Sloc

95001

李勇

CS

理科樓

95002

劉晨

CS

理科樓

95003

王敏

CS

理科樓

95004

張立

IS

文科樓

95005

劉斌

IS

文科樓

95006

王建國

IS

文科樓

95007

王家昌

MA

綜合樓

存在問題:

1) 數據冗余度大:每個系的地址都一樣,關於系地址的信息卻要重復存儲於該系學生人數相同的次數。

2) 修改困難:當學校調整系地址時,每個系地址的信息重復存儲,修改時必須同時更新該系所有學生的Sloc

3) 插入異常:如果某個系剛成立,目前暫時沒有在校學生,無法把系地址的信息存入數據庫。

4) 刪除異常:如果某個系的學生全部畢業了,在刪除該系學生信息的同時,把這個系的地址信息也刪除了。

問題出在哪呢?

存在非主屬性對碼的傳遞依賴:(Sloc不直接依賴於碼Sno,而是通過Sdept傳遞依賴)

Sno→Sdept

Sdept→ Sloc

Sno→ Sloc

定義7: 關系模式R<U,F> 中若不存在這樣的碼X、屬性組Y及非主屬性Z, 使得X→Y,Y → Z成立,則稱R<U,F> ∈ 3NF。 (即沒有非主屬性對碼的傳遞函數依賴)

例, SL(Sno, Sname, Sdept, Sloc )∈2NF

SL(Sno, Sname, Sdept, Sloc ) ? 3NF

解決方法:

把SL分解為兩個關系模式,以消除傳遞函數依賴:

SD(Sno, Sname, Sdept)

DL(Sdept, Sloc)

SD的碼為Sno,DL的碼為Sdept。非主屬性直接依賴於碼,是3NF,2NF存在的幾個問題得到解決。

若R∈3NF,則R的每一個非主屬性,既不部分函數依賴於碼,也不傳遞函數依賴於碼。

關系數據理論