函數依賴與數據庫設計三大範式

函數依賴轉載與:https://blog.csdn.net/eahau/article/details/91127992

三大範式轉載與:https://www.cnblogs.com/xrq730/p/5100442.html

函數依賴

函數依賴是指關係中屬性間(或者說是表中字段間)的對應關係。
定義:設 R 爲任一給定關係,如果對於 R 中屬性 X 的每一個值,R 中的屬性 Y 只有唯一值與之對應,則稱 X 函數決定 Y 或稱 Y 函數依賴於 X ,記作 X—>Y。其中,X 稱爲決定因素。
可以理解爲函數 y = f(x); 對於任意的 x 都有唯一的 y ,且 y 的取值由 x 決定。
例如:學生號—>學生姓名,學生年齡等等有關該學生的所有信息
根據函數依賴性質可分爲以下三種:

完全函數依賴
書上定義的意思基本是:如果存在 X 屬性集(注意是集合,說明是聯合主鍵)決定 唯一的 Y ,且 X 中的任一子集都不能決定 唯一的 Y,則 Y 完全依賴於 X。沒有多餘屬性,有多餘屬性就是部分函數依賴。
例如:學生數學成績完全由該學生的學號和數學課決定,所以數學課成績完全依賴於(學號,數學課)


部分函數依賴
定義和完全函數依賴有一點不一樣,就是 X 的屬性集中某一子集可以決定唯一的 Y,即有多餘屬性
例如:學生學號和姓名可以決定唯一的學生,但是學生號也可以決定唯一的學生


傳遞函數依賴
定義:設 R 爲任一給定關係, X Y Z 爲其不同的屬性子集,若 X —> Y, Y 不決定 X 且 Y —>Z,則有 X —>Z,稱爲 Z 傳遞函數依賴於 X
例如:書的出版編號是唯一,版權歸出版社所有,所以只能由該出版社出版。所以存在函數依賴:書出版編號—>出版社名,出版社名—>出版社地址,但是出版社名不能決定唯一的出版書編號(除非出版社只出版過一本書,那我沒話說?),則有出版社地址傳遞函數依賴於出版書編號
————————————————

 

什麼是三範式

設計關係型數據庫時,遵從不同的規範要求,設計出合理的關係型數據庫,這些不同的規範要求被稱爲不同的範式,各種範式呈遞次規範,越高的範式數據庫冗餘越小。

目前關係型數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。一般來說,數據庫只需要滿足第三範式就行了。

第一範式:保證每列的原子性

第一範式是最基本的範式。如果數據庫表中的所有字段值都是不可分解的原子值,就說明該數據庫滿足了第一範式。

第一範式需要根據系統的實際需求來定,比如有一張用戶信息表:

一般來說"住址"設計成一個字段就行,但是如果經常訪問"住址"中城市的部分,那麼就非要將"住址"這個屬性重新拆分爲"省份"、"城市"、"地址"等多個部分進行存儲,這樣在對"住址"中某一部分進行操作的時候將非常方便。這麼設計纔算滿足了數據庫的第一範式,修改之後的表結構如圖:

第二範式:保證一張表只描述一件事情

這是通俗的說法,用第二範式的定義描述第二範式,說的是在滿足第一範式的基礎上,數據庫表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴,也即所有非關鍵字段都完全依賴於任一組候選關鍵字。

看不懂是嗎,沒關係,我也看不懂,下面舉一個例子,有一張表如下圖:

上表滿足第一範式,即每個字段不可再分,但是這張表設計得並不好,或者說,這張表的設計並不滿足第二範式。因爲這張表裏面描述了兩件事情:學生信息、課程信息,"學分"完全依賴於"課程名稱"、"姓名"與"年齡"完全依賴於"學號"。這麼做的後果是:

1、數據冗餘:同一門課程由n個學生選修,"學分"重複n-1次;同一個學生選修了m門課程,姓名和年齡重複m-1次

2、更新異常:若調整了某門課程的學分,數據表中所有行的"學分"值都需要更新,否則會出現同一門課程學分不同的情況

3、插入異常:假設要開一門新課程,暫時沒有人選修,那麼由於沒有"學號"關鍵字,"課程"與"學分"也無法記錄入數據庫

4、刪除異常:假設一批學生已經完成課程的選修,這些選修記錄就應該從數據庫表中刪除。但是,與此同時,"課程"和"學分"也被刪除了,顯然,這最終可能會導致插入異常

所以,此表的結構必須修改,修改後如下:

增加了表,將學生信息與課程信息通過一張中間表關聯,很好地解決了上面的幾個問題,這就是第二範式的中心----保證一張表只講一件事情。

第三範式----保證每列都和主鍵直接相關

第三範式又和第二範式相關,用第三範式的定義描述第三範式就是,數據庫表中如果不存在非關鍵字段任一候選關鍵字段的傳遞函數依賴則符合第三範式,所謂傳遞函數依賴指的是如果存在"A-->B-->C"的決定關係,則C傳遞函數依賴於A。也就是說表中的字段和主鍵直接對應不依靠其他中間字段,說白了就是,決定某字段值的必須是主鍵

舉個例子,看一下如下的表結構:

第三範式和第二範式有點像,從這張數據庫表結構中可以看出,"姓名"、"年齡"、"學院"和主鍵"學號"直接關聯,但是"學院地點"、"學院電話"卻不直接和主鍵"學號"相關聯,和"學院電話"直接相關聯的是"學院",如果表結構這麼設計,同樣會造成和第二範式一樣的數據冗餘、更新異常、插入異常、刪除異常的問題。

修改之後的表結構如下圖:

同樣,這麼設計表結構將合理地多,也解決了前面的四個問題。原文作者

發佈了325 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章