回覆列表
  • 1 # Chaosin

    第一正規化(1NF): 資料庫表中的欄位都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型、實數、字元型、邏輯型、日期型等。

    例如,如下的資料庫表是符合第一正規化的:

    欄位1 欄位2 欄位3 欄位4

    而這樣的資料庫表是不符合第一正規化的:

    欄位1 欄位2 欄位3 欄位4 欄位3.1 欄位3.2

    很顯然,在當前的任何關係資料庫管理系統(DBMS)中,傻瓜也不可能做出不符合第一正規化的資料庫,因為這些DBMS不允許你把資料庫表的一列再分成二列或多列。因此,你想在現有的DBMS中設計出不符合第一正規化的資料庫都是不可能的。

    第二正規化(2NF):資料庫表中不存在非關鍵欄位對任一候選關鍵欄位的部分函式依賴(部分函式依賴指的是存在組合關鍵字中的某些欄位 決定非關鍵欄位的情況),也即 所有非關鍵欄位都完全依賴於任意一組候選關鍵字。

    假定選課關係表為SelectCourse(學號, 姓名, 年齡, 課程名稱, 成績, 學分),關鍵字為組合關鍵字(學號, 課程名稱),因為存在如下決定關係:

    (學號, 課程名稱) → (姓名, 年齡, 成績, 學分)

    這個資料庫表不滿足第二正規化,因為存在如下決定關係:

    (課程名稱) → (學分)

    (學號) → (姓名, 年齡)

    即存在組合關鍵字中的欄位決定非關鍵字的情況。

    由於不符合2NF,這個選課關係表會存在如下問題:

    (1) 資料冗餘:

    同一門課程由n個學生選修,”學分”就重複n-1次;同一個學生選修了m門課程,姓名和年齡就重複了m-1次。

    (2) 更新異常:

    若調整了某門課程的學分,資料表中所有行的”學分”值都要更新,否則會出現同一門課程學分不同的情況。

    (3) 插入異常:

    假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有”學號”關鍵字,課程名稱和學分也無法記錄入資料庫。

    把選課關係表SelectCourse改為如下三個表:

    學生:Student(學號, 姓名, 年齡);

    課程:Course(課程名稱, 學分);

    選課關係:SelectCourse(學號, 課程名稱, 成績)。

    另外,所有單關鍵字的資料庫表都符合第二正規化,因為不可能存在組合關鍵字。

    第三正規化(3NF):在第二正規化的基礎上,資料表中如果不存在非關鍵欄位對任一候選關鍵欄位的傳遞函式依賴則符合第三正規化。所謂傳遞函式依賴,指 的是如果存在”A → B → C”的決定關係,則C傳遞函式依賴於A。因此,滿足第三正規化的資料庫表應該不存在如下依賴關係:

    關鍵欄位 → 非關鍵欄位x → 非關鍵欄位y

    假定學生關係表為Student(學號, 姓名, 年齡, 所在學院, 學院地點, 學院電話),關鍵字為單一關鍵字”學號”,因為存在如下決定關係:

    (學號) → (姓名, 年齡, 所在學院, 學院地點, 學院電話)

    這個資料庫是符合2NF的,但是不符合3NF,因為存在如下決定關係:

    (學號) → (所在學院) → (學院地點, 學院電話)

    即存在非關鍵欄位”學院地點”、”學院電話”對關鍵欄位”學號”的傳遞函式依賴。

    把學生關係表分為如下兩個表:

    學生:(學號, 姓名, 年齡, 所在學院);

    學院:(學院, 地點, 電話)。

    鮑依斯-科得正規化(BCNF):在第三正規化的基礎上,資料庫表中如果不存在任何欄位對任一候選關鍵欄位的傳遞函式依賴則符合第三正規化。

  • 中秋節和大豐收的關聯?
  • 童年的饅頭記載了我童年飽受什麼的故事?