数据库设计三大范式

范式:Normal Format,符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度。一个数据库表之间的所有字段之间的联系的合理性。

学生表,班级表

  • 范式是离散数学里的概念
  • 范式目标是在满足组织和存储的前提下使数据结构冗余最小化
  • 范式级别越高,表的级别就越标准

目前数据库应用到的范式有以下几层

  • 第一范式:1NF
  • 第二范式:2NF
  • 第三范式:3NF

除此之外还有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再次读取同一个表, 就会多出几行,简单地说,一个事务中先后读取一个范围的记录,但每次读取的纪录数不同,称之为幻象读

  小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

你可能感兴趣的:(数据库,数据库,sql,mysql,数据库开发)