數據庫範式介紹

今天面試題目裏面讓羅列數據庫的範式,並且簡單介紹一下,但是因爲學習範式過去太久,平時設計數據庫雖然有這種思想,但是卻沒有刻意去分清概念,現在簡單介紹一下。

  • 範式(NF):按照教材中的定義,範式是“符合某一種級別的關係模式的集合,表示一個關係內部各屬性之間的聯繫的合理化程度”。實際上可以把它粗略地理解爲一張數據表的表結構所符合的某種設計標準的級別。數據庫範式也分爲1NF,2NF,3NF,BCNF,4NF,5NF。

  • 一般在我們設計關係型數據庫的時候,最多考慮到BCNF就夠。符合高一級範式的設計,必定符合低一級範式,例如符合2NF的關係模式,必定符合1NF。

  • 第一範式(1NF)

    • 1NF的定義爲:符合1NF的關係中的每個屬性都不可再分。
      – 實際上,1NF是所有關係型數據庫的最基本要求。在關係型數據庫管理系統(RDBMS)中已經存在的數據表,一定是符合1NF的。
      – 僅僅符合1NF的設計,仍然會存在數據冗餘過大,插入異常,刪除異常,修改異常的問題
  • 第二範式(2NF)

    • 2NF對1NF進行的改進是,2NF在1NF的基礎之上,消除了非主屬性對於碼的部分函數依賴。涉及到四個概念—“函數依賴”、“碼”、“非主屬性”、與“部分函數依賴”。
    • 函數依賴:若在一張表中,在屬性(或屬性組)X的值確定的情況下,必定能確定屬性Y的值,那麼就可以說Y函數依賴於X,寫作 X → Y。
      – 也就是說,在數據表中,不存在任意兩條記錄,它們在X屬性(或屬性組)上的值相同,而在Y屬性上的值不同。這也就是“函數依賴”名字的由來,類似於函數關係 y = f(x),在x的值確定的情況下,y的值一定是確定的。
    • 完全函數依賴:在一張表中,若 X → Y,且對於 X 的任何一個真子集(假如屬性組 X 包含超過一個屬性的話),X ’ → Y 不成立,那麼我們稱 Y 對於 X 完全函數依賴,記作 X F→ Y(F在箭頭的正上方)。
    • 部分函數依賴:假如 Y 函數依賴於 X,但同時 Y 並不完全函數依賴於 X,那麼我們就稱 Y 部分函數依賴於 X,記作 X P→ Y(P在箭頭的正上方)。
    • 傳遞函數依賴:Y 不包含於 X,且 X 不函數依賴於 Y這個前提下,假如 Z 函數依賴於 Y,且 Y 函數依賴於 X ,那麼我們就稱 Z 傳遞函數依賴於 X ,記作 X T→ Z(T在箭頭的正上方)。
    • :設 K 爲某表中的一個屬性或屬性組,若除 K 之外的所有屬性都完全函數依賴於 K(重點是“完全”),那麼我們稱 K 爲候選碼,簡稱爲碼。在實際中通常可以理解爲:假如當 K 確定的情況下,該表除 K 之外的所有屬性的值也就隨之確定,那麼 K 就是碼。一張表中可以有超過一個碼。(實際應用中爲了方便,通常選擇其中的一個碼作爲主碼)。
    • 非主屬性:包含在任何一個碼中的屬性成爲主屬性。
    • 判斷是否是2NF:根據2NF的定義,判斷的依據實際上就是看數據表中是否存在非主屬性對於碼的部分函數依賴。若存在,則數據表最高只符合1NF的要求,若不存在,則符合2NF的要求。判斷的方法是:
      – 第一步:找出數據表中所有的碼。
      – 第二步:根據第一步所得到的碼,找出所有的主屬性。
      – 第三步:數據表中,除去所有的主屬性,剩下的就都是非主屬性了。
      – 第四步:查看是否存在非主屬性對碼的部分函數依賴。
  • 第三範式(3NF)

    • 3NF在2NF的基礎之上,消除了非主屬性對於碼的傳遞函數依賴。也就是說, 如果存在非主屬性對於碼的傳遞函數依賴,則不符合3NF的要求。
    • 符合3NF要求的數據庫設計,基本上解決了數據冗餘過大,插入異常,修改異常,刪除異常的問題。當然,在實際中,往往爲了性能上或者應對擴展的需要,經常 做到2NF或者1NF,但是作爲數據庫設計人員,至少應該知道,3NF的要求是怎樣的。

以後接着完善,借鑑自知乎

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