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