天天看點

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表的次數。