目錄
關於資料庫的設計
資料庫的設計有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欄位
如果沒通過這個階段會浪費硬碟空間、在新增、修改、刪除後可能出現錯誤


![[0.] 前置作業: 開發環境設定](https://static.coderbridge.com/img/jessiehu907/a6a2d776d0734cd9aa90dcbfca8d1f31.png)