一、數據庫中的函數依賴
在關系型數據庫中,函數依賴是指一個或多個屬性(列)值的變化是否會導致其他屬性(列)值的變化。根據不同的依賴關系類型,可以分為以下幾種:
1、完全函數依賴
表示屬性的值只和另一個屬性或屬性集合有關,任何其他屬性沒有影響力。
設X,Y是關系R的兩個屬性集合,X’是X的真子集,存在X→Y,但對每一個X’都有X’!→Y,則稱Y完全函數依賴于X。
比如說:C可以通過AB得到,并且C不可以僅通過A得到,也不可以僅通過B得到,那么就說C完全依賴AB。
實例:通過{學生學號,選修課程名}可以得到{該生本門選修課程的成績},而通過單獨的{學生學號}或者單獨的{選修課程名}都無法得到該成績,則說明{該生本門選修課程的成績}完全依賴于{學生學號,選修課程名}
2、部分函數依賴
表示屬性的值取決于多個屬性,而且其中一些屬性可以被移除而不影響該屬性的值。
設X,Y是關系R的兩個屬性集合,存在X→Y,若X’是X的真子集,存在X’→Y,則稱Y部分函數依賴于X。
比如說:C可以通過AB得到,并且C也可以僅通過A得到,僅通過B得到,那么就說C部分依賴AB。
實例:通過{學生學號,課程號}可以得到{該生姓名},而通過單獨的{學生學號}已經能夠得到{該生姓名},則說明{該生姓名}部分依賴于{學生學號,課程號}; 又比如,?通過{學生學號,課程號}可以得到{課程名稱},而通過單獨的{課程號}已經能夠得到{課程名稱},則說明{課程名稱}部分依賴于{學生學號,課程號}。(部分依賴會造成數據冗余及各種異常。)
3、傳遞函數依賴
表示屬性的值由其他屬性之間通過傳遞關系所決定。
設X,Y,Z是關系R中互不相同的屬性集合,存在X→Y(Y !→X),Y→Z,則稱Z傳遞函數依賴于X。
比如說:B可以通過A得到,C可以通過B得到,那么就稱C傳遞依賴A。
實例:在關系R(學號,宿舍,費用)中,通過{學號}可以得到{宿舍},通過{宿舍}可以得到{費用},而反之都不成立,則存在傳遞依賴{學號}->{費用}。(傳遞依賴也會造成數據冗余及各種異常。)
二、數據庫三大范式
1、名列前茅范式
數據庫每一列都是不可分的基本數據項(原子數據項)。
就比如說,下面一個數據表:
上表所示的地址,就不符合名列前茅范式,以為地址那一列可以分為省份和市區,故可以修改為:
2、第二范式
第二范式要求在滿足名列前茅范式的基礎上,非碼屬性必須完全依賴于候選字,也就是要消除部分依賴。
就比如說:
如上圖加粗字體所示,可能對于同一個訂單,含有不同的產品,因此主鍵必須是產品號和訂單號聯合組成。但可以發現產品數量、產品價格與訂單號、產品號都有關,不過訂單時間與訂單金額僅與訂單號有關,這就違反了第二范式。故可以修改為:
3、第三范式
第三范式要求在滿足第二范式的基礎上,任何非主屬性不依賴于其他非主屬性,即在第二范式的基礎上消除傳遞依賴。第三范式要求數據表的每一列都與主鍵直接相關,而不是間接相關。
就比如說:
從上表可以看出,所有屬性都完全依賴于學號,故符合第三范式,但是班主任性別和班主任年齡直接依賴于班主任姓名,而不是主鍵學號,故不符合第三范式??尚薷臑椋?/p>
延伸閱讀1:數據庫模式分解簡介
把一個關系模式分解成若干個關系模式的過程,稱為關系模式的分解。把低一級的關系模式分解為若干個高一級的關系模式的方法不是少數的。只有能夠保證分解后的關系模式與原關系模式等價,分解方法才有意義。