資料庫正規化

2021-05-28 11:50:42 字數 3375 閱讀 9971

最近的課程是講資料庫設計的三大正規化,這裡也簡單說一下三大正規化的淺顯理解。

設計正規化(正規化,資料庫設計正規化,資料庫的設計正規化)是符合某一種級別的關係模式的集合。構造資料庫必須遵循一定的規則。在關聯式資料庫中,這種規則就是正規化。關聯式資料庫中的關係必須滿足一定的要求,即滿足不同的正規化。目前關聯式資料庫有六種正規化:第一正規化(1nf)、第二正規化(2nf)、第三正規化(3nf)、第四正規化(4nf)、第五正規化(5nf)和第六正規化(6nf)。滿足最低要求的正規化是第一正規化(1nf)。在第一正規化的基礎上進一步滿足更多要求的稱為第二正規化(2nf),其餘正規化以次類推。一般說來,資料庫只需滿足第三正規化(3nf)就行了。下面我們舉例介紹第一正規化(1nf)、第二正規化(2nf)和第三正規化(3nf)。

在建立乙個資料庫的過程中,範化是將其轉化為一些表的過程,這種方法可以使從資料庫得到的結果更加明確。這樣可能使資料庫產生重複資料,從而導致建立多餘的表。範化是在識別資料庫中的資料元素、關係,以及定義所需的表和各表中的專案這些初始工作之後的乙個細化的過程。

關聯式資料庫的幾種設計正規化介紹

1 第一正規化(1nf)

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

所謂第一正規化(1nf)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義乙個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化(1nf)中表的每一行只包含乙個例項的資訊。例如有乙個人員資訊表,裡面有乙個位址字段,如果欄位的值是「中國廣州」,那麼我們認為不滿足第一正規化,因為裡面包含了兩個資訊:國家和城市。所以需要將他們拆分為兩個字段:國家   所在城市。這就符合了第一正規化了。

2 第二正規化(2nf)

第二正規化(2nf)是在第一正規化(1nf)的基礎上建立起來的,即滿足第二正規化(2nf)必須先滿足第一正規化(1nf)。第二正規化(2nf)要求資料庫表中的每個例項或行必須可以被惟一地區分。為實現區分通常需要為表加上乙個列,以儲存各個例項的惟一標識。

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

3 第三正規化(3nf)

滿足第三正規化(3nf)必須先滿足第二正規化(2nf)。簡而言之,第三正規化(3nf)要求乙個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊。也就是說在第二正規化的基礎上,資料表中如果不存在非關鍵字段對任一候選關鍵字段的傳遞依賴則符合第三正規化。

資料庫設計三大正規化應用例項剖析

資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的、結構明晰的,同時,不會發生插入(insert)、刪除(delete)和更新(update)操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。 下面就一些簡單的例項來對這些正規化做乙個說明吧。

正規化說明

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

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

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

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

欄位3.1 欄位3.2

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

假定有乙個描述客房的表room(房間號, 房間狀態, 房間型別, 床位數, 入住人數, **),關鍵字為組合關鍵字(房間號),因為存在如下決定關係:

(房間型別→ (床位數, 入住人數, **) 

這個資料庫表不滿足第二正規化,因為在這裡面描述了三件事:客房資訊,房間狀態,房間型別。

由於不符合2nf,這個客房表會存在如下問題:

(1) 資料冗餘:

多間客房都是同一型別,床位數, 入住人數, **就重複n-1次;

(2) 更新異常:

若需要更新床位數或者入住人數或者**,其它的值者一起更新,否則會出現同一客房型別**不同的情況。

(3) 插入異常:

假設要需要增加一種客房型別,但是還沒有決定房間號那就造成房間號為null,不能增加。造成插入異常。

(4) 刪除異常:

假設某一間房需要另做他用,有可能刪除了這一條資料的同時也刪除了房間型別,造成型別的刪除異常。

把room改為如下三個表:

客房:room(房間號, 房間狀態id, 房間型別id, 床位數, 入住人數, **);

房間狀態:roomstate(狀態id, 狀態名稱);

房間型別:roomtype(型別id,型別名稱)。

這樣的資料庫表是符合第二正規化的, 消除了資料冗餘、更新異常、插入異常和刪除異常。

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

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

關鍵字段 → 非關鍵字段x → 非關鍵字段y ,我們剛剛看到的那個表已經符合第二正規化了,但是他是否也符合第三正規化呢?我們可以看到:

客房:room(房間號, 房間狀態id, 房間型別id, 床位數, 入住人數, **);

這裡面存在了這樣的關係:

(客房號)→(客房型別)

(客房型別)→(床位數,**),這就是傳遞依賴了。它不符合第三正規化。   

它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況 

所有現最終我們把客房表為如下三個表:

客房:room(房間號, 房間狀態id, 房間型別id, 入住人數);

房間狀態:roomstate(狀態id, 狀態名稱);

房間型別:roomtype(型別id,型別名稱,床位數, , **)。 

這樣的資料庫表是符合第三正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常。

滿足正規化要求的資料庫設計是結構清晰的,同時可避免資料冗餘和操作異常。這並意味著不符合正規化要求的設計一定是錯誤的,在資料庫表中存在1:1或1:n關係這種較特殊的情況下,合併導致的不符合正規化要求反而是合理的。

在我們設計資料庫的時候,一定要時刻考慮正規化的要求。

資料庫 資料庫正規化

關聯式資料庫的設計規範。不同的規範要求被稱為不同的正規化,越高的正規化資料庫冗餘越小。減少資料庫中資料冗餘的過程 1 第一正規化 1nf 在關係模式r中,當且僅當所有屬性只包含原子值,即每個分量都是不可再分的資料項,則稱r滿足1nf。例如表所示的教師職稱情況關係就不滿足1nf。原因在於,該關係模式中...

資料庫正規化 三正規化

所謂第一正規化 1nf 是指在關係模型中,對域新增的乙個規範要求,所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一正規化 1nf 表中的每個域值只能是實體的乙個屬性或乙個屬性的...

資料庫正規化

注 表在定義中被稱為關係,記作r 欄位在定義中被稱作屬性 模式 資料庫中有三種模式,外模式,內模式,模式 粗體是關鍵字的意思 斜體為外來鍵 以前寫下來的,但是用了多年的帳號已經忘了,唯有把文章轉到這裡來了 真暈哦 http blog.csdn.net fantasylu archive 2004 0...