數(shù)據(jù)庫(kù)的范式
1,構(gòu)造數(shù)據(jù)庫(kù)必須遵循一定的規(guī)則,這種規(guī)則就是范式.
2,目前關(guān)系數(shù)據(jù)庫(kù)有6種范式,一般情況下,只滿足第三范式即可.
第一范式:原子性
1,第一范式是數(shù)據(jù)庫(kù)的基本要求,不滿足這一點(diǎn)就不是關(guān)系數(shù)據(jù)庫(kù).
2,數(shù)據(jù)表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)值,也不能存在重復(fù)的屬性.
第二范式:唯一性
1,數(shù)據(jù)表中的每條記錄必須是唯一的.為了實(shí)現(xiàn)區(qū)分,通常要為表加上一個(gè)列用來存儲(chǔ)唯一標(biāo)識(shí),這個(gè)唯一屬性列被稱作主鍵列
第三范式:關(guān)聯(lián)性 (滿足第三范式意味著同時(shí)滿足了第一和第二范式)
1,每列都與主鍵有直接關(guān)系,不存在傳遞依賴.
2,依照第三范式,數(shù)據(jù)可以拆分保存到不同的數(shù)據(jù)表,彼此保持關(guān)聯(lián).
3,第三范式很重要.
字段約束
不推薦使用外鍵約束.
主鍵約束
1,主鍵約束要求字段的值再全表必須唯一,而且不能為NULL值
2,建議主鍵一定要使用數(shù)字類型,因?yàn)閿?shù)字的檢索速度會(huì)非常快.
3,如果主鍵是數(shù)字類型,還可以設(shè)置自動(dòng)增長(zhǎng)
CREATE TABLE t_teacher(
id INT PRIMARY KEY AUTO_INCREMENT,
......
);
非空約束
1,非空約束要求字段的值不能為NULL值
2,NULL值是沒有值,而不是""空字符串
CREATE TABLE t_teacher(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(200) NOT NULL,
married BOOLEAN NOT NULL DEFAULT FALSE
);
唯一約束
1,唯一約束要求字段值如果不為NULL,那么再全表必須唯一
CREATE TABLE t_teacher(
id INT PRIMARY KEY AUTO_INCREMENT,
......
tel CHAR(11) NOT NULL UNIQUE
);
//強(qiáng)烈建議創(chuàng)建表時(shí)給表名前加 t_ 和其他虛擬表區(qū)分
外鍵約束
1,外鍵約束用來保證關(guān)聯(lián)數(shù)據(jù)的邏輯關(guān)系
如果刪掉部門表中的10部門,員工表中的陳浩就不符合邏輯了.
為了確保數(shù)據(jù)表中的關(guān)聯(lián)數(shù)據(jù)的邏輯關(guān)系,引入外鍵約束.
員工表時(shí)依賴部門表,所以
外鍵約束的定義是寫在子表上的
CREATE TABLE t_dept(
deptno INT UNSIGNED PRIMARY KEY,
dname VARCHAR(20) NOT NULL UNIQUE,
tel CHAR(4) UNIQUE
);
CREATE TABLE t_emp(
empno INT UNSIGNED PRIMARY KEY,
ename VARCHAR(20) NOT NULL,
sex ENUM("男","女") NOT NULL,
deptno INT UNSIGNED,
hiredate DATE NOT NULL,
FOREIGN KEY (deptno) REFERENCES t_dept(deptno)
);
外鍵約束的閉環(huán)問題
1,如果形成外鍵閉環(huán),我們將無法刪除任何一張表的記錄