一文搞懂什么是关系型数据库?什么是非关系型数据库?

文章目录

    • 前言:为什么这个问题如此重要?
    • 第一部分:什么是"关系"?------揭开术语的数学面纱
      • [1.1 "关系"不是日常用语,而是数学概念](#1.1 “关系”不是日常用语,而是数学概念)
      • [1.2 Codd 的革命:将"关系"引入数据库](#1.2 Codd 的革命:将“关系”引入数据库)
    • [第二部分:什么是关系型数据库?(Relational Database)](#第二部分:什么是关系型数据库?(Relational Database))
      • [2.1 定义](#2.1 定义)
      • [2.2 核心特征](#2.2 核心特征)
      • [2.3 典型代表系统](#2.3 典型代表系统)
    • [第三部分:什么是非关系型数据库?(NoSQL Database)](#第三部分:什么是非关系型数据库?(NoSQL Database))
      • [3.1 名称澄清:"NoSQL" ≠ "No SQL"](#3.1 名称澄清:“NoSQL” ≠ “No SQL”)
      • [3.2 定义](#3.2 定义)
      • [3.3 出现背景:互联网时代的挑战](#3.3 出现背景:互联网时代的挑战)
      • [3.4 四大主流类型详解](#3.4 四大主流类型详解)
        • [(1)文档型数据库(Document Store)](#(1)文档型数据库(Document Store))
        • [(2)键值型数据库(Key-Value Store)](#(2)键值型数据库(Key-Value Store))
        • [(3)宽列型数据库(Wide-Column Store)](#(3)宽列型数据库(Wide-Column Store))
        • [(4)图数据库(Graph Database)](#(4)图数据库(Graph Database))
    • [第四部分:关系型 vs 非关系型 ------ 全维度深度对比](#第四部分:关系型 vs 非关系型 —— 全维度深度对比)
      • [补充:CAP 定理 vs ACID](#补充:CAP 定理 vs ACID)
    • 第五部分:常见误解
      • [❌ 误解1:"NoSQL 就是不要 SQL"](#❌ 误解1:“NoSQL 就是不要 SQL”)
      • [❌ 误解2:"关系型数据库不能水平扩展"](#❌ 误解2:“关系型数据库不能水平扩展”)
      • [❌ 误解3:"非关系型一定比关系型快"](#❌ 误解3:“非关系型一定比关系型快”)
      • [❌ 误解4:"非关系型没有结构"](#❌ 误解4:“非关系型没有结构”)
    • [第六部分:实战选型指南 ------ 如何选择?](#第六部分:实战选型指南 —— 如何选择?)
      • [✅ 优先选择关系型数据库,如果:](#✅ 优先选择关系型数据库,如果:)
      • [✅ 优先选择非关系型数据库,如果:](#✅ 优先选择非关系型数据库,如果:)
      • [🔁 推荐策略:混合持久化(Polyglot Persistence)](#🔁 推荐策略:混合持久化(Polyglot Persistence))
    • 第七部分:未来趋势
    • 结语:回到本质,理性选择

前言:为什么这个问题如此重要?

在构建任何现代信息系统------无论是银行核心交易系统、电商平台、社交应用,还是物联网平台------数据库的选择是架构设计的第一块基石。而面对成百上千种数据库产品,一个根本性的问题始终摆在面前:

什么是关系型数据库?什么又是非关系型数据库?它们的本质区别是什么?

很多人望文生义,认为"关系型"就是"数据之间有关系","非关系型"就是"数据彼此无关"。这种理解不仅不准确 ,还可能导致严重的技术选型失误


第一部分:什么是"关系"?------揭开术语的数学面纱

1.1 "关系"不是日常用语,而是数学概念

"关系型数据库"中的"关系"(Relation),并非指"数据之间有关联" ,而是源自集合论中的严格数学定义

在数学中:

  • 设有 n n n 个集合(称为"域",Domain) D 1 , D 2 , ... , D n D_1, D_2, \dots, D_n D1,D2,...,Dn
  • 它们的笛卡尔积为:
    D 1 × D 2 × ⋯ × D n = { ( d 1 , d 2 , ... , d n ) ∣ d i ∈ D i } D_1 \times D_2 \times \cdots \times D_n = \{ (d_1, d_2, \dots, d_n) \mid d_i \in D_i \} D1×D2×⋯×Dn={(d1,d2,...,dn)∣di∈Di}
  • 该笛卡尔积的任意子集 R R R 被称为一个 n元关系(n-ary relation)

例如:

  • 学生集合 = {张三, 李四}
  • 课程集合 = {数学, 物理}
  • 则"选课"关系可能是: { ( 张三 , 数学 ) , ( 李四 , 物理 ) } \{(\text{张三}, \text{数学}), (\text{李四}, \text{物理})\} {(张三,数学),(李四,物理)}

这个"关系"就是一个有序元组的集合

1.2 Codd 的革命:将"关系"引入数据库

1970年,IBM 研究员 Edgar F. Codd 在其划时代论文《A Relational Model of Data for Large Shared Data Banks》中,首次将上述数学"关系"用于数据管理,提出关系模型(Relational Model)。

在该模型中:

  • 一张二维表 = 一个"关系"
  • 表的每一行 = 一个元组(Tuple)
  • 表的每一列 = 一个属性(Attribute),对应一个域(Domain)
  • 所有字段必须是原子的 (不可再分),即满足第一范式(1NF)

因此,"关系型数据库"的"关系",本质上是指数据以数学意义上的'关系'形式组织,而非"表之间有外键关联"。

当然,后续发展的外键(Foreign Key)机制,使得多个"关系"(表)之间可以建立逻辑引用,从而支持更复杂的业务建模,这也让"关系"一词在工程实践中获得了双重含义。


第二部分:什么是关系型数据库?(Relational Database)

2.1 定义

关系型数据库 (Relational Database)是基于 Codd 提出的关系模型构建的数据库系统,通过结构化的二维表 存储数据,并使用SQL(Structured Query Language)进行数据操作与管理。

其管理系统称为 RDBMS(Relational Database Management System)。

2.2 核心特征

特性 说明
固定 Schema 表结构需预先定义(字段名、类型、约束等),写入数据必须符合 Schema
ACID 事务 支持原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
强一致性 写入成功后,所有后续读取立即看到最新值
SQL 标准 使用标准化的 SQL 语言,支持复杂查询(JOIN、子查询、聚合、窗口函数等)
引用完整性 通过主键(PK)和外键(FK)确保表间数据逻辑一致
规范化设计 鼓励通过范式(1NF~5NF)消除冗余,提升数据一致性

2.3 典型代表系统

  • 开源:MySQL、PostgreSQL、MariaDB、SQLite
  • 商业:Oracle Database、Microsoft SQL Server、IBM Db2
  • 云原生分布式 RDBMS(NewSQL):Google Cloud Spanner、Amazon Aurora、TiDB、CockroachDB

PostgreSQL 因其对 SQL 标准的高度兼容、强大的扩展能力(如 JSONB、GIS、全文检索、自定义索引等),被广泛认为是功能最全面的开源关系数据库。


第三部分:什么是非关系型数据库?(NoSQL Database)

3.1 名称澄清:"NoSQL" ≠ "No SQL"

"NoSQL" 最初意为 "Non-SQL" 或 "Non-Relational",但在 2009 年后被重新诠释为 "Not Only SQL" ,强调其不限于关系模型和传统 SQL 语法,而非完全排斥查询语言。

3.2 定义

非关系型数据库 (NoSQL Database)是一类不强制采用关系模型不要求固定 Schema通常为分布式架构的数据库系统,旨在解决大规模、高并发、灵活结构场景下的性能与扩展性瓶颈。

3.3 出现背景:互联网时代的挑战

2000 年代中期,随着 Web 2.0、移动互联网和大数据兴起,传统 RDBMS 面临三大核心挑战:

  1. 海量数据规模:用户量从百万级跃升至十亿级,单机存储与计算成为瓶颈
  2. 超高并发写入:如社交动态、IoT 传感器数据,每秒数万甚至百万次写入
  3. 灵活多变的数据结构:用户生成内容(UGC)难以用固定表结构描述

在此背景下,Google(Bigtable)、Amazon(Dynamo)、Facebook(Cassandra)等公司率先研发新型数据库,催生了 NoSQL 运动。

3.4 四大主流类型详解

(1)文档型数据库(Document Store)
  • 数据模型:以类似 JSON/BSON 的嵌套文档存储,支持层级结构
  • 特点:Schema 灵活、支持反规范化、读写高效
  • 适用场景:内容管理、用户配置、产品目录、日志聚合
  • 代表系统:MongoDB、CouchDB、Firebase Firestore

示例(MongoDB 文档):

json 复制代码
{
  "_id": "user123",
  "name": "张三",
  "emails": ["zhang@example.com"],
  "profile": {
    "age": 30,
    "city": "北京",
    "preferences": { "theme": "dark", "lang": "zh-CN" }
  }
}
(2)键值型数据库(Key-Value Store)
  • 数据模型:最简单的 key → value 映射
  • 特点:极低延迟(微秒级)、超高吞吐,但查询能力极弱(仅支持 key 查询)
  • 适用场景:缓存、会话存储、计数器、排行榜、分布式锁
  • 代表系统:Redis(内存型)、Amazon DynamoDB(持久化)、Riak
(3)宽列型数据库(Wide-Column Store)
  • 数据模型:按"行键 + 列族 + 列限定符 + 时间戳"组织,类似稀疏表
  • 特点:列可动态增减,适合海量写入与时间序列分析
  • 适用场景:IoT 遥测、日志存储、推荐系统特征库、消息轨迹
  • 代表系统:Apache Cassandra、HBase、ScyllaDB
(4)图数据库(Graph Database)
  • 数据模型:节点(Node) + 边(Edge) + 属性(Property)
  • 特点:高效处理深度关联查询(如"六度人脉"、"欺诈环检测")
  • 适用场景:社交网络、知识图谱、反洗钱、路径规划、推荐引擎
  • 代表系统:Neo4j、Amazon Neptune、JanusGraph

第四部分:关系型 vs 非关系型 ------ 全维度深度对比

为科学选型,我们从 9 个核心维度进行系统对比:

维度 关系型数据库(RDBMS) 非关系型数据库(NoSQL)
数据模型 严格的二维表(行 × 列) 文档、键值、列族、图等多样模型
Schema 静态、强类型、需预定义 动态、弱类型、运行时可变(Schema-less)
事务支持 完整 ACID(跨表、跨行、跨语句) 多数仅支持单文档/单行事务;部分(如 MongoDB 4.0+、DynamoDB)支持有限 ACID
一致性模型 强一致性(Immediate Consistency) 最终一致性(Eventual Consistency)或可调一致性(Tunable)
扩展方式 垂直扩展(Scale-up)为主;分布式方案属 NewSQL 天然支持水平扩展(Scale-out),自动分片、复制、故障转移
查询能力 强大 SQL:支持 JOIN、子查询、聚合、窗口函数、CTE 等 查询受限;多数不支持跨文档 JOIN;依赖应用层关联或反规范化
典型延迟 毫秒级(复杂查询可能达百毫秒) 微秒级(简单 KV 操作)至毫秒级(复杂文档查询)
运维复杂度 单机部署简单;集群需中间件(如 Vitess、ShardingSphere) 分布式部署开箱即用,但调优(如副本数、一致性级别)较复杂
理论基础 ACID(保证正确性) CAP 定理(在 C 与 A 之间权衡)

补充:CAP 定理 vs ACID

  • ACID 是 RDBMS 的核心承诺,确保数据在任何情况下都保持正确。
  • CAP 定理 (Brewer's Theorem)指出:分布式系统无法同时满足 一致性 (Consistency)。
    • CP 系统(如 MongoDB 默认、HBase):优先保证一致性
    • AP 系统(如 Cassandra、DynamoDB 默认):优先保证可用性

注意:CAP 中的 "C"(Consistency)指线性一致性(Linearizability),比 ACID 中的 "C"(Consistency,指业务规则约束)更强。


第五部分:常见误解

❌ 误解1:"NoSQL 就是不要 SQL"

✅ 正解:许多 NoSQL 系统提供类 SQL 查询语言(如 Cassandra 的 CQL、ArangoDB 的 AQL),甚至支持标准 SQL(如 DynamoDB 的 PartiQL、Google BigQuery)。

❌ 误解2:"关系型数据库不能水平扩展"

✅ 正解:传统 RDBMS 确实难以分片,但 NewSQL 数据库 (如 TiDB、CockroachDB、YugabyteDB)已实现 分布式架构 + SQL + ACID + 自动分片,兼具两者优势。

❌ 误解3:"非关系型一定比关系型快"

✅ 正解:性能取决于场景。

  • 对于"获取用户及其最近10条订单",RDBMS 用 JOIN 一行 SQL 解决;
  • NoSQL 需多次查询 + 应用层拼接,反而更慢且易出错。

❌ 误解4:"非关系型没有结构"

✅ 正解:NoSQL 有结构,只是结构灵活(Schema-less ≠ Schema-free)。合理设计文档或列族结构仍是关键。


第六部分:实战选型指南 ------ 如何选择?

✅ 优先选择关系型数据库,如果:

  • 业务涉及强事务(如银行转账、库存扣减、订单支付)
  • 数据高度结构化且稳定(如员工信息、财务报表、合同)
  • 需要强一致性审计追踪(合规要求:GDPR、SOX)
  • 团队熟悉 SQL 和传统数据库工具链

✅ 优先选择非关系型数据库,如果:

  • 数据结构频繁变化或高度嵌套(如用户行为日志、设备遥测、UGC 内容)
  • 需处理PB 级数据百万 QPS 写入
  • 可接受最终一致性(如点赞数、推荐列表、缓存)
  • 要求自动故障转移全球多区域部署

🔁 推荐策略:混合持久化(Polyglot Persistence)

现代大型系统普遍采用多数据库协同架构

数据类型 推荐数据库 理由
用户账户、订单、支付 PostgreSQL / MySQL 强事务、强一致、成熟生态
会话、缓存、排行榜 Redis 微秒级响应,丰富数据结构
用户画像、文章内容 MongoDB 灵活文档、嵌套结构、高性能读写
社交关系、知识图谱 Neo4j 高效图遍历,Cypher 语言简洁
IoT 传感器日志 Cassandra / InfluxDB 高吞吐写入、时间序列优化

真实案例

  • Netflix:Cassandra(用户观看记录)、DynamoDB(元数据)、MySQL(账单)
  • Uber:PostgreSQL(核心交易)、Redis(缓存)、Schemaless(自研文档库)
  • 阿里:OceanBase(分布式 RDBMS)、Tablestore(宽表)、Tair(KV 缓存)

第七部分:未来趋势

随着技术演进,RDBMS 与 NoSQL 的界限日益模糊:

  • RDBMS 增强灵活性

    • PostgreSQL 支持 JSONB、全文检索、地理空间、自定义索引
    • MySQL 8.0 支持文档存储(JSON 类型)、CTE、窗口函数
  • NoSQL 增强一致性与事务

    • MongoDB 支持多文档 ACID 事务(4.0+)
    • DynamoDB 支持跨分区事务、全局表(多区域同步)
  • NewSQL 崛起

    • TiDB、CockroachDB、YugabyteDB 提供 SQL + 分布式 + ACID + 水平扩展
    • Google Spanner 实现全球强一致性(TrueTime + Paxos)
  • 多模型数据库(Multi-Model):

    • ArangoDB、Microsoft Azure Cosmos DB 同时支持文档、图、键值等多种模型

未来,数据库将不再是"关系 or 非关系"的二元选择,而是按需组合的多模态智能数据平台


结语:回到本质,理性选择

现在,我们可以清晰回答最初的问题:

什么是关系型数据库?什么是非关系型数据库?

  • 关系型数据库 :基于数学"关系"模型,用结构化表存储数据,强调一致性、事务、规范化的系统
  • 非关系型数据库 :突破关系模型限制,采用灵活数据模型 ,优先考虑扩展性、性能与可用性的系统。

"关系"不是指"数据有关联",而是指数据以数学关系的形式组织 ;"非关系"也不是"数据无关联",而是不依赖表+外键的传统建模方式

在实际工程中,没有银弹,只有权衡 。选择数据库,本质是在一致性、可用性、性能、开发效率、运维成本之间寻找最佳平衡点。

相关推荐
有什么东东2 小时前
山东大学软件学院2024-2025非关系型数据库背诵整理
数据库·nosql
ja哇2 小时前
NoSql数据库原理期末(课后思考题)
数据库·nosql
会开花的二叉树2 小时前
即时通讯系统核心模块实现
数据库·mysql·elasticsearch
少云清2 小时前
【接口测试】5_PyMySQL模块 _数据库工具类封装
数据库·pymysql
小光学长3 小时前
基于ssm旅游管理系统的开发与设计z050cft7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·旅游
兔丝3 小时前
ThinkPHP8 常见并发场景解决方案文档
redis·后端
剑之所向3 小时前
MCU开机按键,怎么避免抖动造成的开机
数据库·单片机·mongodb
lightningyang4 小时前
渗透入门之SQL 注入(二)
数据库·sql·渗透·sql注入
四谎真好看4 小时前
MySQL 学习笔记(运维篇1)
运维·数据库·笔记·学习·mysql·学习笔记