文章目录
学习目标
- 数据库表设计
- 三大范式
- ER图与数据建模
- 外键约束与级联操作
- 索引
- 视图
- 触发器
数据库表设计
三大范式
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
第一范式
- 第一范式(1NF)要求数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值。(单表如何设计)
比如说住址:xx省xx市xx区xx路
如果有相应的业务要求,这个字段就可以按第一范式进行拆分,这样在针对地址进行检索时更加精确方便
字段名 | 值 | 字段名 | 值 | 字段名 | 值 | 字段名 | 值 |
---|---|---|---|---|---|---|---|
省份 | xx省 | 地市 | xx市 | 区名 | xx区 | 街道名 | xx路 |
- 若某一列有多个值,可以将该列单独拆分成一个实体,新实体和原实体间是一对多的关系。
说人话:需要将一个事物拆分到无法拆分
如某人的成绩可以分为学生信息表、科目表、成绩表
第二范式
- 满足第二范式需要先满足第一范式
- 非主属性必须完全依赖主属性(多对多怎么设计)
如:订单表要有订单信息和货物信息,那只能订单编号和货物编号作为联合主键,但这样订单相关信息不依赖货物编号这个主属性,货物信息不依赖订单编号,不符合第二范式,所以要把这个订单信息表进行拆分,把商品信息分离到另一个表中,订单表的商品编号与商品表的商品编号产生多对1的关联,即可满足第二范式。
说人话:表内所有数据都要和主键有所关联
第三范式
-
满足第三范式必须先满足第二范式。
-
实体中的属性不能是其他实体中的非主属性。因为这样会出现冗余。即:属性不依赖于其他非主属性。(一对多怎么设计)
-
如果一个实体中出现其他实体的非主属性,可以将这两个实体用外键关联,而不是将另一张表的非主属性直接写在当前表中。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。
说人话:表内所有属性都要和主键有直接关系,两表之间的联系要用外键连接
ER图与数据建模
什么是ER图
ER(Entity,RelationShip)图又称实体关联图、实体联系图,是用来描述实体本身以及与其它实体关系一种图。
ER图核心要素
- 实体:长方形,即数据模型中的数据对象,例如人、学生、音乐都可以作为一个数据对象,用长方体来表示
- 属性:椭圆形,即数据对象所具有的属性,例如学生具有姓名、学号、年级等属性,属性分为唯一属性和非唯一属性,唯一属性指的是唯一可用来标识该实体实例或者成员的属性,用下划线表示,一般来讲实体都至少有一个唯一属性(主键)。
- 关系:菱形,用来表现数据对象与数据对象之间的联系
三者之间要用线连接
ER图实践
学生考勤系统案例
此图就没有标明哪个是唯一属性
数据建模
比起ER图,数据建模更加常用
下面是账号表和角色表的数据建模
一个账号可以有多个角色
外键约束与级联操作
外键
什么是外键?
外键是用来建立两个表的关联关系的字段。 外键是表的一个字段,不是本表的主键,但对应另一个表的主键。
什么是外键约束
用来约束表中的数据必须符合外键表的相关条件,以及在更新数据,自动对关联表做出相关处理。
外键对表的影响
- 添加时外键的值必须是在外键表存在的
- 修改时外键的值必须是在外键表存在的
- 删除时,不能先删除外键主表中外键所在行记录,只能先删除外键所在表的记录
外键约束的操作
创建表时添加外键约束
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]
建表后添加外键约束
ALTER TABLE <数据表名> ADD CONSTRAINT <索引名> FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
查看表中的外键
show indexes from 表名;
删除外键
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
级联操作
在涉及外键时,删除更新会受到限制,不允许删除,如要删除,要先去对应子表把对应数据删除后才能删改,若数据过多则很麻烦,因此可以在创建外键时使用级联操作来自动处理
语法:CONSTRAINT 外键名 FOREIGN KEY(列名) REFERENCES 主表名(主列名) ON 操作类型 级联操作类型
- 操作类型是指删除(delete)、更新(update)
级联操作类型:
- 不做级联操作 RESTRICT、no action>
默认情况下就是不做级联操作,即子表有数据,则不准父表删改
- 级联更新、删除 CASCADE
父表在更新或者删除时,更新或者删除子表对应记录
- 设为NULL set null
则是表示父表在更新或者删除的时候,子表的对应字段被改为NULL
视图
什么是视图
视图是一张虚拟表,是一张逻辑表,本身没有数据。本质就是一段SQL,是一段保存在数据库,且可以重复利用的sql。
为什么要用
用视图的大部分情况是为了保障数据安全性,提高查询效率。
- 简单:不用关注视图背后的表结构和逻辑,就把视图当成一表用。
- 安全:仅能访问到视图返回的数据。
视图的操作
创建视图
语法:create VIEW 视图名 as 查询语句;
修改视图
语法:create or replace VIEW 视图名 as 查询语句;
删除视图
语法:drop view 视图名;
查看视图
语法:SELECT * FROM information_schema.views where table_schema='数据库名';
使用视图
语法:select * from 视图名;
索引
什么是索引
索引类似书籍中的目录,本质是一张表.
索引的分类
- 主键索引(PRIMARY KEY)
- 唯一索引(UNIQUE)
- 普通索引(INDEX)
- 全文索引(FULLTEXT)
索引的底层实现原理
索引的底层是一棵B+树
索引的操作
创建索引
- 直接创建索引
CREATE 索引类型 索引名 ON 表名(列名);
- 在已存在的表上追加普通索引
ALTER table 表名 ADD 索引类型 索引名(列名);
- 创建表的时候直接指定
create table 表名(
...,
索引类型 索引名(列名)
);
查看索引
查看表中的所有索引
show index from tc_9;
删除索引
删除指定索引
drop 索引类型 索引名 on 表名;
索引注意事项
- 索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
- 一张表最好不要超过3个索引
- 一个字段重复率超过30%时,不建议添加索引
触发器
触发器的作用
监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会激活它执行
触发器四大因素
- 监视地点(table)
- 监视事件(insert/update/delete)
- 触发时间(after/before)
- 触发事件(内部执行逻辑)
触发器的操作
创建触发器
触发器针对的是数据库中的每一行记录,每行数据在操作前后都会有一个对应的状态,触发器将没有操作之前的状态保存到 old 关键字中,将操作后的状态保存到 new 中。
需要注意的是,old 和 new 不是所有触发器都有
- INSERT型触发器 没有 old,只有 new,new 表示将要(插入前)或者已经增加(插入后)- 的数据
- UPDATE型触发器 既有 old 也有 new,old 表示更新之前的数据,new 表示更新之后的数据
- DELETE型触发器 没有 new,只有 old,old 表示将要(删除前)或者已经被删除(删除后)的数据
语法:
delimiter $ //设置MySQL执行结束标志,默认为;
create trigger tg_name -- 触发器名称
after|before -- 触发时间
insert|update|delete -- 监视事件
on table_name -- 监控表名
for each row -- 固定写法
begin -- 开始触发器内部逻辑
查询语句
end$ -- 结束触发器内部逻辑
delimiter ; //重新将MySQL执行结束标志设置为;
PS:如果 before 触发器失败或者语句本身失败,将不执行 after 触发器(如果有的话)
删除触发器
语法:drop trigger 名称;
查看触发器
查看所有触发器:
show triggers;
select * from information_schema.TRIGGERS;
查看指定数据库、表的触发器
show triggers;
select * from information_schema.TRIGGERS where trigger_schema='数据库名' and event_object_table='表名';
查看触发器的创建语法
show create TRIGGER t1;
触发器的使用限制
触发器不是程序员手工调用的,是DBMS自动调用,由对应语句触发。
MySQL 的触发器中不能对本表进行 insert、update 和 delete 操作,否则会报错
触发器的优缺点
- 优点
- 触发器可以通过数据库中的关联表实现级联更改,即一张表数据的改变会影响其他表的数据
- 可以保证数据安全,并进行安全校验
- 缺点
- 过分依赖触发器,影响数据库的结构,增加数据库的维护成本