1/核心概念
-
SQL(Structured Query Language)
- 本意:指 结构化查询语言,是与关系型数据库通信的标准语言。
- 现在通常指代:关系型数据库 本身。它基于关系模型(使用表、行、列),数据模式是预定义且固定的,强调数据的 一致性 和 完整性。
-
NoSQL(Not Only SQL)
- 本意:不仅仅是 SQL。
- 现在通常指代:非关系型数据库。它是一个统称,涵盖所有不遵循传统关系模型的数据存储系统。NoSQL 数据库通常为 可扩展性、灵活的模式 和 高性能 等特定需求而设计。
2/主要区别
| 特性 | SQL(关系型数据库) | NoSQL(非关系型数据库) |
|---|
| 数据模型 | 结构化。预定义的模式(表结构),数据以行和列的形式存储在表中,表之间通过外键关联。 | 灵活/非结构化。无固定模式。根据类型不同,可以是键值对、文档、图或宽列。 |
| 查询语言 | 使用标准化的 SQL 语言进行增删改查。 | 没有统一查询语言。每种数据库有自己的 API 或查询方法(如基于 JSON 的查询)。 |
| 扩展性 | 垂直扩展为主。通过增加单台服务器的 CPU、内存、硬盘来提升性能。横向扩展(分库分表)较复杂。 | 水平扩展为主。天然支持通过增加服务器节点(分布式集群)来分担负载,扩展性强。 |
| 事务性(ACID) | 强调 ACID 属性(原子性、一致性、隔离性、持久性),支持复杂事务。 | 通常遵循 BASE 原则(基本可用、软状态、最终一致性),牺牲强一致性以获得高可用和分区容错性。但部分 NoSQL 现在也支持事务。 |
| 主要优势 | 数据结构化,数据完整性好,支持复杂查询和多表关联操作,技术成熟。 | 高并发读写性能好,扩展灵活,模式灵活易于迭代,能很好地处理海量数据和非结构化数据。 |
| 主要劣势 | 扩展性相对困难,高并发下可能遇到瓶颈,固定的模式在需求频繁变化时不够灵活。 | 不支持复杂的关联查询(Join),事务支持相对较弱(尤其在分布式下),不同产品特性差异大。 |
| 适用场景 | 需要复杂查询、强一致性、事务支持的场景。如:金融系统、ERP、CRM、会计系统等。 | 大数据量、高并发、模式多变、数据结构不固定的场景。如:社交网络、内容管理系统、物联网、实时分析、购物车缓存等。 |
3/各自代表的数据库
SQL(关系型数据库)代表
这些都是 基于表的、支持 SQL 标准 的成熟数据库。
- MySQL / MariaDB: 最流行的开源关系数据库,广泛用于Web应用。MariaDB 是 MySQL 的一个分支。
- PostgreSQL: 功能强大的开源对象-关系型数据库,支持高级数据类型(如 JSON、GIS)和复杂查询,被誉为“最先进的开源关系数据库”。
- Oracle Database: 企业级商业数据库的王者,功能极其全面强大,常用于大型、关键业务系统。
- Microsoft SQL Server: 微软推出的商业数据库,与 Windows 生态和 .NET 平台集成紧密。
- SQLite: 轻量级的嵌入式数据库,整个数据库就是一个文件,常用于移动端和桌面应用。
NoSQL(非关系型数据库)代表
NoSQL 通常分为以下几大类,每类解决不同问题:
1. 文档型数据库
- 特点: 数据以类似 JSON/BSON 的文档形式存储,每个文档可以有完全不同的结构。
- 代表:
- MongoDB: 最流行的文档数据库,查询功能强大,适合内容管理、用户配置等。
- CouchDB: 使用 HTTP API,支持数据同步。
2. 键值型数据库
- 特点: 最简单的 NoSQL 模型,数据以 键-值对 形式存储,通过键快速访问值。性能极高。
- 代表:
- Redis: 数据存储在内存中,速度极快,常用作缓存、消息队列、会话存储。
- Amazon DynamoDB: AWS 托管的键值/文档混合数据库,提供极高的可扩展性。
- etcd: 用于分布式系统配置共享和服务发现。
3. 宽列存储数据库
- 特点: 数据存储在 列族 中,可以动态添加列,非常适合海量数据的存储和查询(特别是读操作)。
- 代表:
- Apache Cassandra: 高可用、无单点故障的分布式数据库,写性能优异。
- Apache HBase: 构建在 Hadoop HDFS 之上的分布式数据库,适合大数据分析。
- Google Bigtable: Cassandra 和 HBase 的设计灵感来源。
4. 图数据库
- 特点: 专门存储实体(节点) 和关系(边) 的信息,擅长处理复杂的关系网络。
- 代表:
- Neo4j: 最著名的图数据库,使用 Cypher 查询语言。
- Amazon Neptune: AWS 托管的图数据库服务。
4/总结与趋势
- 不是替代关系,而是互补关系: SQL 和 NoSQL 适用于不同的场景。现代架构中经常 混合使用,例如用 MySQL 存储核心交易数据,用 Redis 做缓存,用 Elasticsearch(一种搜索引擎,常被归为 NoSQL)做全文检索。
- 融合趋势: 出现了 “NewSQL” 数据库(如 Google Spanner, CockroachDB),试图结合 SQL 的强一致性和 NoSQL 的水平扩展性。同时,许多传统 SQL 数据库(如 PostgreSQL, MySQL)也开始支持 JSON 等非结构化数据,而 NoSQL 数据库(如 MongoDB)也增加了事务支持。
- 如何选择:
- 如果你的数据结构化、关系复杂、需要强一致性,优先选择 SQL。
- 如果你需要处理海量数据、高并发、模式多变、或数据结构松散,优先考虑 NoSQL。