Distributed System-分布式系统 SQL vs NoSQL 数据库

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 不需要提前定义数据的结构,可以快速迭代开发
    • 在修改数据的结构时,也不需要停机