三范式
第一范式(1NF)
在一张表中,组成表的每一个属性都是不能再分的属性,如果满足这一规则,则该表符合第一范式。
表1(不符合) 表2(符合)
表1的Info字段可以再拆分,故不符合1NF;表2所有属性不可再分,符合。
第二范式(2NF)
首先要满足1NF,表中的每一个非主属性必须完全依赖于本表的主键(候选键),而不能是部分依赖。
表1 表2
表1中,学号和课程为联合主键,由于姓名属性只依赖于学号,学分只依赖于课程,故不满足2NF;表2中,选修时间及成绩都完全依赖于主键,故符合2NF。由此也可知不满足2NF的情况只会出现在有联合主键的表中。
第三范式(3NF)
首先满足1NF和2NF,另外所有非主属性都是与主键直接相关,而不能是间接相关
表1
表1中,客户名称与订单号并不是直接相关,而是可以通过客户号与订单号间接相关,故不满足3NF
五大约束
1、 Primary key:主键约束
2、 UNIQUE:唯一性约束
3、 NOT NULL:非空约束
4、 Foreign key:外键约束
5、 Default:默认值约束
事务
四大特性(ACID)
1、 原子性(atomicity):一个事务是不可分割的,所以要么执行其全部内容,要么就根本不执行。如果一个事务开始执行,但是由于某些原因失败了,则事务对数据库造成的任何可能的修改都要撤销。
2、 一致性(consistency):一个事务作为原子从一个一致的数据库状态开始独立运行,则事务结束时数据库也必须是再次是一致的。比如,在转账之前 A + B = 500,那么在转账之后也应是A + B = 500。
3、 隔离性(isolation):多个并发执行的事务间互不干扰。
4、 持久性(durability):事务一旦提交,数据库中的数据的改变是永久的,即使数据库出现故障。
三读
1、 脏读:两个并发事务,事务T2读取了事务T1未提交的数据。如下图,事务T1尚未提交,这时事务T2进来读取了x的值,但是事务T1最终可能不提交而是进行了回滚,这样T2就读取了无效的x。
2、 不可重复读:在事务内存在多次读取某变量的操作,但是前后读取的值不一样。如下图,事务T2存在两次读取x的操作,但是有可能在第一次读取完的时候,T1事务执行把x值修改,T2再次读取x的值就与第一次读取的结果不一样。
3、 幻读:在某个事务内前后执行了相同的操作(如查询结果集),但得到的结果集不一样。如下图,T1在T2执行的过程中进行了插入操作,导致T2前后查询结果不一致。
事务隔离性级别
1、 可串行化(serializable):最高隔离级别,通常保证可串行化调度,可避免脏读、不可重复读和幻读的发生。读时加表级共享锁,事务结束释放;更新时加表级排他锁,事务结束后释放。
2、 可重复读(repeatable read):可避免脏读、不可重复读。读时加行级共享锁,直到事务结束释放;更新时加排他锁,直到事务结束后释放。(mysql默认隔离级别)
3、 已提交读(read committed):可避免脏读。读时加行级共享锁,读完释放;更新时加行级排他锁,事务结束后释放。
4、 未提交读(read uncommitted):最低隔离级别,允许读取未提交数据。更新时加排他锁,更新完释放。