關係數據庫設計的目標:決策一個特定的關係模式R是否是“好”的範式。如果R不是好的範式,則將R分解爲{R1, R2, …, Rn},使得每一個子模式都是好的模式,而且分解是無損鏈接分解。過程中涉及理論是函數依賴理論和多值依賴理論。我們這裏只討論函數依賴。
1、 Functional Dependencies
函數依賴是另一種完整性約束,對於消除數據冗餘很重要,能夠系統地改進數據庫設計。
一個關係模式R上的函數依賴,表示爲:A1, A2, …, An B,A1,A2,……,An以及B都是R的屬性,這樣表達的含義是屬性集合(A1, A2, …, An) 的值唯一確定屬性集合B的值。
很好理解,A中任意一個值不能唯一確定一個B中的值,那麼函數依賴A——>B不成立,反之,B中任意一個值能唯一確定一個A中的值,所以B——>A成立。
繼續函數依賴的例子:
已知關係模式EMP(ENAME, SSN, STARTDATE,ADDRESS, PHONE),SSN是key,可以看到
SSN → ENAME,SSN → STARTDATE,SSN → ADDRESS,SSN → PHONE都是成立的。因爲SSN是key,唯一。
同樣可以寫成:
SSN → ENAME, STARTDATE, ADDRESS, PHONE
2、用函數依賴定義key
首先明白幾個key的含義:
- 超鍵(super key):在關係中能唯一標識bai元組du的屬性集稱爲關係模式zhi的超鍵
- 候選鍵(candidate key):不含有多dao餘屬性的超鍵稱爲候選鍵
- 主鍵(primary key):用戶選作元組標識的一個候選鍵程序主鍵
比如一個小範圍的所有人,沒有重名的,考慮以下屬性:身份證 姓名 性別 年齡
身份證唯一,所以是一個超鍵;
姓名唯一,所以是一個超鍵;
(姓名,性別)唯一,所以是一個超鍵;
(姓名,性別,年齡)唯一,所以是一個超鍵;
這裏可以看出,超鍵的組合是唯一的,但可能不是最小唯一的;
身份證唯一,而且沒有多餘屬性,所以是一個候選鍵;
姓名唯一,而且沒有多餘屬性,所以是一個候選鍵
這裏可以看出,候選鍵是沒有多餘屬性的超鍵
一個關係的所有候選鍵中選擇一個用來唯一確定關係的元組,這個候選鍵成爲主鍵
如何用函數依賴來定義key呢?
- 如果K是superkey,當且僅當K ——> R成立。【注意】K ——>R中R表示關係模式,可以用屬性集合來表示,即R={A1,A2,….,An}。
- candidate key:如果K是candidate key,當且僅當K ——> R 成立而且不存在α包含於 K,且 α ——> R成立(不存在K的一個子集α且α ——> R 成立)
函數依賴可以表達superkey無法表示的約束,例如下面的例子:關係模式inst_dept (ID, name, salary, dept_name, building, budget ),superkey 是(ID,dept_name)
我們可以期望函數依賴dept_name ——> budget和ID ——>building是成立的,但是dept_name ——>salary是否成立無法明確
這個例子更清晰表達有些約束無法用key來表達
例如某設計者設計的關係模式employee (SSN, Name, Rating, Hourly_Wage, Job_Desc),key爲SSN,則SSN ——>Name, Rating,Hourly_Wage,Job_Decs。
但是有一個約束無法用key表達:不同級別的員工薪水不一樣,比如阿里的員工崗位分爲十個級別。一到三分爲低端崗位,四等級的爲初級專員,五等級的是高級工程師,六等級的爲資深工程師,七等級的是技術專家,八等級爲高級專家,九等級的是資深專家,最高等級的是研究員。(來自互聯網,不一定準確),每個級別的工資不一樣。這個約束可以表達爲Rating ——> Hourly_Wage,但是rating不是key。三位員工,級別不同,小時薪水不同。(美國的支付方式)
3、函數依賴和冗餘的關係
函數依賴和冗餘的關係:函數依賴可以表達無法用superkey表達的約束,如前面的例子rating → hourly_wages。這時數據庫中的數據會有冗餘。
當我們發現關係模式中存在superkey無法表達的約束時,考慮將這個關係模式分解,例如employee (SSN, Name, Rating, Hourly_Wage, Job_Desc)。Key是SSN,存在函數依賴rating → hourly_wages,但是rating不是key。將這個關係模式分解爲連個關係模式:employee (SSN, Name, Rating, Job_Desc)和Rating_Wage( Rating, Hourly_Wage)。數據沒有冗餘。
4、平凡函數依賴
一個函數依賴在所有的關係實例上都滿足,稱作平凡函數依賴。例如ID, name → ID,name → name
形式化表達:α → β is trivial if β ⊆ α 。函數依賴的右邊是左邊的子集。
5、 函數依賴的閉包
給定一個函數依賴集合F,能夠從F邏輯推斷的的所有函數依賴的集合稱作F的閉包,,記做F+
6、總結
函數依賴與規範化設計的關係是什麼?
函數依賴是精化和建立“好”關係模式的形式化方法,可以解決數據冗餘問題、修改異常問題、Null問題
Normalization is a solved problem,所有的算法和證明都搞定了。