1. 程式人生 > >mysql 三正規化及逆正規化

mysql 三正規化及逆正規化

資料庫設計當中三正規化是經常遇到的
######1.第一正規化

第一正規化(1NF)所謂第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化(1NF)中表的每一行只包含一個例項的資訊。

在任何一個關係資料庫中,第一正規化(1NF)是對關係模式的基本要求,不滿足第一正規化(1NF)的資料庫就不是關係資料庫。
確保資料表中每列(欄位)的原子性。列不可分。

如果資料表中每個欄位都是不可再分的最小資料單元,則滿足第一正規化。

例如:user使用者表,包含欄位id,username,password

######2. 第二正規化(依賴性)
第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。第二正規化(2NF)要求資料庫表中的每個例項或行必須可以被惟一的區分。為實現區分通常需要為表加上一個列,以儲存各個例項的惟一標識。要求實體的屬性完全依賴於主關鍵字。不能部分依賴。即:一張表存在組合主鍵時,其他非主鍵欄位不能部分依賴。
在第一正規化的基礎上更進一步,目標是確保表中的每列都和主鍵相關。

如果一個關係滿足第一正規化,並且除了主鍵之外的其他列,都依賴於該主鍵,則滿足第二正規化。

例如:一個使用者只有一種角色,而一個角色對應多個使用者。則可以按如下方式建立資料表關係,使其滿足第二正規化。

user使用者表,欄位id,username,password,role_id

role角色表,欄位id,name

使用者表通過角色id(role_id)來關聯角色表

######3. 第三正規化(唯一性)

滿足第三正規化(3NF)必須先滿足第二正規化(2NF)。簡而言之,第三正規化(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字資訊。例如,存在一個部門資訊表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等資訊。那麼在員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三正規化(3NF)也應該構建它,否則就會有大量的資料冗餘。簡而言之,第三正規化就是屬性不依賴於其它非主屬性。
表中的非主屬性必須依賴於主屬性才能被獲取、減少依賴,①資料冗餘問題不能有重複資訊;②如有大量的重複資訊,應該另建表。

######4. 逆正規化

逆正規化化指的是通過增加冗餘或重複的資料來提高資料庫的讀效能。

例如:在上例中的user_role使用者-角色中間表增加欄位role_name。

逆正規化化可以減少關聯查詢時,join表的次數。