1nf:字段具有原子性,不可再分。所有關係型資料庫系統都滿足第一正規化)
2nf:對於具有組合關鍵字的表.不存在組合關鍵字中的任意字段決定其它非關鍵字欄位的情況。
3nf:在2n的基礎上,每乙個非主屬性既不部分依賴於碼也不傳遞依賴於碼.
簡單描述:
第三正規化的要求如下:
1,每一列只有乙個值
2,每一行都能區分。
3,每乙個表都不包含其他表已經包含的非主關鍵字資訊。
實質上,設計正規化用很形象、很簡潔的話語就能說清楚。這裡將對正規化進行通俗地說明,以乙個簡單論壇的資料庫為例講解怎麼樣將這些正規化應用於實際工程.
正規化說明
第一正規化(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) 插入異常:
假設要開設一門新的課程,暫時還沒有人選修。這樣,由於還沒有"學號"關鍵字,
課程名稱和學分也無法記錄入資料庫。
(4) 刪除異常:
假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。
但是,與此同時,課程名稱和學分資訊也被刪除了。很顯然,這也會導致插入異常。
把選課關係表selectcourse改為如下三個表:
1).學生:student(學號, 姓名, 年齡);
2).課程:course(課程名稱, 學分);
3).選課關係:selectcourse(學號, 課程名稱, 成績)。
這樣的資料庫表是符合第二正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常。 另外,所有單關鍵字的資料庫表都符合第二正規化,因為不可能存在組合關鍵字。
第三正規化(3nf):在第二正規化的基礎上,資料表中如果不存在非關鍵字段對任一候選關鍵字段的傳遞函式依賴則符合第三正規化。
所謂傳遞函式依賴,指的是如果存在"a → b → c"的決定關係,則c傳遞函式依賴於a。因此,滿足第三正規化的資料庫表應該不存在如下依賴關係:
關鍵字段 → 非關鍵字段x → 非關鍵字段y
假定學生關係表為student(學號, 姓名, 年齡, 所在學院, 學院地點, 學院**),
關鍵字為單一關鍵字"學號",因為存在如下決定關係:
(學號) → (姓名, 年齡, 所在學院, 學院地點, 學院**)
這個資料庫是符合2nf的,但是不符合3nf,因為存在如下決定關係:
(學號) → (所在學院) → (學院地點, 學院**)
即存在非關鍵字段"學院地點"、"學院**"對關鍵字段"學號"的傳遞函式依賴。
它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況,讀者可自行分析得知。
把學生關係表分為如下兩個表:
學生:(學號, 姓名, 年齡, 所在學院);
學院:(學院, 地點, **)。
這樣的資料庫表是符合第三正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常。
鮑依斯-科得正規化(bcnf):在第三正規化的基礎上,資料庫表中如果不存在任何欄位對任一候選關鍵字段的傳遞函式依賴則符合第三正規化。
假設倉庫管理關係表為storehousemanage(倉庫id, 儲存物品id, 管理員id, 數量),且有乙個管理員只在乙個倉庫工作;乙個倉庫可以儲存多種物品。這個資料庫表中存在如下決定關係:
(倉庫id, 儲存物品id) →(管理員id, 數量)
(管理員id, 儲存物品id) → (倉庫id, 數量)
所以,(倉庫id, 儲存物品id)和(管理員id, 儲存物品id)都是storehousemanage的候選關鍵字,表中的唯一非關鍵字段為數量,它是符合第三正規化的。但是,由於存在如下決定關係:
(倉庫id) → (管理員id)
(管理員id) → (倉庫id)
即存在關鍵字段決定關鍵字段的情況,所以其不符合bcnf正規化。它會出現如下異常情況:
(1) 刪除異常:
當倉庫被清空後,所有"儲存物品id"和"數量"資訊被刪除的同時,"倉庫id"和"管理員id"資訊也被刪除了。
(2) 插入異常:
當倉庫沒有儲存任何物品時,無法給倉庫分配管理員。
(3) 更新異常:
如果倉庫換了管理員,則表中所有行的管理員id都要修改。
把倉庫管理關係表分解為二個關係表:
倉庫管理:storehousemanage(倉庫id, 管理員id);
倉庫:storehouse(倉庫id, 儲存物品id, 數量)。
這樣的資料庫表是符合bcnf正規化的,消除了刪除異常、插入異常和更新異常
整體理解就是:
第一正規化
每個欄位都不可再分。
第二正規化
所有欄位都完全依賴而不是部分依賴於聯合主鍵。
e.g.學號 課程號 成績 學分
聯合主鍵為學號+課程號
成績這個字段必須由學號和課程號這兩個字段共同決定,表示成績完全依賴於聯合主鍵 學號+課程號
而學分這個字段,卻只跟課程號這個字段決定,表示學分部分依賴於聯合主鍵,只依賴於課程號。
第三正規化
不存在非主鍵欄位對主鍵欄位的傳遞依賴。
學號 姓名 所在系 系位址
主鍵為學號, 學號決定了姓名,所在系, 學號不直接決定系位址。表示存在非主鍵欄位對主鍵欄位的傳遞依賴, 不滿足第三正規化。
有關於資料庫設計的幾點建議
讀了劉仲英的 管理資訊系統 一書,結合最近工作中涉及到資料庫的情況,重新溫習一下資料庫設計的三大正規化 第一正規化 如果乙個關係模式r的每個具體關係r的每個屬性值都是不可分的最小資料單位,則稱r為第一正規化,簡稱1nf,r為1nf關係。比如 資料庫表中不允許,也不能實現如下表,這一點很好理解 客戶 ...
資料庫設計的幾點建議
資料庫設計的幾點建議 1.表必須擁有識別符號。這是基本規則,每個表應該擁有唯一的行識別符號,以及可讓表的記錄和記錄間有所區別的列或列的集合。每個表都應該擁有乙個識別符號列,而且每條記錄的識別符號的值都是唯一的,此行識別符號稱為主鍵。2.表應該只儲存單一例項型別的資料。若在表中儲存太多資訊,可能導致無...
資料庫實體間關係筆記
判斷實體間關係只需要問自己兩個問題 1.實體a包含實體b嗎?2.實體b包含實體a嗎?當實在是不能分辨兩個實體間的關係是 一對多 還是 多對多 我們不妨用假設法。今天設計資料庫標間關係的是偶蒙圈了。在這裡調整一下思路。實體a實體b 1 1 1n mn 1 1 獨生子家庭 乙個兒子只有有乙個父親,乙個父...