資料庫三正規化解析

2021-08-27 10:40:51 字數 2619 閱讀 3613

在資料庫的建立過程中需要考慮很多規則,乙個良好的資料庫設計不但要節省資料的儲存空間,方便進行資料庫應用程式的開發,而且能夠保證資料的完整性。定義乙個良好的資料庫需要這麼多的規則,那我們設計時豈不更讓人頭疼。所以為了能夠建立乙個好的資料庫在開發時就必須保證資料庫的規範化——三大正規化。

為了建立冗餘較小,結構合理的資料庫,在設計時必須遵循一定的規則。在關聯式資料庫中這些規則簡稱為資料庫的正規化。dr e.f.codd 最初定義了規範化的是三個級別,這些正規化是:

第一正規化(1st nf)

第二正規化(2nd nf)

第三正規化(3rd nf)

三正規化間是層層遞進的關係,高層的正規化要在符合底層正規化的基礎上設計。在進行資料庫設計時應該根據三層正規化層層遞進,乙個好的資料庫一定遵守三正規化,但由三正規化設計出的資料庫不一定是最好的,但正規化是具有最小冗餘的表結構。

最基本的正規化,確保每列都是不可再分的最小單元。在設計時比較簡單。

第一正規化的設計需要根據系統的設計需求來定。如:在某些資料庫系統中需要用到「時間」這個屬性,本來直接將「時間」這個屬性設計成乙個資料庫表的字段就行,但是如果系統經常會訪問「時間」屬性中的「年」部分,那麼就要將「時間」這個屬性重新拆分為年、月、日、時等多個部分進行儲存,這樣在對位址中某一部分操作的時候將非常。

學號 課程名稱

姓名年齡

成績學分1數學

韓某23774

2英語張某22703

首先要滿足第一正規化。資料庫表中不存在非關鍵字段對任意候選關鍵字段的部分依賴(主要針對聯合主鍵而言),需要確保資料庫表中的每一列都和主鍵相關。

如:假定下表為選課關係表,其中學號和課程名稱為組合關鍵字。

上面的表雖然看起來很整齊,但是卻不滿足第二正規化,因為存在如下的部分依賴關係:

(課程名稱)-->(學分)

(學號)-->(姓名,年齡)

即存在非關鍵字段對其中某一關鍵字段的部分依賴關係。

由於不符合2nf,這個選課關係表在使用時會導致資料冗餘、更新異常等情況。

在設計時我們應盡量避免使用組合關鍵字,因為,所有但關鍵字的資料庫表都符合第二正規化,因為不可能存在組合關鍵字。

首先要符合第二正規化,資料表中不存在非關鍵字段對任意候選關鍵字段的傳遞函式依賴。即不存在"a → b → c"的決定關係。每一列資料都和主鍵直接相關,而不能間接相關。

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

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

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

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

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

這時應把學生關係表分為如下兩表:

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

學院:(學院, 地點, **)。

在第三正規化的基礎上,資料庫表中如果不存在任何欄位對任一候選關鍵字段的傳遞函式依賴則符合bc正規化。它較多考慮的是在組合主鍵中,兩個主鍵之間的關係。因為經過第三正規化設計後,已經基本上沒有了非主屬性對候選關鍵字的傳遞依賴。但第三正規化並沒有考慮候選關鍵字之間的關係。

假設倉庫管理關係表為(倉庫id, 儲存物品id, 管理員id, 數量),且有乙個管理員只在乙個倉庫工作;乙個倉庫可以儲存多種物品。這個資料庫表中存在如下決定關係:

(倉庫id, 儲存物品id) →(管理員id, 數量)

(管理員id, 儲存物品id) → (倉庫id, 數量)

所以,(倉庫id, 儲存物品id)和(管理員id, 儲存物品id)都是倉庫管理關係表的候選關鍵字,表中的唯一非關鍵字段為數量,它是符合第三正規化的。但是,由於存在如下決定關係:

(倉庫id) → (管理員id)

(管理員id) → (倉庫id)

即存在關鍵字段決定關鍵字段的情況,所以其不符合bcnf正規化。

它會出現如下異常情況:

(1) 刪除異常:

當倉庫被清空後,所有"儲存物品id"和"數量"資訊被刪除的同時,"倉庫id"和"管理員id"資訊也被刪除了。

(2) 插入異常:

當倉庫沒有儲存任何物品時,無法給倉庫分配管理員。

(3) 更新異常:

如果倉庫換了管理員,則表中所有行的管理員id都要修改。

把倉庫管理關係表分解為二個關係表:

倉庫管理:storehousemanage(倉庫id, 管理員id);

倉庫:storehouse(倉庫id, 儲存物品id, 數量)。

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

三正規化是最初的資料庫設計規則,它是為了避免資料的冗餘,但是越較多應用正規化那麼分出的表就越多,這無形中就又會造成資料的冗餘,所以正規化只是規定了乙個標準,但並不是最準確的。在使用正規化時要看情況,有些冗餘也是需要的。

其實簡單的說三正規化是資料庫設計中最基礎的規則,第一正規化不需要我們考慮太多,因為關聯式資料庫已經幫我們控制好了;第二正規化,就是要有主鍵,其他屬性都要依賴於這個主鍵,再設計時盡量避免組合的主鍵,組合主鍵常常違背第二正規化;第三正規化,就是不能有冗餘,一張表,只能有主鍵,依賴主鍵的屬性,外來鍵,不能包含外來鍵表的非主鍵屬性。

資料庫 正規化解析

1.第一正規化 1nf 第一正規化是指資料庫表中的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。下面看例子 學生資訊表,每乙個屬性都只有乙個值,比如屬性 每個 字段只有乙個值,每一條記錄裡,每乙個屬性只有乙個值而且不會有兩個。每乙個欄位也不...

資料庫正規化 三正規化

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

資料庫三正規化經典例項解析

資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的 結構明晰的,同時,不會發生插入 insert 刪除 delete 和更新 update 操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。設計正規化是不是很難懂呢...