关系数据库设计【笔记】
簡(jiǎn)述
學(xué)習(xí)《數(shù)據(jù)庫(kù)系統(tǒng)概念》做的筆記
- 前一篇是ER圖以及ER模型相關(guān)的
- E-R模型和E-R圖
文章目錄
- 簡(jiǎn)述
- 函數(shù)依賴
- 通過函數(shù)依賴發(fā)現(xiàn)問題
- 無(wú)損分解和有損分解
- 原子域和第一范式
- 原子域定義
- 第一范式定義
- 使用函數(shù)依賴進(jìn)行分解
- 超碼的定義
- 關(guān)系依賴
- 平凡的函數(shù)依賴
- 閉包(closure)
- Boyce-Codd范式(BC范式)
- 第三范式(3NF)
- 函數(shù)依賴?yán)碚?/li>
- Armstrong公理
- 屬性集的閉包
- 第四范式
- 多值依賴
- 第四范式(4NF)
- 正則覆蓋
- 無(wú)關(guān)屬性
- 實(shí)例
- 正則覆蓋
函數(shù)依賴
- 定義一條規(guī)則,“如果存在模式(dept_name, budget),則dept_name可以作為主碼”。
- 這條規(guī)則就被定位為函數(shù)依賴(functional dependency)
通過函數(shù)依賴發(fā)現(xiàn)問題
- 如果存在這樣的函數(shù)依賴,但是dept_name卻不是原來(lái)的關(guān)系數(shù)據(jù)庫(kù)的主碼。那么說(shuō)明有重復(fù)的budget信息。
無(wú)損分解和有損分解
- 無(wú)損分解:分解之后,再用自然連接的方式組合起來(lái)可以恢復(fù)為原樣。否則就是有損的。
原子域和第一范式
- 之前在ER模型中講到了子結(jié)構(gòu)的問題。這里對(duì)這種東西做一個(gè)思想化。
原子域定義
- 一個(gè)域是原子的,如果該域中的元素被認(rèn)為是不可分的單元(不存在子結(jié)構(gòu))。
第一范式定義
- 我們稱一個(gè)關(guān)系模式R屬于第一范式(First normal Form, 1NF),如果R中的所有的元素都是原子的。
使用函數(shù)依賴進(jìn)行分解
超碼的定義
- 舊定義: 可以唯一識(shí)別關(guān)系中的一條元組的一個(gè)或等多個(gè)屬性的集合
- 新定義: 令r(R)是一個(gè)關(guān)系模式。R的子集K是R的超碼的條件是
- 在r (R)的合法實(shí)例中,對(duì)r的實(shí)例中的所有元組對(duì)t1t_1t1?和t2t_2t2?,若 t1≠t2t_1 \neq t_2t1???=t2?,則t1[K]≠t2[K]t_1[K] \neq t_2[K]t1?[K]??=t2?[K]。
關(guān)系依賴
表達(dá)式看起來(lái)比糅雜,但是意思很簡(jiǎn)單。
- 我們說(shuō)這個(gè)實(shí)例是滿足A->B 這樣的函數(shù)依賴,就是說(shuō),對(duì)于這個(gè)實(shí)例的任兩個(gè)元組,如果他們的A部分是一樣的話,那么B部分也是一樣的。
其實(shí)跟我們之前講到的那個(gè)例子是完全符合的。
平凡的函數(shù)依賴
有些函數(shù)依賴是很顯然的。
- 比如:A->A之類的。
閉包(closure)
- 在一個(gè)關(guān)系模式上,其實(shí)是有很多的函數(shù)依賴的。
- 比如:A->B,B-C 就可以知道A->C。
給出閉包的概念
- 就是有一個(gè)集合F,能通過F推導(dǎo)出來(lái)的所有閉包的集合就是F的閉包。
例如:
- F = {A->B,B-C}
- 那么, F’ = {A->B,B-C, A->C} 是F的閉包
Boyce-Codd范式(BC范式)
- BC范式比較好,它能消除掉所有的基于函數(shù)依賴的冗余
條件非常簡(jiǎn)單:
基于函數(shù)依賴集合F的關(guān)系模式R屬于BCNF,
對(duì)于F閉包中的所有范式a-b,必須要有下面的兩個(gè)條件滿足一個(gè)
- a->b是一個(gè)平凡的函數(shù)依賴
- a是函數(shù)的超碼
其實(shí)這是合理的。
- 如果是超碼,當(dāng)然一點(diǎn)問題都沒有。(因?yàn)槌a本身就會(huì)帶著一堆的函數(shù)依賴)
- 如果不是超碼的話,就必須要保證這個(gè)函數(shù)依賴是平凡的。(可以理解為沒什么影響的)
因?yàn)槠椒驳脑?#xff0c;是說(shuō)對(duì)任意的關(guān)系,這個(gè)函數(shù)依賴都成立,那。。當(dāng)然無(wú)論你怎么改這玩意都是存在的啦。。當(dāng)然就不管它啦。
第三范式(3NF)
3NF是相當(dāng)于BCNF更弱一點(diǎn)的范式。
3NF放寬了點(diǎn)條件
對(duì)于F閉包中的所有范式a-b,必須要有下面的三個(gè)條件滿足一個(gè)
- a->b是一個(gè)平凡的函數(shù)依賴
- a是函數(shù)的超碼
- b-a中的每一個(gè)屬性,都包含于R的一個(gè)候選碼中(可以是每個(gè)屬性屬于不同的候選碼)
函數(shù)依賴?yán)碚?/h2>
- 邏輯蘊(yùn)涵(logically imply),(其實(shí)就說(shuō)有一個(gè)函數(shù)依賴,可以用一個(gè)函數(shù)依賴集中的某些東西來(lái)推導(dǎo)出來(lái),那么就蘊(yùn)涵了唄)
- (所以,就會(huì)有閉包的概念出現(xiàn)了)
Armstrong公理
一般來(lái)說(shuō),大家都是知道這個(gè)公理的內(nèi)容,而記不太住,這個(gè)公理的名字。。
- 自反律,a包含有b,則a->b
- 增補(bǔ)律,a->b且c也是一個(gè)屬性集,則ac->bc
- 傳遞律,a->b且b->c,則a->c
Armstrong公理是正確而有效的(sound)。
但是用這個(gè)來(lái)算閉包實(shí)在是太麻煩了。。。
- 合并律,a->b且a->c,則a->bc
- 分解律,a->bc,則a->b且a->c
- 偽傳遞律,a->b ,bc->d,則ac->d
屬性集的閉包
- a->b,我們就說(shuō)b被a給函數(shù)確定
- 閉包的符號(hào)定義A+A^+A+為AAA的閉包
第四范式
多值依賴
多值依賴A->->B條件,對(duì)于任意兩個(gè)滿足t1[A] = t2[A]的實(shí)例來(lái)說(shuō),都存在有一個(gè)t3和t4,使得
- t1[A] = t2[A] = t3[A] = t4[A]
- t3[B] = t1[B] 并且 t3[R-B] = t2[R-B]
- t4[B] = t2[B] 并且 t4[R-B] = t1[R-B]
第四范式(4NF)
對(duì)于在這個(gè)范式中,所有的多值依賴(來(lái)自整個(gè)的閉包)至少有下面中的一個(gè)成立
- A->->B是一個(gè)平凡的多值依賴
- A是超碼
正則覆蓋
無(wú)關(guān)屬性
- 將依賴集合F中的某個(gè)函數(shù)依賴的左邊的某個(gè)屬性去掉之后,任然被之前的F給邏輯蘊(yùn)含。則這個(gè)屬性是無(wú)關(guān)屬性。
類似的定義在右半部分(但是就是去掉后的部分要蘊(yùn)含原來(lái)的F)
實(shí)例
- 比如AB->C和A->C在函數(shù)依賴集合上,那么B就是無(wú)關(guān)屬性
正則覆蓋
- 去除掉所有的無(wú)關(guān)屬性
- 然后如果有A->B并且有A->C那么就變成A->BC
總結(jié)
以上是生活随笔為你收集整理的关系数据库设计【笔记】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch基础操作学习笔记(auto
- 下一篇: 【mysql】已经创建表后,修改某列的默