規範化過程主要為克服資料庫邏輯結構中的插入異常、刪除異常、冗餘度大的缺陷。資料庫規範化能夠讓資料庫設計者更了解組織內部目前的資料結構,最終得到一系列的資料實體。資料庫規範化透過資料庫表的設計,可以有效降低資料庫冗餘程度。
資料庫規範化過程
關係資料庫的規範化說的通俗一些就是對錶的規範化。
規範化的必要性:
#根據專案的需求,我們會建立對應的資料庫表格來完成專案中的數據的儲存。這已經成為做專案的固定流程了,但是在真正的開始處理業務需求的時候,就會意識到自己的表格設定的不合理,導致資料的重複存儲,插入異常,刪除異常,更新異常等問題,這時就需要來重新的規劃表格,既浪費時間,又消耗人力財力,十分不划算,因此規範化是十分有必要的,所以今天就在這裡教給大家規範表的方法。
在教導規範化資料庫方法之前,先給大家介紹知識:
#關鍵知識點函數依賴
定義可能有些難以理解,我在這裡簡單的解釋一下:函數依賴描述的是兩個集合之間的一種映射關係,這種映射關係與函數是一樣的,例如y = x^2,在這裡對於x來說,一個x就對應一個y值,但是不存在,一個x對應多種y值的情況,所以就可以說y函數依賴於x,然而對於y來說,存在一個y值對應多個x值的情況,所以說x並不函數依賴y。這就是函數依賴。
接下來我們介紹幾個特殊的函數依賴:
完全函數依賴
#定義:
如果X-> ;Y,而對於任一個X的真子集X'都不存在,X'->Y,那麼我們就說X->Y這種函數依賴屬於完全函數依賴。
簡單的解釋一下: 函數z = x y,對於z來說:z函數依賴x和y,但是z並不單獨依賴x或單獨依賴y,這就表示z函數依賴於x和y的這種依賴就是完全函數依賴。
部分函數依賴:
定義:
如果X->Y,但是Y不完全依賴X,則稱這種依賴為部分完全依賴。也就是說:函數z = x 0y 是可以看成 ,也就是說z函數依賴x和y,但是z又單獨依賴x,那麼這就是部分函數依賴。
傳遞函數依賴:
定義:
如果X->Y, Y -> Z ,並且不成立,Y-> X也不成立。則稱Z傳遞函數依賴X。
這個比較簡單,函數組z = x^2, x = 2y可以化簡為z = 4y ^2,很容易看出:z是函數依賴x,x依賴y,並且z ->x不成立,這就是傳遞函數依賴。
關鍵知識點之二-----鍵
#候選鍵:一個屬性(欄位)或一個屬性組(多個欄位)能夠完全決定於關係模式(表)中的其他屬性(欄位)。也就是說其他屬性(字段)完全依賴該屬性(字段)或屬性組(多個字段)。
主鍵:如果候選鍵多於一個,則選擇其中一個作為主鍵。被選做主鍵的屬性或屬性組在該關係模式(表)中的每一個元祖(行)中的值是不允許重複和取值為null的。
主屬性:報完在任何一個候選鍵中的屬性,稱為主屬性。如果候選鍵是由多個屬性共同組成的,那麼這些屬性組中每一個屬性都是主屬性。
非主屬性:不包含在任何鍵中的屬性稱為非主屬性。
外鍵:某屬性或屬性群組在目前關係模式(表)中不是主鍵,但是另一個關係模式(表)中充當主鍵的身份,則稱該屬性或屬性組為外鍵。
在介紹完了上述的基本知識點之後,我們來開始學習資料庫表的規範過程:
#想要規格表,就首先需要一個標準,來衡量表是否已經規範。這個標準就是----範式。
範式一共有六種:第一範式(1NF),第二範式(2NF),第三範式(3NF),BC範式(BCNF),第四範式(4NF),第五範式(5NF)。
在上面六中範式中,在一般的情況下我們需要將表規範到BCNF就已經十分完美了,在真正的專案中其實只需要達到3NF就足夠了。
接下來重點介紹前4中範式:
第一個範式:關係模式R中的所有屬性都是不可分的資料項。
簡單來說就是只要你能把表格建出來,這個表格就已經滿足了第一個範式了。例如student表(student_id, course_id, student_name, age, sex, grade, sdept, sdept_director),在這個表中很明顯grade這一項是受student_id, course_id,共同決定的,所以應該讓這兩項聯合做為主鍵。
第二範式:在滿足第一範式的基礎上,滿足非主屬性都完全依賴R的主鍵。
這就需要用到前面講的內容了,要判斷非主屬性是否完全依賴主鍵。如果不滿足就重 更改表的結構。例如student表(student_id, course_id, student_name, age, sex, grade, sdept_id, sdept_director)因為student_id, course_id兩項聯合做為主鍵,但是對於其他的字段name, age, sexname, age, sexname 屬性來說,它們是完全依存為賴於student_id這一屬性的,所以它們對於student_id, course_id共同作為主鍵是部分 依賴的。這就不滿足第二範式的定義了,所以應該把 grade拿出來,將這一個大表拆成 兩份小表:student(student_id, name, age, sex, sdept_id, sdept_director), student_score(student_id, course_id , grade);
第三範式:在滿足第二範式的情況下移除傳遞依賴。
例如:student表(student_id, student_name, age, sex, sdept, sdept_director),很明顯每一個專業決定一個專業主任,所以sdept_director傳遞依賴於student_id,所以應該再拆分一個表student(student_id, student_name, age, sex)和sdept(sdept_id, sdept_name, sdept_director),這樣就滿足了第三範式。
BC範式:在滿足第三範式的情況下,再滿足一下三點:
1、所有的主屬性完全依賴其他不包含自己的候選鍵;
2、所有的非主屬性完全依賴每一個候選鍵;
3、沒有任何屬性完全函數依賴任何一群組非主屬性。
之前的三個範式都是對非主屬性進行各種約束,BC範式是在他們基礎上,再對主屬性進行約束,解決了主屬性之間的部分依賴的問題,以及不存在主屬性完全依賴非主屬性的問題。 我們的student表student(student_id, student_name, age, sex),主鍵是student_id,所以主屬性是student_id,很顯然前兩條都已經滿足,因為學生的姓名可能重複,所以student_id與student_name之間沒有依賴函數關係,所以student表滿足BC範式。
以上就是資料庫的規範化過程
相關推薦:《mysql教學》
以上是規範化過程主要為克服資料庫邏輯結構中的什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!