數據庫SQL(八):Functional Dependencies (函數依賴)

關係數據庫設計的目標:決策一個特定的關係模式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,所有的算法和證明都搞定了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章