数据库

关系数据库设计理论

函数依赖

依赖关系:A->B,A决定B,B依赖于A。

键码: 集合{A1, A2, ..., An}决定了关系的其他属性且是最小的。

部分依赖关系:A->B,但是还存在真子集A'也能满足A'->B,说明是部分函数依赖;否则为完全函数依赖。

传递依赖:A->B, B->C => A->C。

可能出现的异常

· 冗余数据

· 修改异常:修改了一个记录中的信息,另一个记录中的相同信息却未修改(没有同时修改)

· 删除异常:只删除一个记录,但是同时删除了其他不应该删除的记录(删除了相关联的)

· 插入异常:想插入数据,但是因为其他相关联的设定不能插入。

数据库范式

数据库范式是设计数据库是的规范,避免产生异常。

第一范式(1NF):属性是最小单元,不可继续分割。

第二范式(2NF):1NF + 非主属性完全依赖于键码(主属性)。

第三范式(3NF):2NF + 非主属性不依赖于其他非主属性(也相当于不传递依赖于主属性)。

数据库事务

定义

用户定义的一个数据库操作系列,是一个不可分割的工作单位,要么全部完成,要么全都不做。

ACID

A(Atomicity) 原子性:不可分割。

C(Consistency) 一致性:所有事务对同一个数据的读取结果都是相同的。

I(Isolation) 隔离性:事务的修改在提交前对其他事务不可见。

D(Durability) 持久性:一旦事务提交,所做的修改将永久保存在数据库中。

并发一致性

并发环境下,导致数据库事务的隔离性遭到破坏。

问题

修改丢失:事务一的修改被事务二的修改覆盖。一未生效。

读脏数据:不同事务之间未隔离,事务二可以读到事务一的数据,一修改数据但未提交,二读取到修改后的数据,一撤销操作,二读到的数据成为脏数据。

不可重复读:不同时间多次读取同一事务的同一数据,事务一未完成前,其他事务更改了数据,会导致事务一多次读取该数据的值不相同。

(幻影读):T1事务执行,影响一个范围的数据。此时T2对该范围进行了增/删,T1再次读取该范围时发现数据的数量改变了。本质也是不可重复读。

解决办法:隔离级别

未提交读(Read Uncommitted):事务未提交,数据也对其他事务可见。

提交读(Read Committed): 事务提交后数据才可见。

可重复读(Repeatable Read):同一个事务中,多次读取一个数据的值是相同的。

可串行化(Serializable):强制事务串行化执行,不产生并发。一般需要依靠锁来执行。

技术手段

封锁

Last updated