Distributed System 分布式系统 SQL vs NoSQL 数据库
SQL(关系型数据库)
- 关系型数据库是结构化的、有提前定义好的数据的字段
- 例如:通讯录表存储电话号码和地址
- 数据通过行和列保存,每一行是一个实体(Entity)的信息,每一行包括所有独立的数据点
- 常用的有:MySQL、Oracle、MS SQL Server、SQLite、Postgres、MariaDB
NoSQL(非关系型数据库)
- 非关系型数据库是非结构化的,分布式的,动态的数据字段
类似文件夹,可以保存所有数据,包括地址、电话、FaceBook 的 Likes,以及在线购物偏好等
常用类型
- Key-Value 型
- Redis、Voldemort、Dynamo 等
- Document 型
- 数据被存在在文档中,文档被归类在一起,每个文档可以是完全不同的结构
- CouchDB、MongoDB 等
- Wide-Column 型
- 跟关系型数据库的列不同,这里的列是不限定数量的,每一行的列数量不同
- 适用于分析大数据集
- Cassandra、HBase 等
- 跟关系型数据库的列不同,这里的列是不限定数量的,每一行的列数量不同
- Graph 型
- 数据被保存在图结构中,包括点(实体)、属性(实体的信息)、和线(实体的关系)
- Neo4J、InfiniteGraph 等
主要区别
存储(Storage)
- SQL 数据是保存在表的行中,每一列代表一个数据点
- NoSQL 有多重数据保存模式,例如 Key-Value、Document、Grapj、Columnar
模式(Schema)
- SQL 每条记录有固定的模式,有多少列,列存什么数据都是提前确定的
- 如果模式要改动,那就要修改整个数据库,并且需要下线
- NoSQL 的模式是动态的,列是可以随时添加的,并且每一行不需要对齐列(列数量可以不同)
查询(Querying)
- SQL 使用 SQL(Structured Query Language) 语言来定义和维护数据
- NoSQL 的查询关注文档的集合,也被称为 UnQL(Unstructured Query Language)
- 不同类型的 NoSQL 数据库的语法不同
扩容性(Scalability)
- SQL 数据库经常是垂直扩容(增加单台服务器的 CPU、内存等),比较贵
- 也可以跨多台服务器扩容,但是很有挑战、时间开销大
- NoSQL 数据库可以水平扩容,添加服务器就行
- 许多 NoSQL 技术可以自动化跨服务器分发数据
可靠性 / ACID(Atomicity, Consistency, Isolation,Durability)兼容
- SQL 数据库兼容 ACID
- NoSQL 数据库大多数牺牲 ACID 来保证性能和扩容性
选型
没有一键适用(One-Size-Fits-All)所有场景的方案,很多业务场景同时使用 SQL 和 NoSQL
使用 SQL 的理由
- 需要确保 ACID 兼容
- ACID 兼容减少了异常数据,通过事务保证数据库的完整性
- 例如电子商务(E-commerce)和金融(Financial)应用
- 数据是结构化的,而且不会改变
- 如果业务场景是比较稳定的,不会有大量的增长,或者数据是一致性的,属性不会变化
使用 NoSQL 的理由
- 保存大量的,没有或者很少结构的数据
- NoSQL 数据库不限制数据的类型,可以根据需求添加新类型
- 基于文档的数据库,可以保存数据在一个地方,并且不需要定义什么类型的数据
- 充分利用云计算和云存储
- 云平台可以节省开销,但是要求数据可以跨多台服务器扩容
- 类似 Cassandra 类的 NoSQL 数据库本身设计就可以跨多个数据中心扩展
- 快速开发
- NoSQL 不需要提前定义数据的结构,可以快速迭代开发
- 在修改数据的结构时,也不需要停机