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