数据库的范式
(1) 构造数据库必须遵循一定的规则,这种规则就是范式。
(2) 目前关系数据库有6种范式,一般情况下,只满足第三范式即可。
第一范式:原子性
(1) 第一范式是数据库的基本要求,不满足这一点就不是关系数据库。
(2) 数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,也不能存在重复的属性。
案例:
学号 | 姓名 | 班级 |
---|---|---|
1000 | 刘娜 | 高三年级1班 |
学号 | 姓名 | 年级 | 班级 |
---|---|---|---|
1000 | 刘娜 | 高三 | 1班 |
第二范式:唯一性
数据表中的每条记录必须是唯一的。为了实现区分,通常要为表加上一个列用来存储唯一标识,这个唯一属性列被称作主键列。
案例:
学号 | 考试成绩 | 日期 |
---|---|---|
230 | 58 | 2018-07-15 |
230 | 58 | 2018-07-15 |
流水号 | 学号 | 考试成绩 | 日期 |
---|---|---|---|
201807152687 | 230 | 58 | 2018-07-15 |
201807152694 | 230 | 58 | 2018-07-15 |
第三范式:关联性
(1) 每列都与主键有直接关系,不存在传递依赖。
(2) 当满足第三范式,自动满足第一、第二范式。
(3) 依照第三范式,数据可以拆分保存到不同的数据表,彼此保持关联。
案例:
爸爸 | 儿子 | 女儿 | 女儿的玩具 | 女儿的衣服 |
---|---|---|---|---|
陈华 | 陈浩 | 陈婷婷 | 海绵宝宝 | 校服 |
爸爸 | 儿子 | 女儿 |
---|---|---|
陈华 | 陈浩 | 陈婷婷 |
女儿 | 女儿的玩具 | 女儿的衣服 |
---|---|---|
陈婷婷 | 海绵宝宝 | 校服 |
字段约束
MySQL中的字段约束共有四种:
约束名称 | 关键字 | 描述 |
---|---|---|
主键约束 | PRIMARY KEY | 字段值唯一,且不能为NULL |
非空约束 | NOT NULL | 字段值不能为NULL |
唯一约束 | UNIQUE | 字段值唯一,且可以为NULL |
外键约束 | FOREIGN KEY | 保持关联数据的逻辑性 |
主键约束
(1) 主键约束要求字段的值在全表必须唯一,而且不能为NULL值。
(2) 建议主键一定要使用数字类型,因为数字的检索速度会非常快。
(3) 如果主键是数字类型,还可以设置自动增长
CREATE TABLE t_teacher(
id INT PRIMARY KEY AUTO_INCREMENT,
......
);
注: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) DEFAULT FALSE
表示BOOLEAN类型的married字段默认为负。
(2) MySQL里本没有BOOLEAN这个类型,它会以TINYTINT类型来保存,如果为TRUE,那么为1;如果为FALSE,那么为0。
唯一约束
唯一约束要求字段值如果不为NULL,那么在全表必须唯一。
CREATE TABLE t_teacher(
......
tel CHAR(11) NOT NULL UNIQUE
);
案例
注:一般情况下,表名前面要加下划线来表示真实表或者虚拟表。例如,t_teacher
为真实表;v_teacher
为虚拟表。
CREATE TABLE t_teacher(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
tel CHAR(11) NOT NULL UNIQUE,
married BOOLEAN NOT NULL DEFAULT FALSE
);
外键约束
外键约束用来保证关联数据的逻辑关系。
deptno | dname | tel |
---|---|---|
10 | 财务部 | 1001 |
20 | 技术部 | 1002 |
30 | 销售部 | 1003 |
empno | name | sex | deptno | hiredate |
---|---|---|---|---|
1 | 陈浩 | 男 | 10 | 2018-05-10 |
2 | 李婷婷 | 女 | 30 | 2018-03-22 |
外键约束的定义时写在子表上的
案例:
CREATE TABLE t_dept(
deptno INT UNSIGNED PRIMARY KEY,
dname VARCHAR(20) NOT NULL,
tel CHAR(4) UNIQUE
);
CREATE TABLE t_emp(
empno INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20) NOT NULL,
sex ENUM("男","女") NOT NULL,
deptno INT UNSIGNED,
hiredate DATE NOT NULL,
tel CHAR(11) NOT NULL UNIQUE,
FOREIGN KEY (deptno) REFERENCES t_dept(deptno)
);
注:ENUM为枚举的类型,意思是设置字段值时只能在这里进行挑选。
外键约束的闭环问题
如果行程外键闭环,我们将无法删除任何一张表的记录。