数据库基本概念
范式
符合某一种级别的关系模式的集合
构造数据库必须遵循一定的规则,在关系数据库中,这种规则就是范式
目前关系数据库有六种范式
第一范式(1NF)无重复的列
1NF是对属性原子性约束,要求属性具有原子性,不可再分解
简言之,不能有重复的属性,消除重复的属性
第二范式(2NF)属性完全依赖于主键
2NF是对记录的惟一性约束,要求记录有惟一标识(主键),即实体惟一性
完全依赖:不能存在仅依赖主关键字一部分的属性(联合主键情况),如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
简言之,消除部分函数依赖
第三范式(3NF)属性不依赖于其它非主属性
3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余,即字段冗余性
简言之,一个数据库表中不包含已在其它表中已包含的非主关键字信息,消除传递依赖
Eg:人员ID、人员姓名、部门ID、部门名称。该表不因有“部门名称”的冗余信息,该字段通过部门ID即可找到。
模式结构
外模式(用户级)
别名:子模式、用户模式
一个DB可以有多个外模式
由模式导出,给出了每个用户的局部描述(用户数据库)
模式(概念级)
别名:逻辑模式
一个DB只有1个模式
给出了系统全局的数据描述
内模式(物理级)
别名:存储模式
一个DB只有1个内模式
给出了DB物理存储结构和物理存取方法
事务
由一系列数据库操作组成的一个完整的逻辑过程
Eg:银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分
ACID
数据库事务正确执行的四个基本要素的缩写
原子性(Atomicity)
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
一致性(Consistency)
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性(Isolation)
数据库允许多个并发事务同时对其数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
持久性(Durability)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事务隔离级别
用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
解决问题:脏读、不可重复读、幻读
读未提交(Read uncommitted)
所有事务都可以看到其他未提交事务的执行结果。
本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)
读提交(read committed)
大多数数据库系统的默认隔离级别,满足了隔离的简单定义
支持不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
- 可重复读(repeatable read)
MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
理论上,会导致幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题
串行化(Serializable)
最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。
简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
不可重复读和幻读比较
不可重复读:在一个事务中不同时间段查询出现不同的结果,可能被更新可能被删除。
幻读:在一个事务中不同时间段查询,记录数不同。
与不可重复读的区别是:在幻读中,已经读取的数据不会改变,只是与以前相比,会有更多的数据满足查询条件。
DDL/DML/DCL/DQL/TCL
DDL(Data Definition Language 数据定义语言)
用于操作对象和对象的属性,这种对象包括数据库本身,以及数据库对象,像:表、视图等
该语言不需要commit
create, alter, drop,truncate(截断表), comment(备注)
DML(Data Manipulation Language 数据操控语言)
用于操作数据库对象中包含的数据,也就是说操作的单位是记录。
该语言需要commit
insert, update, delete,call(调用一个PL/SQL或Java子程序),explain plan( 解析分析数据访问路径)
DQL(Data Query Language 数据操控语言)
select
DCL(Data Control Language 数据控制语句)
用于操作数据库对象的权限,这些操作的确定使数据更加的安全,操作对象;用户
grant, revoke
TCL(Transaction Control Language 事务控制语言)
commit,rollback,savepoint(事务中设置断点,可以回滚至此处),set transaction(改变事务选项)