關聯式資料庫正規化

2021-06-02 15:13:24 字數 2505 閱讀 4192

在建立乙個資料庫的過程中,必須依照一定的準則,這些準則被稱為正規化,從第一到第六共六個正規化,一般資料庫設計只要遵循第一正規化,第二正規化,和第三正規化就足夠了。滿足這些規範的資料庫是簡潔的、結構明晰的,同時,不會發生插入(insert)、刪除(delete)和更新(update)操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。

1.1 第一正規化(1nf)無重複的列

所謂第一正規化(1nf)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義乙個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化(1nf)中表的每一行只包含乙個例項的資訊。簡而言之,第一正規化就是無重複的列。

說明:在任何乙個關聯式資料庫中,第一正規化(1nf)是對關係模式的基本要求,不滿足第一正規化(1nf)的資料庫就不是關聯式資料庫。 

1.2 第二正規化(2nf)屬性完全依賴於主鍵

第二正規化(2nf)是在第一正規化(1nf)的基礎上建立起來的,即滿足第二正規化(2nf)必須先滿足第一正規化(1nf)。第二正規化(2nf)要求資料庫表中的每個例項或行必須可以被惟一地區分。為實現區分通常需要為表加上乙個列,以儲存各個例項的惟一標識。例如員工資訊表中加上了員工編號(emp_id)列,因為每個員工的員工編號是惟一的,因此每個員工可以被惟一區分。這個惟一屬性列被稱為主關鍵字或主鍵、主碼。 

第二正規化(2nf)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成乙個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上乙個列,以儲存各個例項的惟一標識。簡而言之,第二正規化就是屬性完全依賴於主鍵。 

1.3 第三正規化(3nf)屬性不依賴於其它非主屬性

滿足第三正規化(3nf)必須先滿足第二正規化(2nf)。簡而言之,第三正規化(3nf)要求乙個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊。例如,存在乙個部門資訊表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等資訊。那麼在的員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三正規化(3nf)也應該構建它,否則就會有大量的資料冗餘。簡而言之,第三正規化就是屬性不依賴於其它非主屬性。 

下面以乙個學校的學生系統為例分析說明,這幾個正規化的應用。首先第一正規化(1nf):資料庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型、實數、字元型、邏輯型、日期型等。在當前的任何關聯式資料庫管理系統(dbms)中,傻瓜也不可能做出不符合第一正規化的資料庫,因為這些dbms不允許你把資料庫表的一列再分成二列或多列。因此,你想在現有的dbms中設計出不符合第一正規化的資料庫都是不可能的。 

首先我們確定一下要設計的內容包括那些。學號、學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦位址、系辦**等資訊。為了簡單我們暫時只考慮這些字段資訊。我們對於這些資訊,說關心的問題有如下幾個方面。 

2.1 第二正規化(2nf)例項分析

首先我們考慮,把所有這些資訊放到乙個表中(學號,學生姓名、年齡、性別、課程、課程學分、系別、學科成績,系辦位址、系辦**)下面存在如下的依賴關係。 

(學號)→ (姓名, 年齡,性別,系別,系辦位址、系辦**) 

(課程名稱) → (學分) 

(學號,課程)→ (學科成績)

2.1.1 問題分析

因此不滿足第二正規化的要求,會產生如下問題 

資料冗餘: 同一門課程由n個學生選修,"學分"就重複n-1次;同乙個學生選修了m門課程,姓名和年齡就重複了m-1次。 

更新異常: 

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

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

刪除異常 : 假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,課程名稱和學分資訊也被刪除了。很顯然,這也會導致插入異常。

2.1.2 解決方案

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

2.2 第三正規化(3nf)例項分析

接著看上面的學生表student(學號,姓名, 年齡,性別,系別,系辦位址、系辦**),關鍵字為單一關鍵字"學號",因為存在如下決定關係: 

(學號)→ (姓名, 年齡,性別,系別,系辦位址、系辦**) 

但是還存在下面的決定關係 

(學號) → (所在學院)→(學院地點, 學院**) 

即存在非關鍵字段"學院地點"、"學院**"對關鍵字段"學號"的傳遞函式依賴。 

它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況。 (資料的更新,刪除異常這裡就不分析了,可以參照2.1.1進行分析)

根據第三正規化把學生關係表分為如下兩個表就可以滿足第三正規化了: 

學生:(學號, 姓名, 年齡, 性別,系別); 

總結上面的資料庫表就是符合i,ii,iii正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常。 

關聯式資料庫正規化

判斷是第幾正規化 概念 設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。種類 目前關聯式資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 巴斯 科德正規化 bcnf...

關聯式資料庫的正規化

構造資料庫必須遵循一定的規則。在 關聯式資料庫中,這種規則就是 正規化。正規化是符合某一種級別的關係模式的集合。關聯式資料庫中的關係必須滿足一定的要求,即滿足不同的 正規化。目前 關聯式資料庫有六種 正規化 第一 正規化 1nf 第二 正規化 2nf 第三 正規化 3nf 第四 正規化 4nf 第五...

關聯式資料庫的正規化

1 正規化 構造資料庫必須遵循一定的規劃,在關聯式資料庫中這種規則就是正規化 nf即normal form 正規化是符合一種級別的關係模式的集合。關聯式資料庫中的關係必須滿足一定的要求,即滿足不同的正規化。目前關聯式資料庫有6種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 第四...