数据库三大范式:
1.第一范式:每一列都是不可分割的原子性数据项,不能是集合、数组非原子数据项;如果一个列中存在多个值,需要将改了拆分成不同的列;第一范式就是每一列保证不可拆分,保证原子性;
S_ID | NAME | AGE |
001 | 张三 | 30 |
002 | 李四 | 35 |
2.第二范式:在满足数据库第一范式的前提下,所有数据必须要完全依赖于主键;如果表中存在复合主键(主键对应两列或者多列)的情况下不符合第二范式;一张表只能描述一件事;表中每一列都必须依赖与主键;
S_ID | NAME | AGE | B_ID | BOOK | B_TIME |
S1001 | 张三 | 30 | B1001 | 计算机网络 | 2020-01-02 |
S1002 | 李四 | 35 | B1002 | TCP/IP技术 | 2020-01-03 |
S_ID | NAME | AGE |
S1001 | 张三 | 30 |
S1002 | 李四 | 35 |
B_ID | BOOK | B_TIME |
B1001 | 计算机网络 | 2020-01-02 |
B1002 | TCP/IP技术 | 2020-01-03 |
3.第三范式:满足第二范式的前提下,任何非主键列不得传递依赖于主键(称为解耦不知是否合适?)。传递依赖:A→B→C,C字段传递依赖于A字段,不满足第三范式要求:主键字段A→非主键字段B→非主键字段C
S_ID | NAME | AGE | COLLEGE | C_ADD |
S1001 | 张三 | 30 | 理学院 | A1楼 |
S1002 | 李四 | 35 | 计科院 | A2楼 |
S1003 | 赵五 | 30 | 计科院 | A2楼 |
上表存在传递依赖关系:学号(S_ID)→学院名称(COLLEGE)→学院地址(C_ADD);
处理办法:拆分成两张表,学生信息表、学院信息表,将学院编号(C_ID)作为第一张表的FOREIGN KEY。
S_ID | NAME | AGE | C_ID |
S1001 | 张三 | 30 | C1001 |
S1002 | 李四 | 35 | C1002 |
S1003 | 赵五 | 30 | C1002 |
C_ID | COLLEGE | C_ADD |
C1001 | 理学院 | A1楼 |
C1002 | 计科院 | A2楼 |
事务的四大特征:
1.原子性:不可分割的最小操作单位,要么成功,要是失败;
2.持久性:当事务提交或者回滚后,数据会持久存在;
3.隔离性:多个事务之间相互独立;
4.一致性:事务操作前后,数据的总量不变。
事务的隔离级别:
存在问题:多个事务操作同一批数据,会出现问题,设置了隔离级别可以解决该问题。
1.脏读:一个事务读取到了另外一个事务没有提交的数据;
2.不可重复读(虚读):同一个事务中,两次读取到的数据不一致;
3.幻读:一个事务操作(DML)数据表中所有的记录,另外一个事务添加了一条数据,则导致第一个事务查询不到自己修改的数据。
隔离级别解决问题:
1.read uncommitted:读未提交。会产生:脏读、不可重复读、幻读都会;
示例:同时开启两个事务,操作同一个表数据,事务1执行DML,未提交;事务2中查询该表数据已经变化;
2.read committed:读已经提交。会产生:不可重复读、幻读;【Oracle默认级别】
示例:同时开启两个事务,操作同一个表数据,事务1执行DML,未提交;事务2中查询查询该表数据未变化;当事务1执行commit操作,事务2中查询数据才会发生变化;
3.repeatable read:可以重复读。会产生:幻读;【Mysql默认级别】
示例:同时开启两个事务,操作同一个表数据,事务1执行DML,未提交;事务2中查询查询该表数据未变化;事务1执行commit操作,事务2中查询数据仍未变化,只有当事务2进行commit操作,查询数据时才会发生变化;
4.serializable:串行化,序列化。可以解决以上3中存在问题。
示例:同时开启两个事务,操作同一个表数据,事务1执行DML,未提交,此时会锁定操作的该数据表;事务2中进行查询会处于卡顿状态,只有事务1进行提交后,事务2执行的查询会自动查出结果。
以上四种隔离级别从1~4安全性越来越高,但是效率越来越低,所以需要选择合适的隔离级别,通常使用默认隔离级别即可,只有针对特殊需求才会调整隔离级别。
设置隔离级别:
#MYSQL8以下版本查询隔离级别
SELECT @@TX_ISOLATION;
#MYSQL8查询隔离级别
SELECT @@TRANSACTION_ISOLATION;
#设置隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;