数据库,简单来说可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。
数据库存储的基本对象是数据,数据可以是数字、文字、图片、音频、视频等等。
数据库的基本特征
数据按一定的数据模型组织、描述和储存
可为各种用户共享
冗余度较小
数据独立性较高,与应用程序互不依赖
易扩展
类型
关系数据库:MySQL、SQL Server、Oracle等
非关系型数据库(NoSQL):BigTable(Google)Cassandra、MongoDB等
键值(key-value)数据库:Apache Cassandra、Dynamo、LevelDB(Google)
数据抽象
数据库为屏蔽底层复杂性,采用了层次抽象,可以大致区分为三个概括层次:物理层、逻辑层、视图层。
物理层:最接近实际存储体,亦即有关数据的实际存储方式。
逻辑层:介于两者之间的间接层,描述数据怎么存储及数据间关系。
视图层:最接近用户,即有关用户观看数据的方式。一个逻辑层可以对应多个视图层。
从上图可以看到,虽然逻辑相互独立,但是通过在物理层上只存储一份学生基本情况,使冗余度最小化。
数据模型
数据库结构的基础是数据模型。数据模型提供了一种描述物理层、逻辑层以及视图层数据库设计的方式。通俗地讲数据模型就是现实世界的模拟。
数据模型可被划分为四类:
实体-联系模型(entity-relationship model)。现实世界由一组称作实体的基本对象以及这些对象间的联系构成。
关系模型(relational model)。关系模型用表的集合来表示数据和数据间联系。每个表有多个列,每列有唯一的列名。关系模型是基于记录模型的一种。关系数据模型是使用最广泛的数据模型。
基于对象数据模型(object-based data model)。面向对象数据模型可以看成是E-R模型增加了封装、方法(函数)和对象标识等概念后的扩展。
半结构化数据模型(semistructured data model)。半结构化数据模型允许那些相同类型的数据项含有不同的属性集的数据说明。
数据库索引
数据索引的观念由来已久,像是一本书前面几页都有目录,目录也算是索引的一种,只是它的分类较广,例如车牌、身份证字号、条码等,都是一个索引的号码,当我们看到号码时,可以从号码中看出其中的端倪,若是要找的人、车或物品,也只要提供相关的号码,即可迅速查到正确的人事物。
数据库管理系统(DBMS)
位于用户与操作系统之间的一层数据管理软件。
用途:
科学地组织和存储数据、高效地获取和维护数据
功能:
提供数据定义语言(DDL)
定义数据库中的数据对象
数据组织、存储和管理(安全性、完整性、并发性控制、恢复)
数据库操作:事务
事务(Transaction)是用于完成单一逻辑功能的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分区的工作单位。
为保证事务(transaction)是正确可靠的,事务的ACID特性:
1)原子性(Atomicity):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态(故障恢复)。
2)一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
3)隔离性(Isolation):当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时,一个事务不能让其他事务看到该事务的中间状态。
4)持久性(Durability):在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的。
看下面的例子:
韩梅梅给李雷转账,必须保障韩梅梅账户减去100时,在李雷账户增加100(原子性),如果服务器断电,从韩梅梅账户减去100后,, 李雷账户却没有增加100,要将整个事务进行回滚。
转账完成后,两人的账户和必须保持不变(一致性),不能破坏关系数据的完整性以及业务逻辑上的一致性。
其他事务,比如一个查询事务,不能查询到转账中间状态,比如韩梅梅账户减去100, 李雷账户却没有增加100的状态。(隔离性)
当转账成功后,即使机器故障,韩梅梅和李雷账户也保持转账后的金额(持久性)
让我们来看一下隔离性中的几个概念:
1)脏读(Dirty Reads):脏数据所指的就是未提交的数据。也就是说,一个事务正在对一条记录做修改,事务来读取其他事物更改却未提交的数据。
2)不可重复读(Non-Repeatable Reads):一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。也就是说,这个事务在两次读取之间该数据被其它事务所修改。
3)幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。
隔离分为不同级别,包括:
读未提交(Read uncommitted):读取其他事务已经修改但还未提交的数据(脏数据),这是最低的隔离级别。
读提交(read committed):只能读取到已经提交的数据。即解决了脏读问题。
可重复读(repeatable read):在一个事务中,对同一个项,前后读取结果一样
串行化(Serializable):各事务串行执行(锁机制)
隔离级别对比表:
参考:
https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93
https://zh.wikipedia.org/wiki/ACID
http://www.cppblog.com/wolf/articles/121626.html
版权声明:本文为博主原创文章,未经博主允许不得转载。