MySQL 資料庫正規化

2021-10-17 03:53:33 字數 3628 閱讀 5945

目錄

1、資料庫正規化簡介

2、應用正規化優點

3、常見正規化簡述

1)第一正規化(1nf)

2)第二正規化(2nf)

3)第三正規化(3nf)

4)bc正規化(bcnf)

5)第四正規化(4nf)

4、存在的問題

5、各正規化關係圖

設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。

但是資料庫正規化絕對不是越高越好,正規化越高,意味著表越多,多表聯合查詢的機率就越大,sql查詢的效率就變低。

一般開發中只遵從第三正規化就好,是具體情況而定。

(1)減少資料冗餘(這是最主要的好處,其他好處都是由此而附帶的)

(2)消除異常(插入異常,更新異常,刪除異常)

(3)讓資料組織的更加和諧

常見的正規化有1nf、2nf、3nf、bcnf以及4nf。下面對這幾種常見的正規化進行簡要分析。

特點:每一列保持原子特性,列都是基本資料項,不能夠再進行分割,否則設計成一對多的實體關係。

例項:

例:陝西省西安市未央區學府中路西安工業大學

位址資訊還包含省市區可以拆分

學生表(學號、使用者名稱、性別、年齡、位址id)

位址表(位址id、省、市、區、街道、學校)

注意:不符合第一正規化不能稱作關係型資料庫。

特點:非主屬性完全依賴於主鍵(主要針對聯合主鍵-->消除部分依賴)

符合第一正規化的基礎上,非主屬性完全依賴於主關鍵字,如果不是完全依賴主鍵,應該拆分成新的實體,設計成一對多的實體關係。

示例

主鍵(學生id、課程id)

學生姓名-》學生id  -》部分依賴

學生性別-》學生id  -》部分依賴

課程成績-》(學生id、課程id)-》完全依賴

學生表(學生id、學生姓名、學生性別)

主鍵:學生id

課程成績表(課程id、學生id、成績)

主鍵:(課程id、學生id)

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

(1) 資料冗餘:

同一名學生選了n門課程,姓名和性別就重複了n-1次。

(2) 更新異常:

若調整了某名同學的姓名,這位同學如果選了好多門課,資料表中所有行的姓名都要更新,否則會出現同一id姓名不同的情況。

(3) 插入異常:

假設有一名新學生還沒有選課。這樣,由於還沒有「課程id」關鍵字,學生的個人資訊也無法記錄入資料庫。

(4) 刪除異常:假設有一名因學生考試作弊課程成績被刪除,則該學生個人資訊也被刪除。

特點:屬性不依賴於其它非主屬性(消除依賴傳遞)

基於第二正規化的基礎非主屬性只依賴於主屬性。

要求乙個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊。

示例:

拆分改造前由於不符合3nf,這個學生選課表會存在如下問題:

(1)資料冗餘

有n名學生,則學院id和學院**就被重複了n次。

(2)更新異常

若調整了學院**,資料表中所有行的學院**值都要更新,否則會出現同一學院id學院**不同的情況。有上萬個學生就要改上萬次。

(3)插入異常

假設有乙個學院沒有**,這樣,由於還沒有「學院**」關鍵字,學生的個人資訊也無法記錄入資料庫。

(4)刪除異常

學生畢業要刪除學生資訊,刪除後學院的**也沒有了。

注意:一般關係型資料庫滿足第三正規化就可以了!

特點:每個表中只有乙個候選鍵

基於第三正規化的基礎上,每個表中只有乙個候選鍵。(不重複的屬性稱為候選鍵)

在第三正規化的基礎上,資料庫表中如果不存在任何欄位對任一候選關鍵字段的傳遞函式依賴則符合第三正規化。

示例:

主鍵:(倉庫id,管理員id, 儲存物品id)

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

但是我們發現:

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

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

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

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

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

即存在關鍵字段決定關鍵字段的情況,所以其不符合bcnf正規化。它會出現如下異常情況:

(1)資料冗餘

由於倉庫id和管理員id是對應的,所以可以只存乙個倉庫id就可以找到物品數量,沒有必要再存管理員id。要乙個就行了。

(2)刪除異常

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

(3)插入異常

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

(4)更新異常

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

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

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

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

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

特點:消除表中的多值依賴

基於bc正規化的基礎上,​消除表中的多值依賴,也就是說可以減少維護資料一致性的工作。

示例:

課程id

教材id

課程名稱11

數學22語文

教材id

教材名稱

1人教版數學,蘇教版數學

2人教版語文,蘇教版語文

這樣兩本乙個教材id就對應兩個出版社教材,只有教材id就說不清楚了。修改辦法如下

課程id

教材id

課程名稱

1102數學2

201語文

教材id

教材名稱

101人教版數學

蘇教版數學

201人教版語文

202蘇教版語文

從上面對於資料庫正規化進行分解的過程中不難看出,應用的正規化越高,表越多。表多會帶來很多問題:

(1)查詢時需要連線多個表,增加了sql查詢的複雜度

(2)查詢時需要連線多個表,降低了資料庫查詢效能

因此,並不是應用的正規化越高越好,要看實際情況而定。第三正規化已經很大程度上減少了資料冗餘,並且基本預防了資料插入異常,更新異常,和刪除異常了。

mysql資料庫正規化

減小資料的冗餘性 提高效率 屬性的原子性,每列不可再分解 如 出生年月日 年 月 日 便於後續修改 記錄的惟一性,說明乙個事物 屬性必須完全依賴於主鍵,不能存在部分依賴 如 說明了三個事物 學生資訊 系資訊 課程資訊 存在的部分依賴 姓名對學號存在部分依賴 系名對學號存在部分依賴 系主任對學號存在部...

mysql三正規化 MySQL資料庫三正規化

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

mysql資料庫的正規化 理解資料庫正規化

第一正規化 1nf 第一正規化的核心描述為 資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值。該正規化講的是列的原子性。有兩層意思 一層是說每一列只能存乙個屬性值 如果把2個屬性值存在1列中 第二層說的是在一張表中屬性值不能重複。在現代關係行資料庫中,都是預設滿足第一正規化的,所以你想...