事务ACID
原子性(atomicity)
每个事务都是不可分割的最小单元,事务中的操作要么全部成功,要么全部失败回滚。
一致性(consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
隔离性(isolation)
一个事务所做的修改在最终提交以前,对其他事务是不可见的。
持久性
事务提交后,所做的修改会永久保存到数据库中。(这是个模糊的概念,持久性是不可能完全做到的)
事务隔离级别
未提交读(READ UNCOMMITTED)
事务的修改,即使没有提交也会被别的事务看见,别的事务可以读取未提交的数据,这是脏读。
提交读(READ COMMITTED)
一个事务在提交之前所做的修改对其他事务是不可见的。
解决了脏读问题,但不可重复读:一个事务内的两次查询可能会出现不同的结果。(在mysql Innodb引擎中如果需要读取某行数据,事务开始时会持有该行的共享锁。其他想更新数据的事务会请求排他锁,需要等待共享锁释放才可获取排他锁)
可重复读(REPEATABLE READ)
同一事务中多次读取同样的记录结果是一样的。
解决了不可重复读的问题,但幻读:当事务 A 在读取某个范围内的记录时,另外一个事务 B 又在该范围内插入了新的记录,A再次读取时会出现幻行。
(Innodb 引擎的间隙锁可以防止幻行的出现(快照读不会加锁,select .. for update 会加锁):事务A会获取要读取的行间的间隙锁,事务B插入时必须要等待间隙锁释放)
这是mysql的默认事务隔离级别。
可串行化(SERIALIZABLE)
强制事务串行执行。解决了幻读问题,但是无法并发操作,容易出现死锁。
E-R图
E-R图即实体-关系图(entities-relationship),常用于关系数据库的设计。E-R图分为实体、属性、关系三个核心部分。实体是长方形体现,而属性则是椭圆形,关系为菱形。
DML,DDL,DCL,DQL
DML(Data Manipulation Language),数据操纵语言:INSERT、UPDATE、DELETE
DDL(Data Definition Language),数据定义语言:CREATE TABLE/VIEW/INDEX/SYN/CLUSTER …
DCL(Data Control Language),数据库控制语言:ROLLBACK、GRANT。用来授予或回收访问数据库的某种特权,并控制
数据库操纵事务发生的时间及效果,对数据库实行监视等。
DQL(Data Query Language),数据查询语言:SELECT…
范式
链接:https://www.zhihu.com/question/24696366/answer/29189700
来源:知乎
范式可以粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。符合高一级范式的设计,必定符合低一级范式,例如符合2NF的关系模式,必定符合1NF。
1NF的定义为:符合1NF的关系中的每个属性都不可再分
2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。
第三范式(3NF) 3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。
BCNF:在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。
函数依赖
若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y。
完全函数依赖
在一张表中,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X ’ → Y 不成立,那么我们称 Y 对于 X 完全函数依赖。
例:包含A、B、C三个字段的表,其中A、B为主键,如果C函数依赖于(A, B),且C不依赖于A,不依赖于B,那么C完全函数依赖于(A, B)。
部分函数依赖
假如 Y 函数依赖于 X,但同时 Y 并不完全函数依赖于 X,那么我们就称 Y 部分函数依赖于 X。
例:包含A、B、C三个字段的表,其中A、B为主键,如果C函数依赖于(A, B),且C又函数依赖于A或B,那么C部分函数依赖于(A, B)。
传递函数依赖
C函数依赖于B,B函数依赖于A,则C传递函数依赖于A。
码
设 K 为某表中的一个属性或属性组,若除 K 之外的所有属性都完全函数依赖于 K(这个“完全”不要漏了),那么我们称 K 为候选码,简称为码。在实际中我们通常可以理解为:假如当 K 确定的情况下,该表除 K 之外的所有属性的值也就随之确定,那么 K 就是码。一张表中可以有超过一个码。
(感觉码类似于表的唯一索引(Unique Key))
非主属性
包含在任何一个码中的属性成为主属性。