菜比八寫後端(3) - MySQL key與正規化


Posted by TempuraEngineer on 2023-10-09

目錄


關於資料庫的設計

資料庫的設計有3個原則

1.正確性、完整性

資料是否正確、是否不互相打臉

該有的資訊是否都有

3.不重複性

關聯式資料庫的「關聯式」是指table有相互關聯的特性,不同的資料表間,可以透過特定的欄位將table串起來以得到檢視表(view)

就像查電話本一樣,改成透過join或子查詢得到一個檢視表

所以應該盡量減少重複的資料,不然就無法節省硬碟空間,而喪失關聯式的意義了

因為join是一個頗耗效能的動作,所以也要注意join和巨大table間的取捨


key是什麼

雖然可以使用join和子查詢來把table串起來,但DB並沒有自動設定欄位是否具有唯一性的功能,所以才需要key

key是一種用來對column設定約束(constraint)的屬性,也有index的功能

約束指的是unique、not unll、reference這類的限制

至於為什麼要設置約束是因為透過key可以限制欄位值不重複建立多個table的column間的關聯,因此能減少資料的重複性維持資料完整

例如一個被設為primary key的欄位會擋重複的value

foreign key則會擋不合理的reference(根本沒有id為10的作者)


MySQL支援的key

MySQL的table支援5種key

primary key

  • 每個table只有一個
  • 通常是極少變動的欄位(ex: id)
  • 值不可重複
  • 不允許null
  • table的primary key是另一個table的foreign key
  • 標示為PRI

foreign key

  • 每個table可有多個
  • 連結table與table的橋樑
  • foreign key是另一個table的primary key
  • 標示為MUL

    If Key is MUL, the column is the first column of a nonunique index in which multiple occurrences of a given value are permitted within the column.

unique key

  • 值不可重複
  • 標示為UNI

candidate key

  • 值不可重複,且有機會被選為primary key的欄位
  • 當candidate key中的某個欄位被選為primary key,剩下的就是alternate key

super key

  • 多個欄位聯合起來的具有唯一性的key
  • 組成super key的欄位因為獨立時不具有唯一性,且又允許null,所以並不能作為primary key
    但它們組合起來時有了唯一性就可以成為primary key

    舉例來說,學生的姓名、班級、座號拆開來看時都不是具有唯一性,但是組合起來卻有,這樣就是一組super key


資料庫正規化(database normalization)

只跑一次設計循環就將資料庫的設計完善資料庫幾乎是不可能

資料庫的正規化的話甚至會超過4階段,不過(根據以前的老師說)業界似乎大多只會進行到第3階段

1.1NF(First Normal Form)

把每個欄位的value切成最小單位(atomic)、去除每個欄位的值都和其他筆資料重複的資料

並幫資料表設定primary key,其他所有的非key欄位都會相依於primary key

如果沒通過這個階段會無法關聯化



2.2NF
當primary key由複數個super key組成時,將部分功能相依(partial functional dependency)欄位切分到其他資料表

當primary key欄位的值決定欄位B的值,則B為功能相依欄位

當primary key,由複數個super key組成,且其值決定欄位B的值,但是只有欄位A和B有直接關聯,則B是部分功能相依欄位

如果沒通過這個階段會浪費硬碟空間、在新增、修改、刪除後可能出現錯誤



3.3NF

出現間接相依時,間接相依的欄位切分到其他資料表

在1NF提到所有非key欄位都相依於primary key,所以不能有非key欄位相依於非key欄位的情況

而間接相依指的是非key欄位相依於另一個相依primary key欄位的非key欄位

如果沒通過這個階段會浪費硬碟空間、在新增、修改、刪除後可能出現錯誤


參考資料

Keys in MySQL
Normalization of Database, the Easy Way


#MySQL #Primary Key #Foreign Key #unique key #constranit #database normalize #資料庫正規化







Related Posts

使用 Vue Cli 來建置Vue專案

使用 Vue Cli 來建置Vue專案

[ 筆記 ] JavaScript - 02 函式

[ 筆記 ] JavaScript - 02 函式

使用文字描述與流程圖表達

使用文字描述與流程圖表達


Comments