数据库的范式
◆ 构造数据库必须遵循一定得规则,这种规则就是范式。
◆ 目前关系数据库有6中范式,一般情况下,只满足第三范式即可。
第一范式:原子性
◆ 第一范式是数据库的基本要求,不满足这一点就不是关系数据库。
◆ 数据表得每一列都是不可分割得基本数据项,同一列中不能有多个值,也不能存在重复的属性。
不符合第一范式:
学号 | 姓名 | 班级 |
---|---|---|
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 |
第三范式:关联性
◆ 每列都与主键有直接关系,不存在传递依赖
违反第三范式:
爸爸 | 儿子 | 女儿 | 女儿的玩具 | 女儿的衣服 |
---|---|---|---|---|
陈华 | 陈浩 | 陈婷婷 | 海绵宝宝 | 校服 |
符合第三范式:
爸爸 | 儿子 | 女儿 |
---|---|---|
陈华 | 陈浩 | 陈婷婷 |
女儿 | 女儿的玩具 | 女儿的衣服 |
---|---|---|
陈婷婷 | 海绵宝宝 | 校服 |
◆ 依照第三范式,数据可以拆分保存到不同的数据表,彼此保持关联
编号 | 部门 | 电话 |
---|---|---|
10 | 财务部 | 1001 |
20 | 技术部 | 1002 |
30 | 销售部 | 1003 |
编号 | 姓名 | 性别 | 部门 | 入职日期 |
---|---|---|---|---|
1 | 陈浩 | 男 | 10 | 2018-05-10 |
2 | 李婷婷 | 女 | 30 | 2018-03-22 |
字段约束
◆ MySQL中的字段约束共有四种:
约束名称 | 关键字 | 描述 |
---|---|---|
主键约束 | PRIMARY KEY | 字段值唯一,且不能为NULL |
非空约束 | NOT NULL | 字段值不能为NULL |
唯一约束 | UNIQUE | 字段值唯一,且可以为NULL |
外键约束 | FOREIGN KEY | 保持关联数据的逻辑性 |
主键约束
◆ 主键约束要求字段的值在全表必须唯一,而且不能为NULL值
◆ 建议主键一定要使用数字类型,因为数字的检索速度会非常块
◆ 如果主键是数字类型,还可以设置自动增长
CREATE TABLE t_teacher(
id INT PRIMARY KEY AUTO_INCREMENT,
......
);
非空约束
◆ 非空约束要求字段的值不能为NULL值
◆ NULL值以为没有值,而不是 “” 空字符串
CREATE TABLE t_teacher(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(200) NOT NULL,
married BOOLEAN NOT NULL DEFAULT FALSE
);
# 不能为空时,DEFAULT 默认值
唯一约束
◆ 唯一约束要求字段值如果不为NULL,那么在全表必须唯一
CREATE TABLE t_teacher(
......
tel CHAR(11) NOT NULL UNIQUE
);
外键约束
◆ 外键约束用来保证关联数据的逻辑关系
父表:
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_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)
);
# ENUM()规定字段值,只能在规定的字段值之内挑选一个
# FOREIGN KEY 规定外界约束
外建约束的闭环问题
◆ 如果形成外键闭环,我们将无法删除任何一张表的记录。
PS: 所以创建数据表的时候不推荐使用外键约束。
字符集、校对规则定义
CREATE DATABASE[IF NOT EXISTS]<数据库名>
[[DEFAULT]] CHARACTER SET <字符集名>][[DEFAULT] COLLATE <校对规则名>];
IF NOT EXISTS 可以判断数据库是否存在,此声明可以防止因数据库存在,导致全部语句的中止。