范式:Normal Format,符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度。一个数据库表之间的所有字段之间的联系的合理性。
学生表,班级表
目前数据库应用到的范式有以下几层
除此之外还有BCNF范式,4NF,5NF
一个数据库表设计的是否合理,要从增删改查的角度去考虑,操作是否方便
第一范式:确保表中每一列数据的原子性,不可再分!
第二范式:在满足第一范式的基础上,确保列数据要跟主键关联,不能出现部分依赖。
第三范式设计表:再满足第二范式的基础上,保证每一列数据都要跟主键直接关联,不能出现传递依赖。
在设计数据库的时候,要在满足自己需求的前提下,尽可能的满足三大范式。
表间的关系
需求分析:
设计数据库时,多对多关系,需要一个中间表进行关联!
为什么需要事务 (一件完整的事情)
事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。即一组sql中哪怕有一条失败也会失败
例子: 转账操作,一个账户减钱,一个账户加钱
默认情况下,mysql的事务是自动提交的,也就是执行了增删改语句之后,数据直接持久化到磁盘上,不能撤销。
但是如果改为手动事务之后,更新过的数据,再没有使用commit提交时,可以通过rollback进行撤回。
数据库事务的原理
start transaction/begin;开始事务
rollback;回滚事务
commit;提交事务
什么是数据库事务
从开启到提交为一个事务。
由此可见,一个事务对应一组业务。一个事务中间可以有一条sql,多条sql。
所以 一个业务开始之前 开启事务 一个业务结束之后 提交事务。
我们这个转账案例:需要几个事务?
可以写成两个事务,但是不合适。因为我们的需求 让张三减的同时让李四加钱。只能写成一个事务。
事务的特征ACID 面试题
1、原子性(Atomicity):
事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):
事务开始前和结束后,数据库的数据完整性约束没有被破坏,事务前后操作数据是一致的 。比如A向B转账,不可能A扣了钱,B却没收到。
能量守恒。
3、隔离性(Isolation):
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
两个事务之间是有隔离级别,隔离级别的不同会导致出现不同的问题。此时产生三种问题:脏读 幻读 不可重复读。
4、持久性(Durability):
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
脏读:
事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
不可重复读:
事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
幻读:
已知有两个事务A和B,A从一个表中读取了数据,然后B在该表中插入了一些新数据,导致A再次读取同一个表, 就会多出几行,简单地说,一个事务中先后读取一个范围的记录,但每次读取的纪录数不同,称之为幻象读
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表