关系型数据库:
书中的解释是:在实体以及实体间的联系用关系来表示,在一个给定的应用领域中,所有关系的集合构成一个关系数据库。关系数据库的值是这些关系模式的某一个时刻对应的关系的集合,通常称为关系数据库。
关系型数据库以行和列的二元形式存储数据。
常见的有MySQL,SQL Server,Oracle,还有DB2,Access(我只了解MySQL,SQL Server,所以很多还在不断地学习中)
关系型数据库通常包含下列组件:
客户端应用程序(Client)
数据库服务器(Server)
数据库(Database)
特点
- 基于单一关系模型,结构化存储,有完整性约束
- 通过二维表建立数据间的联系
- 采用结构化查询语言进行数据读写
- 操作保存数据的一致性(事务处理)
事务的ACID特性:
- 原子性:事务是数据的逻辑工作单位,事务中的操作要么都做,要么都不做。
- 一致性:事务执行的结果必须是使数据库从一个一致性状态到另一个一致性状态。
- 隔离性:一个事物的执行不被其它事务干扰。
- 持续性(永久性):一个事务一旦提交,它对数据库的改变就是永久性的。
优点
- 保持数据的一致性。由于高并发,数据同步需要采用锁来保证一致性
- 数据更新的开销很小
- 可以进行Join等复杂查询
- SQL语言使得操作数据库方便
- 易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性),减低了数据冗余和数据不一致的概率
缺点
- 为了维护一致性就会使读写性能变差;
- 固定的表结构,不适合为有数据更新的表做索引或表结构变更;
- 不适用高并发读写需求,读写性能不足;
- 不适用海量数据的写入处理;
- 为保证数据一致性,需要加锁,影响并发操作,开销大;
- 涉及联表查询会变得复杂和慢。
非关系型数据库
又称为NoSQL(Not Only SQL,即不仅仅是SQL)。
采用Key-Value的方式存储数据,即无关联(no relational)。
典型的NoSQL数据库有
- 临时性键值存储(Memcached,Redis)
- 永久性键值存储(ROMA、Redis)
- 面向文档的数据库(MongoDB)
- 面向列的数据库(Cassandra,HBase)
键值存储
数据以键值形式存储的,只能通过键的完全一致查询获取数据,根据数据的保存方式可分为临时性、永久性和两者兼具。
(1)临时性——memcached
- 数据有可能丢失
- 在内存中保存数据(memcached把所有数据都保存在内存中)
- 保存和读取速度非常快
(2)永久性
- 数据不会丢失
- 在硬盘上保存数据
- 保存和读取处理速度较快(但无法与memcached相比)
(3)两者兼备——Redis
- 同时在内存和硬盘上保存数据
- 可以进行非常快速的保存和读取处理
- 保存在硬盘上的数据不会消失(可以恢复)
- 适合于处理数组类型的数据
面向文档的数据库
MongoDB、Couch DB属于这种类型。
(1)不定义表结构
(2)可以使用复杂的查询条件
面向列的数据库
Cassandra、HBae、HyperTable属于这种类型。
普通的关系型数据库是以行为单位存储数据,以行为单位的读入处理,比如特定条件数据的获取。
因此,关系型数据库也被称为面向行的数据库。相反,面向列的数据库是以列为单位存储数据的,
擅长以列为单位读入数据。
特性
- 使用键值Key-Value存储数据;
- 分布式
- 一般不支持ACID特性
- 非关系型数据库严格上来说不是一种数据库,是一种数据结构化存储方法的集合,每个数据都可以有不同的结构;
优点
- 无需经过sql层的解析,读写性能高;
- 基于键值对,数据没有耦合性,易于扩展和查询;
- 存储数据的格式:key-val形式、文档形式、图片形式等等,而关系型数据库则支持基础类型;
- 降低了一致性的要求,查询速度很快
- 可以处理海量数据,可运行在便宜的PC服务器集群上,而
缺点
- 不提供sql支持;
- 无事务处理,附加功能表和报表等。