資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的、結構明晰的,同時,不會發生插入(insert)、刪除(delete)和更新(update)操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊
如下的資料庫表是符合第一正規化的:
欄位1欄位2
欄位3欄位4
而這樣的資料庫是不符合第一正規化的:
欄位1欄位2
欄位3欄位4
欄位3.1
欄位4.1
第二正規化要求資料庫表中的每個例項或行必須可以被唯一地區分,為實現區分通常需要為表加上乙個列,以儲存每個例項的惟一標識,這個惟一屬性稱為主鍵
例如員工資訊表中加上了員工編號(emp_id)列,因為每個員工的員工編號是惟一的,因此每個員工可以被惟一區分
簡而言之,第二正規化(2nf)就是非主屬性完全依賴於主關鍵字
舉個栗子
假定選課關係表為selectcourse(學號, 姓名, 年齡, 課程名稱, 成績, 學分),關鍵字為組合關鍵字(學號, 課程名稱),因為存在如下決定關係:
(學號, 課程名稱) → (姓名, 年齡, 成績, 學分)
這個資料庫表不滿足第二正規化,因為存在如下決定關係:即存在組合關鍵字中的字段決定非關鍵字的情況
由於不符合2nf,這個選課關係表會存在如下問題:
資料冗餘:
更新異常:
插入異常:
刪除異常:
第三正規化要求乙個資料庫表中不包含已在其他表中已包含的非關鍵字資訊
例如,存在乙個部門資訊表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等資訊。那麼在的員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三正規化(3nf)也應該構建它,否則就會有大量的資料冗餘
舉個栗子
所謂傳遞函式依賴,指的是如果存在"a → b → c"的決定關係,則c傳遞函式依賴於a
因此,滿足第三正規化的資料庫表應該不存在如下依賴關係:
關鍵字段 → 非關鍵字段x → 非關鍵字段y(可以依賴關鍵字段)
假定學生關係表為student(學號, 姓名, 年齡, 所在學院, 學院地點, 學院**),關鍵字為單一關鍵字"學號",因為存在如下決定關係:
(學號) → (姓名, 年齡, 所在學院, 學院地點, 學院**)
這個資料庫是符合2nf的,但是不符合3nf,因為存在如下決定關係:
(學號) → (所在學院) → (學院地點, 學院**)
即存在非關鍵字段"學院地點"、"學院**"對關鍵字段"學號"的傳遞函式依賴
它也會存在資料冗餘、更新異常、插入異常和刪除異常的情況
把學生關係表分為如下兩個表:
學生:(學號, 姓名, 年齡, 所在學院)
學院:(學院, 地點, **)
這樣的資料庫表是符合第三正規化的,消除了資料冗餘、更新異常、插入異常和刪除異常
反正規化化設計
反正規化化允許存在少量的資料冗餘,相當於用空間換時間
簡單的理解資料庫三正規化
正規化 英文名稱是 normal form,它是英國人 e.f.codd 關聯式資料庫的老祖宗 在上個世紀70年代提出關聯式資料庫模型後總結出來的,正規化是關聯式資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法。目前有跡可尋的共有8種正規化,依次是 1nf,2nf,3nf,b...
簡單理解資料庫三大正規化
書上講了好多,歸結起來3句話 1nf 字段不可分 2nf 有主鍵,非主鍵字段依賴主鍵 3nf 非主鍵字段不能相互依賴 解釋 1nf 原子性 字段不可再分,否則就不是關聯式資料庫 2nf 唯一性 乙個表只說明乙個事物 3nf 每列都與主鍵有直接關係,不存在傳遞依賴 不符合第一正規化的例子 關聯式資料庫...
mysql資料庫的正規化 理解資料庫正規化
第一正規化 1nf 第一正規化的核心描述為 資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值。該正規化講的是列的原子性。有兩層意思 一層是說每一列只能存乙個屬性值 如果把2個屬性值存在1列中 第二層說的是在一張表中屬性值不能重複。在現代關係行資料庫中,都是預設滿足第一正規化的,所以你想...