为什么要对数据库进行细分:从 RDBMS 到 12 类专用数据库的全景图


难度 中等
编写人 编写内容 编写时间
growdu 初稿,数据库细分全景:12 类专用数据库 + 各自代表 + 选型决策 2026-09-02

本文是「PostgreSQL 系列」的视角篇 · 三。配套源码版本:PostgreSQL 18 dev(~/cwork/postgresql)。同系列前文:

上一篇我们说:所有数据库都能给”基础能力”——CRUD、事务、索引、复制。那为什么我们还需要时序数据库、图数据库、文档数据库、向量数据库这一大堆”专用数据库”?

答案藏在一个朴素的观察里:

所有数据库都”能做”基础能力,但不是所有数据库都”做得好”特定场景

本文系统梳理当下 12 类数据库全景图:每一类为什么存在、典型代表是谁、什么场景该选、什么场景不该选。看完全文,你会有一张完整的”数据库地图”——未来遇到任何业务场景,都能在这张图上快速定位。


一、先想清楚:为什么数据库要细分

1.1 “一个数据库搞定一切”的失败史

flowchart LR 1960[1960s: 层次 / 网状 DB<br/>IDS, IMS]:::old 1970[1970s: 关系模型<br/>System R, Ingres]:::relational 1980[1980s: 商业 RDBMS<br/>Oracle, DB2, SQL Server]:::relational 1990[1990s: 对象 RDBMS<br/>失败]:::fail 2000[2000s: 互联网催生<br/>MySQL, Memcached, Lucene]:::emerging 2010[2010s: NoSQL 大爆发<br/>MongoDB, Cassandra, Redis]:::emerging 2020[2020s: 专用化与 AI<br/>ClickHouse, DuckDB, pgvector]:::emerging 1960 --> 1970 --> 1980 --> 1990 --> 2000 --> 2010 --> 2020 classDef old fill:#fce7f3,stroke:#be185d,color:#000 classDef relational fill:#dcfce7,stroke:#15803d,color:#000 classDef fail fill:#fef9c3,stroke:#a16207,color:#000 classDef emerging fill:#dbeafe,stroke:#1d4ed8,color:#000

1990 年代,对象关系型数据库(Object-Relational DB)曾经是”主流”——把面向对象和关系模型合二为一。但全部失败了(Oracle Objects、IBM DB2 UDB、Informix Universal Server…)。原因是:

  • 对象模型 + 关系模型两套范式互相干扰
  • 性能比纯 RDBMS 差,比纯 OODB 也差
  • 用户不会同时写两套

教训所有”统一一切”的尝试都失败了。真正成功的是专用化:每个数据库把一类问题做到极致。

1.2 细分的 3 个根本原因

flowchart TB C[数据库细分]:::title C1[1. 业务多样化]:::reason --> C C2[2. 数据模型多样化]:::reason --> C C3[3. 物理模型与访问模式多样化]:::reason --> C C1 --> D1["订单、社交、日志、推荐、IoT...<br/>业务场景百花齐放"] C2 --> D2["表格 / 文档 / 图 / 时间序列 / 向量...<br/>不同数据天生不同结构"] C3 --> D3["OLTP / OLAP / 实时 / 批量 / 单机 / 分布式<br/>不同访问模式需要不同存储引擎"] classDef title fill:#fce7f3,stroke:#be185d,color:#000 classDef reason fill:#dcfce7,stroke:#15803d,color:#000

原因 1:业务多样化

每个业务有自己的”灵魂数据结构”:

业务 灵魂数据结构 错选后果
订单 关系强、有外键、需要事务 用 MongoDB → 跨文档事务丢失,订单重复扣款
社交 图结构(人-关系-人) 用 RDBMS → 多表 join 慢到不可用
设备监控 时间序列 用 RDBMS → 索引膨胀,写入卡死
日志全文搜索 反向索引 + 分词 用 RDBMS → LIKE '%xx%' 全表扫
推荐系统 向量相似度 用 RDBMS → 1 亿向量两两算距离要算几年

原因 2:数据模型多样化

关系模型不是唯一真理——它只是被关系代数(Edgar Codd, 1970)建立得很好的一种模型。但其他模型在特定场景下更自然:

模型 优势 弱项
关系 (Table) 强 schema、事务、SQL 半结构化数据不灵活
文档 (JSON) 灵活 schema 跨文档事务弱
图 (Node/Edge) 关系遍历快 大规模聚合弱
时间序列 (Time-stamped) 高频写入、压缩 通用查询弱
向量 (Embedding) 相似度检索 通用业务查询弱
键值 (Key-Value) 极致简单、内存级延迟 不能 range scan

原因 3:物理模型与访问模式多样化

flowchart LR W[写入路径]:::w R[读取路径]:::r S[存储介质]:::s W --> W1[顺序写 vs 随机写] W --> W2[BTree 原地改 vs LSM 追加] R --> R1[点查 vs 范围扫 vs 全表扫] R --> R2[热数据 vs 冷数据] S --> S1[内存 vs SSD vs HDD] S --> S2[本地 vs 分布式] W1 --> OPT[每种组合<br/>需要专门优化] W2 --> OPT R1 --> OPT R2 --> OPT S1 --> OPT S2 --> OPT classDef w fill:#fce7f3,stroke:#be185d,color:#000 classDef r fill:#fef9c3,stroke:#a16207,color:#000 classDef s fill:#dbeafe,stroke:#1d4ed8,color:#000

反例:PG 用 BTree 索引 + Heap 文件 + 行存 = OLTP 通杀。但拿这个组合去跑 OLAP / 时序 / 向量检索,都不是最优——所以出现专用数据库。


二、12 类数据库全景图

数据库类型到底有多少种?按数据模型 + 物理模型划分,目前有 12 大类:

flowchart TB DB[数据库全景 12 类]:::title DB1["1. RDBMS 关系型<br/>PG / MySQL / Oracle / SQL Server"]:::cat DB2["2. 时序 TSDB<br/>InfluxDB / TimescaleDB / TDengine / Prometheus"]:::cat DB3["3. 图数据库 Graph<br/>Neo4j / TigerGraph / JanusGraph / Memgraph"]:::cat DB4["4. 文档 Document<br/>MongoDB / Couchbase / FerretDB"]:::cat DB5["5. 键值 KV<br/>Redis / DynamoDB / etcd / LevelDB"]:::cat DB6["6. 列存 Column<br/>ClickHouse / DuckDB / Apache Druid"]:::cat DB7["7. 搜索引擎 Search<br/>Elasticsearch / OpenSearch / Meilisearch"]:::cat DB8["8. 向量 Vector<br/>Milvus / Qdrant / Weaviate / pgvector"]:::cat DB9["9. 嵌入式 Embedded<br/>SQLite / DuckDB / LevelDB / RocksDB"]:::cat DB10["10. 多模 Multi-model<br/>ArangoDB / CosmosDB / SurrealDB"]:::cat DB11["11. 地理 GIS<br/>PostGIS / MongoDB Geo / Neo4j Spatial"]:::cat DB12["12. 数据仓库 Data Warehouse<br/>Snowflake / BigQuery / Redshift / Doris"]:::cat DB --- DB1 & DB2 & DB3 & DB4 & DB5 & DB6 & DB7 & DB8 & DB9 & DB10 & DB11 & DB12 classDef title fill:#fce7f3,stroke:#be185d,color:#000 classDef cat fill:#dcfce7,stroke:#15803d,color:#000

下面逐类详解——为什么存在、典型代表、什么场景该选。


三、RDBMS:关系型数据库 —— 一切的基础

3.1 为什么存在

1970 年 Edgar Codd 提出关系模型,奠定了 SQL/ACID/事务三大基石。**这是数据库的”母语”**——所有其他数据库在某种程度上都在和 RDBMS 兼容或竞争。

3.2 典型代表

数据库 起源 优势 适用
PostgreSQL 1986 UCB 功能最全、扩展最强、SQL 标准 90% 业务的默认选项
MySQL 1995 Sweden 简单可靠、Web 生态成熟 读多写少 OLTP
Oracle 1977 IBM→Larry Ellison 极致性能、商业支持 大型金融、政府
SQL Server 1989 Microsoft Windows 集成、BI 一体 .NET 企业
MariaDB 2009 MySQL fork MySQL 兼容 + 新特性 MySQL 用户替代
TiDB / CockroachDB 2015/2015 分布式 SQL 超大规模 OLTP

3.3 核心能力

flowchart TB R[RDBMS 核心能力]:::r R1["ACID 事务"]:::sub --> R R2["SQL 标准"]:::sub --> R R3["强 schema 约束"]:::sub --> R R4["JOIN 多表"]:::sub --> R R5["二级索引"]:::sub --> R R6["视图 / 触发器 / 存储过程"]:::sub --> R classDef r fill:#fce7f3,stroke:#be185d,color:#000 classDef sub fill:#dcfce7,stroke:#15803d,color:#000

3.4 何时该选

  • 强事务需求:订单、库存、金融
  • 复杂业务逻辑:多表关联、嵌套查询
  • 强数据一致性:不能容忍脏读 / 幻读
  • 标准 SQL 兼容:BI 工具、ORM 友好

3.5 何时不该选

  • TB 级分析扫描(选列存)
  • 图遍历(选图数据库)
  • 时序高频写入(选 TSDB)
  • 灵活 schema(选文档数据库)

四、TSDB:时序数据库 —— 设备监控与指标的世界

4.1 为什么存在

时序数据有独特的特征:

  • 每条数据都有时间戳
  • 写入是追加为主,很少更新
  • 查询通常是”某段时间范围内某指标”
  • 数据冷热分明:最新数据查询多,老数据几乎不查
  • 数据量极大:单设备 1 Hz 采样 = 31M 行 / 年

RDBMS 应对这些特征非常糟糕

  • BTree 索引膨胀(每条数据一个索引项)
  • 写入吞吐受限
  • 旧数据清理靠 DELETE,锁表 + 碎片

TSDB 的针对性优化

flowchart LR TS["时序数据"]:::in TSDB["TSDB 优化"]:::opt T1["写入:append-only"]:::feat --> TSDB T2["压缩:delta-of-delta + XOR"]:::feat --> TSDB T3["降采样:1s → 1m → 1h 自动"]:::feat --> TSDB T4["数据生命周期:自动删除 / 降精度"]:::feat --> TSDB T5["标签索引:高效过滤"]:::feat --> TSDB TS --> T1 & T2 & T3 & T4 & T5 classDef in fill:#fce7f3,stroke:#be185d,color:#000 classDef opt fill:#dcfce7,stroke:#15803d,color:#000 classDef feat fill:#fef9c3,stroke:#a16207,color:#000

4.2 典型代表

数据库 起源 优势 适用
InfluxDB 2013 InfluxData TSDB 标杆,类 SQL 语法 通用监控
TimescaleDB 2017 Timescale PG 扩展,SQL 兼容 想用 PG 又要 TSDB 性能
TDengine 2019 涛思 国人开发、极致压缩 国产化场景
Prometheus 2012 CNCF 监控领域事实标准 K8s / 微服务监控
OpenTSDB 2010 StumbleUpon 基于 HBase 大规模时序
QuestDB 2014 QuestDB 高吞吐 SQL 金融时序

4.3 TimescaleDB 与 InfluxDB 的对比

flowchart LR TS["TimescaleDB"]:::pg --> P1["PG 扩展<br/>继承 PG 生态"] TS --> P2["SQL 完整<br/>JOIN 友好"] TS --> P3["自动分区<br/>hypertable"] IF["InfluxDB"]:::inf --> I1["自研引擎<br/>类 SQL(Flux)"] IF --> I2["极致压缩<br/>10x 节省"] IF --> I3["内置降采样<br/>continuous queries"] classDef pg fill:#dcfce7,stroke:#15803d,color:#000 classDef inf fill:#fef9c3,stroke:#a16207,color:#000

选择规则

  • 团队熟 PG、需要 JOIN → TimescaleDB
  • 数据量极大、纯时序 → InfluxDB / TDengine
  • K8s 监控 → Prometheus

4.4 何时该选

  • 设备 / 服务器监控
  • 金融行情、K 线
  • IoT 传感器数据
  • 应用指标(APM)

4.5 何时不该选

  • 数据之间强关联(应该用 RDBMS)
  • 业务事务复杂(应该用 RDBMS)
  • 数据非时间序列(用错了)

五、Graph:图数据库 —— 关系的世界

5.1 为什么存在

图数据无处不在:

flowchart LR A[你]:::n --> B[好友 1]:::n A --> C[好友 2]:::n B --> D[同事]:::n C --> D D --> E[公司]:::n A --> F[你关注的人]:::n classDef n fill:#dcfce7,stroke:#15803d,color:#000

6 度分隔理论:地球上任何两个人,最多通过 6 个人就能联系上。这种关系链查询用 RDBMS 是噩梦:

-- "你好友的好友关注的人" 在 PG 里要 5-6 层 JOIN
WITH RECURSIVE ...

每跳一次都是 N² 数据量。社交网络几跳就崩。

图数据库的核心遍历(traversal)操作复杂度只跟邻居数相关,不跟全图规模相关

5.2 典型代表

数据库 起源 优势 适用
Neo4j 2007 Neo4j Inc 图数据库标杆,Cypher 查询语言 通用图查询
TigerGraph 2012 TigerGraph 极致性能,企业级 超大规模图分析
JanusGraph 2017 Linux Foundation 兼容 TinkerPop,开源 大数据图
Memgraph 2017 Memgraph 内存级速度,Neo4j 兼容 实时图
NebulaGraph 2019 字节跳动 国产、PB 级 大规模图
Amazon Neptune 2018 AWS 云原生、托管 AWS 生态

5.3 图数据库的两大模型

flowchart TB G[图数据库模型]:::g G1["Property Graph<br/>属性图<br/>Neo4j / TigerGraph / JanusGraph"]:::m --> G G2["RDF Triple<br/>三元组<br/>Jena / Stardog / Blazegraph"]:::m --> G G1 --> F1["(节点)-[边 {属性}]->(节点)<br/>直观"] G2 --> F2["主语 - 谓语 - 宾语<br/>语义网标准"] classDef g fill:#fce7f3,stroke:#be185d,color:#000 classDef m fill:#dcfce7,stroke:#15803d,color:#000

属性图更适合 90% 业务图场景。RDF 更适合知识图谱、语义搜索。

5.4 何时该选

  • 社交网络、好友推荐
  • 知识图谱、实体关系
  • 欺诈检测(识别循环转账)
  • 供应链关系
  • 网络安全(攻击路径分析)

5.5 何时不该选

  • 简单 CRUD(用 RDBMS)
  • 数据是表格形状(用 RDBMS)
  • 主要是聚合统计(用 OLAP)

六、Document:文档数据库 —— 灵活 schema 的世界

6.1 为什么存在

业务需求变化快,schema 经常改:

{
  "user_id": 12345,
  "name": "Alice",
  "email": "alice@example.com",
  "preferences": {
    "theme": "dark",
    "language": "zh-CN",
    "notifications": {
      "email": true,
      "sms": false,
      "push": true
    }
  },
  "tags": ["vip", "early-adopter"],
  "login_history": [
    {"ip": "1.2.3.4", "ts": "2026-08-15T10:30:00Z"},
    {"ip": "5.6.7.8", "ts": "2026-08-16T14:20:00Z"}
  ]
}

这种嵌套、半结构化数据用 RDBMS 要么塞 JSON 字段(查询难)、要么拆 5 张表(应用代码复杂)。

文档数据库就是为这种数据而生——一个 JSON 文档就是一行。

6.2 典型代表

数据库 起源 优势 适用
MongoDB 2009 MongoDB Inc 文档数据库标杆、生态最成熟 通用文档存储
Couchbase 2011 Couchbase 内存级性能、SQL 兼容 实时查询 + 缓存
FerretDB 2022 FerretDB PG 协议,跑 PG 上面 想用 PG 但要 MongoDB 灵活
RavenDB 2010 Hibernating Rhinos .NET 生态 .NET 企业
Amazon DocumentDB 2019 AWS MongoDB 兼容、托管 AWS 用户

6.3 文档数据库的两大误区

flowchart LR M[误区]:::m M1[1. 文档数据库 = 替代 RDBMS]:::sub --> M M2[2. 无 schema = 不需要设计]:::sub --> M M1 -.-> FIX1["事务弱、跨文档 join 差<br/>订单系统千万别用"] M2 -.-> FIX2["schema 设计照样重要<br/>只是更灵活"] classDef m fill:#fce7f3,stroke:#be185d,color:#000 classDef sub fill:#fef9c3,stroke:#a16207,color:#000

6.4 何时该选

  • 半结构化数据(用户资料、产品目录、内容管理)
  • schema 经常变化(创业初期)
  • 文档级事务够用(不需要跨文档)
  • 团队熟悉 JSON / JS

6.5 何时不该选

  • 强事务、跨文档(订单、金融)→ RDBMS
  • 复杂聚合(BI 报表)→ OLAP
  • 图关系 → 图数据库

七、KV:键值数据库 —— 极简的极致

7.1 为什么存在

键值(Key-Value)是最简单、最快的数据模型:

flowchart LR K[Key]:::k --> V[Value]:::v K1["user:12345"]:::k1 --> V1["{json}"]:::v1 K2["session:abc123"]:::k2 --> V2["{json}"]:::v2 K3["cache:product:99"]:::k3 --> V3["{json}"]:::v3 classDef k fill:#fce7f3,stroke:#be185d,color:#000 classDef v fill:#dcfce7,stroke:#15803d,color:#000 classDef k1 fill:#fef9c3,stroke:#a16207,color:#000 classDef v1 fill:#fef9c3,stroke:#a16207,color:#000 classDef k2 fill:#dbeafe,stroke:#1d4ed8,color:#000 classDef v2 fill:#dbeafe,stroke:#1d4ed8,color:#000 classDef k3 fill:#dcfce7,stroke:#15803d,color:#000 classDef v3 fill:#dcfce7,stroke:#15803d,color:#000

复杂度只有 3 个操作GET / SET / DEL。其他都是花活。

7.2 典型代表

数据库 起源 优势 适用
Redis 2009 Salvatore Sanfilippo 缓存之王,丰富数据结构 缓存、队列、限流
Memcached 2003 LiveJournal 极致简单、稳定 纯缓存
DynamoDB 2012 AWS 云原生、自动扩缩 AWS 用户 KV
etcd 2013 CoreOS K8s 事实标准,强一致 服务发现、配置中心
LevelDB 2011 Google 嵌入式、轻量 嵌入式 KV
RocksDB 2013 Facebook LevelDB 升级版,LSM 引擎 嵌入式 KV 引擎
TiKV 2016 PingCAP 分布式 KV,Raft 一致性 分布式系统底座

7.3 Redis 的数据结构不只是 KV

flowchart TB R[Redis 数据结构]:::r R1[String: GET / SET / INCR]:::d --> R R2[List: LPUSH / RPOP]:::d --> R R3[Set: SADD / SINTER]:::d --> R R4[Hash: HSET / HGET]:::d --> R R5[Sorted Set: ZADD / ZRANGE]:::d --> R R6[Stream: XADD / XREAD]:::d --> R R7[Bitmap / HyperLogLog / Geo]:::d --> R classDef r fill:#fce7f3,stroke:#be185d,color:#000 classDef d fill:#dcfce7,stroke:#15803d,color:#000

**Redis 是”KV 外壳,多结构内核”**——表面是 KV,实质是多结构内存数据库。

7.4 何时该选

  • 缓存(任何 RDBMS 都该有一个 Redis 配合)
  • 会话存储(session)
  • 消息队列(list / stream)
  • 限流 / 计数器(INCR)
  • 分布式锁(SET NX)
  • 配置中心(etcd)

7.5 何时不该选

  • 需要事务 → RDBMS
  • 需要范围查询(KV 不擅长)→ RDBMS / 时序
  • 需要持久化(Redis 是内存的)→ RDBMS(虽然 Redis 也支持 RDB / AOF)

八、Column:列存数据库 —— 扫描的极致

8.1 为什么存在

RDBMS 用行存(Row Store):每行的所有列存在一起。适合 OLTP(取整行)。

OLAP 经常只关心少数几列——“过去 7 天所有订单的金额总和” 只关心 amount 一列。

flowchart LR subgraph ROW["行存:所有列连续存储"] R1[id=1, name=alice, age=30, city=BJ]:::row R2[id=2, name=bob, age=25, city=SH]:::row R3[id=3, name=carol, age=28, city=GZ]:::row end subgraph COL["列存:每列独立存储"] C1[id: 1, 2, 3]:::col C2[name: alice, bob, carol]:::col C3[age: 30, 25, 28]:::col end Q["SELECT avg(age) FROM t"]:::q Q -. "扫整表(行存)" .-> ROW Q -. "只读 age 列(列存)" .-> COL classDef row fill:#fef9c3,stroke:#a16207,color:#000 classDef col fill:#dcfce7,stroke:#15803d,color:#000 classDef q fill:#fce7f3,stroke:#be185d,color:#000

真实性能差异:扫描 1 亿行 10 列但只读 1 列,列存比行存快 100-1000 倍

8.2 典型代表

数据库 起源 优势 适用
ClickHouse 2016 Yandex OLAP 之王,极致压缩比 日志、用户行为、ad-hoc
DuckDB 2019 CWI 嵌入式 OLAP,单文件 数据科学、本地分析
Apache Druid 2011 Metamarkets 实时 OLAP 实时大屏
StarRocks 2020 DorisDB fork PG 协议、毫秒级延迟 实时数仓
Apache Doris 2017 百度 PG/MySQL 协议 大数据 OLAP
MonetDB 1992 CWI 列存学术派 研究

8.3 列存的 4 个核心优化

优化 原理 收益
向量化执行 CPU SIMD 一次算一批值 5-10x
压缩 同列数据相似,压缩比高 10x 节省 + 缓存友好
预聚合 物化视图 / rollup table 减少扫描
索引稀疏化 跳数索引(min/max) 跳过无关块

8.4 何时该选

  • 日志分析(Kafka → ClickHouse)
  • 用户行为分析
  • 报表 BI
  • 实时大屏(分钟级数据更新)
  • 数据科学本地分析(DuckDB)

8.5 何时不该选

  • 点查 / 单行 UPDATE → RDBMS
  • 强事务 → RDBMS
  • 小数据量(GB 级) → RDBMS 完全够

九、Search Engine:搜索引擎 —— 全文检索的极致

9.1 为什么存在

全文搜索有独特的需求:

flowchart TB S[全文搜索需求]:::s S1["分词<br/>中文 = 切词"]:::f --> S S2["倒排索引<br/>词 → 文档列表"]:::f --> S S3["相关度评分<br/>TF-IDF / BM25"]:::f --> S S4["高亮 / 聚合 / suggest"]:::f --> S S5["模糊搜索<br/>typo tolerance"]:::f --> S classDef s fill:#fce7f3,stroke:#be185d,color:#000 classDef f fill:#dcfce7,stroke:#15803d,color:#000

RDBMS 全文搜索很弱(MySQL FULLTEXT、PG to_tsvector),搜索引擎专为这些场景设计

9.2 典型代表

数据库 起源 优势 适用
Elasticsearch 2010 Shay Banon 搜索引擎事实标准 全文搜索、日志分析
OpenSearch 2021 AWS(ES fork) ES 兼容、AWS 托管 AWS 用户
Meilisearch 2018 Meilisearch 极简、毫秒级 应用内搜索
Typesense 2018 Typesense typo-tolerant、即时搜索 电商搜索
Apache Solr 2004 Apache 老牌、企业级 大型搜索
Manticore Search 2017 ES 兼容、轻量 ES 替代

9.3 ES 为什么会成为”日志分析”的事实标准

flowchart LR APP[应用]:::app --> LOG[日志文件]:::log LOG --> FB[Filebeat / Fluentd]:::fb FB --> ES[(Elasticsearch)]:::es ES --> K[Grafana / Kibana]:::k classDef app fill:#fce7f3,stroke:#be185d,color:#000 classDef log fill:#fef9c3,stroke:#a16207,color:#000 classDef fb fill:#dbeafe,stroke:#1d4ed8,color:#000 classDef es fill:#dcfce7,stroke:#15803d,color:#000 classDef k fill:#fce7f3,stroke:#be185d,color:#000

ELK / EFK 栈(Elasticsearch + Logstash/Filebeat + Kibana)几乎是云原生日志的事实标准——因为:

  • ES 写入快(近实时索引)
  • 全文搜索 + 聚合查询都强
  • Kibana 可视化开箱即用

9.4 何时该选

  • 应用内搜索(电商、内容)
  • 日志聚合分析
  • 监控系统(Prometheus + ES)
  • 任何需要全文检索 + 模糊搜索

9.5 何时不该选

  • 结构化数据 + 强事务 → RDBMS
  • TB 级离线分析 → 列存 OLAP
  • 极简场景(搜几百条记录)→ PG 全文检索够用

十、Vector:向量数据库 —— AI 时代的入场券

10.1 为什么存在

AI / 大模型时代的特征:

  • 文本 / 图片 / 视频都被编码成高维向量(512 / 1024 / 1536 维)
  • 查询不是”精确匹配”,而是”找最相似的 K 个“(KNN)
flowchart LR Q[查询向量<br/>embedding]:::q --> S[向量数据库]:::s S --> K[Top K 相似向量]:::k K --> R[原始数据]:::r Q1["0.1, 0.3, 0.5, ..."]:::q1 --> S1[ANN 索引<br/>HNSW / IVF]:::s S1 --> K1[3 个最近邻]:::k1 K1 --> R1["文档 1 / 文档 5 / 文档 9"]:::r1 classDef q fill:#fce7f3,stroke:#be185d,color:#000 classDef s fill:#dcfce7,stroke:#15803d,color:#000 classDef k fill:#fef9c3,stroke:#a16207,color:#000 classDef r fill:#dbeafe,stroke:#1d4ed8,color:#000 classDef q1 fill:#fce7f3,stroke:#be185d,color:#000 classDef s1 fill:#dcfce7,stroke:#15803d,color:#000 classDef k1 fill:#fef9c3,stroke:#a16207,color:#000 classDef r1 fill:#dbeafe,stroke:#1d4ed8,color:#000

RDBMS 不能做 KNN:100 万向量两两算距离 = 10^12 次浮点运算,CPU 跑几年。

向量数据库的解法HNSW(Hierarchical Navigable Small World)图索引,把搜索从 O(N) 降到 O(log N)。

10.2 典型代表

数据库 起源 优势 适用
Milvus 2019 Zilliz 向量库标杆,PB 级 大规模向量
Qdrant 2021 Qdrant Rust 实现、高性能 中等规模向量
Weaviate 2019 SeMI 模块化、混合搜索 AI 应用
Pinecone 2019 Pinecone 云原生 SaaS 不想自建
Chroma 2023 Chroma 轻量、Python 友好 原型开发
pgvector 2023 PG 扩展 PG 原生,无需新 DB 小到中等规模

10.3 pgvector 与 Milvus 的对比

flowchart LR P[pgvector]:::pg --> P1[PG 生态<br/>SQL 完整] P --> P2[中等规模<br/>~1000 万向量] P --> P3[无需新数据库] M[Milvus]:::m --> M1[专用引擎<br/>极致性能] M --> M2[大规模<br/>~10 亿向量] M --> M3[独立部署<br/>运维复杂] classDef pg fill:#dcfce7,stroke:#15803d,color:#000 classDef m fill:#fef9c3,stroke:#a16207,color:#000

选择规则

  • 数据规模 < 1000 万向量 → pgvector(与 PG 一起用,省事)
  • 数据规模 > 1 亿向量 → Milvus / Qdrant
  • 想 SaaS → Pinecone

10.4 何时该选

  • RAG(检索增强生成)
  • 图像检索
  • 推荐系统
  • 语义搜索
  • 重复图片检测

10.5 何时不该选

  • 传统精确查询(按 ID / 状态)→ RDBMS
  • 全表扫描 → 列存 OLAP
  • 数据规模太小(几千条) → 直接遍历

十一、Embedded:嵌入式数据库 —— 装进 App 的数据库

11.1 为什么存在

**不是每个应用都需要”数据库服务器”**:

flowchart LR APP[应用进程]:::app --> E[嵌入式 DB]:::e APP1[移动 App]:::app1 --> E1[SQLite]:::e APP2[浏览器]:::app2 --> E2[IndexedDB]:::e APP3[游戏]:::app3 --> E3[SQLite / Realm]:::e APP4[CLI 工具]:::app4 --> E4[DuckDB]:::e APP5[单文件脚本]:::app5 --> E5[SQLite / DuckDB]:::e classDef app fill:#fce7f3,stroke:#be185d,color:#000 classDef e fill:#dcfce7,stroke:#15803d,color:#000 classDef app1 fill:#fce7f3,stroke:#be185d,color:#000 classDef e1 fill:#dcfce7,stroke:#15803d,color:#000

11.2 典型代表

数据库 起源 优势 适用
SQLite 2000 D. Richard Hipp 嵌入式之王,单文件 移动 App、桌面 App
DuckDB 2019 CWI 嵌入式 OLAP 数据科学、单文件分析
LevelDB 2011 Google K/V,嵌入式 嵌入式 KV
RocksDB 2013 Facebook LevelDB 升级版 高性能嵌入式
Realm 2014 MongoDB Inc 移动端文档数据库 移动 App
BoltDB 2013 Ben Johnson Go 原生 KV Go 嵌入式 KV
LMDB 2011 Symas 极致轻量、mmap 嵌入式场景

11.3 SQLite 的”统治力”

SQLite 是部署量最大的数据库——超过所有其他数据库之和:

  • Android / iOS 系统自带
  • 浏览器、操作系统内置
  • 几乎所有桌面 App
  • 单文件零配置,10 MB 内存就能跑

11.4 何时该选

  • 移动 App(必选 SQLite)
  • 桌面应用、本地工具
  • 嵌入式设备
  • 单文件数据分析(DuckDB)
  • 测试环境替代真 PG

11.5 何时不该选

  • 多客户端(嵌入式 = 单进程)→ 真正的服务器 DB
  • 高并发写(SQLite 写是串行)→ RDBMS
  • TB 级数据 → 服务器 DB

十二、Multi-model:多模数据库 —— 一个 DB 多接口

12.1 为什么存在

现实业务往往有多种数据

flowchart TB M[多模数据库]:::m M1[订单: 关系]:::d --> M M2[用户画像: 文档]:::d --> M M3[关系网络: 图]:::d --> M M4[时间序列: 时序]:::d --> M M -.-> Q["一个查询<br/>混合多种数据"] classDef m fill:#fce7f3,stroke:#be185d,color:#000 classDef d fill:#dcfce7,stroke:#15803d,color:#000

多模数据库想”一个 DB 处理所有”——文档 + 图 + KV + 关系。

12.2 典型代表

数据库 起源 优势 适用
ArangoDB 2015 ArangoDB Inc 多模 + 强一致 通用多模
SurrealDB 2022 SurrealDB 新一代多模 + SQL AI / 实时应用
CosmosDB 2017 Microsoft Azure 原生,全球分布 Azure 用户
FaunaDB 2017 Fauna 强一致 + 全球分布 Serverless
OrientDB 2010 (被 ArangoDB 收购) 多模 + 图 历史项目

12.3 多模的”诱惑 vs 现实”

flowchart LR P[多模诱惑]:::p --> F[多模的 3 个现实问题]:::f P1["一个 DB<br/>搞定一切"]:::sub --> P P2["数据统一<br/>避免 ETL"]:::sub --> P P3["运维成本低"]:::sub --> P F1["每种模型都比专用 DB 弱"]:::warn --> F F2["混合查询<br/>优化器复杂"]:::warn --> F F3["绑定厂商<br/>迁移困难"]:::warn --> F classDef p fill:#dcfce7,stroke:#15803d,color:#000 classDef f fill:#fce7f3,stroke:#be185d,color:#000 classDef sub fill:#fef9c3,stroke:#a16207,color:#000 classDef warn fill:#fef9c3,stroke:#a16207,color:#000

12.4 何时该选

  • 业务数据真的多模(且不想维护多套 DB)
  • Azure / Fauna 等托管服务(运维省心)
  • 中等规模(性能要求不极致)

12.5 何时不该选

  • 单一数据模型为主(用专用 DB)
  • 极致性能(专用 DB 永远更快)
  • 避免厂商锁定(开源 PG + 专用 DB 更好)

十三、GIS:地理信息数据库 —— 地图与位置的世界

13.1 为什么存在

地理数据有自己的特点:

flowchart TB G[地理数据]:::g G1[点 / 线 / 多边形]:::f --> G G2[球面距离<br/>不是欧氏距离]:::f --> G G3[空间索引<br/>RTree / QuadTree]:::f --> G G4[坐标系转换<br/>WGS84 / GCJ-02 / BD-09]:::f --> G classDef g fill:#fce7f3,stroke:#be185d,color:#000 classDef f fill:#dcfce7,stroke:#15803d,color:#000

13.2 典型代表

数据库 起源 优势 适用
PostGIS 2001 Refractions PG 上的 GIS 之王,开源事实标准 通用 GIS
MongoDB Geo 2010 文档数据库 + 地理 简单 LBS
Neo4j Spatial 2014 Neo4j 图数据库 + 地理 路径规划
Oracle Spatial 2000 Oracle 商业级 GIS 大型企业
SQL Server Spatial 2008 MS Windows 集成 GIS .NET 企业
CartoDB 2012 Carto 可视化 GIS 云服务 业务地图

13.3 PostGIS 为什么是事实标准

flowchart LR P[PostGIS]:::pg P1["PG 的 600+ 函数"]:::f --> P P2["OGC 标准"]:::f --> P P3["Raster / Vector / Topology"]:::f --> P P4["pgrouting 路径规划"]:::f --> P P5["丰富生态<br/>QGIS / Mapbox / GDAL"]:::f --> P classDef pg fill:#dcfce7,stroke:#15803d,color:#000 classDef f fill:#fef9c3,stroke:#a16207,color:#000

13.4 何时该选

  • LBS 应用(外卖、地图、导航)
  • 物流调度、配送路径
  • 物联网设备位置
  • 城市规划、交通分析

13.5 何时不该选

  • 简单”省市区”字典(用普通表)
  • 海量 GPS 轨迹 + 时序特征(用 TSDB)

十四、Data Warehouse:数据仓库 —— 决策的底层

14.1 为什么存在

数据仓库和 OLTP 是两种完全不同的存在:

维度 OLTP Data Warehouse
目标 支撑业务运行 支撑管理决策
数据 当前的、详细的 历史的、聚合的
用户 应用 / 用户 分析师 / 高管
查询 简单、点查 复杂、聚合
数据量 GB ~ TB TB ~ PB
flowchart LR SRC[业务系统 OLTP]:::src --> ETL[ETL 抽取]:::etl ETL --> WH[(数据仓库)]:::wh WH --> BI[BI 工具]:::bi WH --> DS[数据科学]:::ds WH --> AI[AI 训练]:::ai classDef src fill:#fce7f3,stroke:#be185d,color:#000 classDef etl fill:#fef9c3,stroke:#a16207,color:#000 classDef wh fill:#dcfce7,stroke:#15803d,color:#000 classDef bi fill:#dbeafe,stroke:#1d4ed8,color:#000 classDef ds fill:#dbeafe,stroke:#1d4ed8,color:#000 classDef ai fill:#dbeafe,stroke:#1d4ed8,color:#000

14.2 典型代表

数据库 起源 优势 适用
Snowflake 2012 Snowflake 云数仓标杆,存算分离 企业云数仓
BigQuery 2010 Google 无服务器、按查询字节付费 GCP 生态
Redshift 2012 AWS AWS 原生、便宜 AWS 用户
Databricks SQL 2013 Databricks 湖仓一体 大数据 + AI
ClickHouse Cloud 2024 ClickHouse Inc 极致 OLAP 实时分析
Apache Doris 2017 百度 PB 级实时 国产实时数仓
StarRocks 2020 DorisDB fork 实时数仓 国产替代
Teradata 1979 Teradata 老牌数仓 大型国企

14.3 云数仓的 3 个创新

flowchart TB I[云数仓创新]:::i I1[1. 存算分离<br/>独立扩]:::sub --> I I2[2. 按需付费<br/>按扫描字节]:::sub --> I I3[3. 多云部署<br/>数据共享]:::sub --> I I1 -.-> B1[存储便宜、算力贵<br/>分工独立扩] I2 -.-> B2[无需预留资源<br/>空闲 0 成本] I3 -.-> B3[Snowflake 数据共享<br/>不复制数据] classDef i fill:#fce7f3,stroke:#be185d,color:#000 classDef sub fill:#dcfce7,stroke:#15803d,color:#000

14.4 何时该选

  • 企业级 BI 报表(高管驾驶舱)
  • 历史数据分析(> 1 年)
  • 跨业务数据整合(财务 + 销售 + 运营)
  • 大模型训练数据准备

14.5 何时不该选

  • 实时 OLTP(用 RDBMS)
  • 小数据量(用 RDBMS / DuckDB)
  • 强烈定制 ETL(自己写 pipeline)

十五、12 类数据库横向对比矩阵

把所有维度放在一张表里:

类别 数据模型 主要查询 强项 弱项 代表 何时选
RDBMS 表 + 行 SQL 事务、JOIN、成熟 PB 扩展、特殊查询 PG / MySQL 90% 业务默认
TSDB 时间戳 + 标签 范围 + 标签过滤 高频写入、压缩 通用查询弱 InfluxDB / TimescaleDB 监控、IoT
Graph 节点 + 边 遍历 关系查询 聚合、大规模 Neo4j / TigerGraph 社交、知识图谱
Document JSON 文档 文档查询 灵活 schema 跨文档事务 MongoDB 半结构化
KV Key-Value GET / SET 极致简单、快 范围查询弱 Redis / etcd 缓存、配置
Column 列存 聚合、扫描 大数据量分析 点查、UPDATE ClickHouse / DuckDB BI、报表
Search 反向索引 全文 / 模糊 搜索 + 聚合 写入弱 ES / Meilisearch 全文、日志
Vector 高维向量 KNN / 相似度 AI 时代必备 通用查询弱 Milvus / pgvector RAG、推荐
Embedded 各种 本地 零部署、嵌入 单进程 SQLite / DuckDB 移动 App
Multi-model 多种 多种 一个 DB 多用 每种弱 ArangoDB / CosmosDB 不想多套 DB
GIS 几何 空间查询 距离、包含 通用查询弱 PostGIS 地图、LBS
Data Warehouse 各种 SQL + 大规模 历史分析、PB 级 实时写入弱 Snowflake / BigQuery BI、决策

十六、选型决策树:从业务到数据库

flowchart TB Q[业务需求]:::q Q --> Q1{数据是<br/>表格?} Q --> Q2{数据是<br/>图?} Q --> Q3{数据是<br/>时间序列?} Q --> Q4{数据是<br/>文档?} Q --> Q5{数据是<br/>高维向量?} Q --> Q6{数据是<br/>键值对?} Q1 -->|是, 强事务| A1["RDBMS<br/>PG / MySQL"] Q1 -->|是, 大数据量| A2["列存<br/>ClickHouse"] Q2 -->|是| A3["Graph DB<br/>Neo4j"] Q3 -->|是| A4["TSDB<br/>InfluxDB"] Q4 -->|是| A5["Document<br/>MongoDB"] Q5 -->|是, 大规模| A6["Vector<br/>Milvus"] Q5 -->|是, 小规模| A61["pgvector"] Q6 -->|是| A7["KV<br/>Redis / etcd"] Q -.->|"需要全文搜?"| B1["Search<br/>ES"] Q -.->|"需要嵌入 App?"| B2["Embedded<br/>SQLite"] Q -.->|"GIS / 地图?"| B3["PostGIS"] Q -.->|"PB 级 BI?"| B4["Data Warehouse<br/>Snowflake"] classDef q fill:#fce7f3,stroke:#be185d,color:#000

十七、3 个真实场景的数据库组合

17.1 场景 1:电商 SaaS

flowchart LR APP[应用]:::app --> PG[(PostgreSQL<br/>订单 / 用户)]:::pg APP --> REDIS[(Redis<br/>缓存 / 队列)]:::redis APP --> CH[(ClickHouse<br/>BI 报表)]:::ch APP --> ES[(Elasticsearch<br/>商品搜索)]:::es PG -.->|逻辑复制| CH PG -.->|CDC| ES

5 个数据库,每个专攻一个领域。这是真实生产架构。

17.2 场景 2:AI 应用(RAG)

flowchart LR USER[用户问题]:::user --> EMB[Embedding 模型]:::emb EMB --> V[(Milvus<br/>向量检索)]:::v V --> TOP[Top K 文档]:::top TOP --> LLM[LLM<br/>GPT-4 / Claude]:::llm LLM --> ANSWER[回答]:::ans USER -.->|元数据| PG[(PostgreSQL<br/>用户 / 文档元数据)]:::pg classDef user fill:#fce7f3,stroke:#be185d,color:#000

Milvus + PG 是 RAG 标配——向量检索 + 元数据管理。

17.3 场景 3:物联网监控

flowchart LR DEV[百万设备]:::dev --> MQTT[MQTT broker]:::mqtt MQTT --> TS[(TDengine<br/>时序数据)]:::ts TS --> GRAF[Grafana 仪表盘]:::g TS --> ALERT[告警系统]:::alert

TDengine 单 DB 搞定——专为 IoT 设计。


十八、12 类数据库的”哲学图谱”

flowchart TB P[12 类数据库的工程哲学]:::p P1[RDBMS: 通用 + 强一致]:::ph --> P P2[TSDB: 时间维度极致]:::ph --> P P3[Graph: 关系维度极致]:::ph --> P P4[Document: 灵活性极致]:::ph --> P P5[KV: 简单极致]:::ph --> P P6[Column: 扫描极致]:::ph --> P P7[Search: 检索极致]:::ph --> P P8[Vector: 相似度极致]:::ph --> P P9[Embedded: 嵌入极致]:::ph --> P P10[Multi-model: 通用极致]:::ph --> P P11[GIS: 空间极致]:::ph --> P P12[DW: 历史极致]:::ph --> P P --> META[没有最好<br/>只有最合适] classDef p fill:#fce7f3,stroke:#be185d,color:#000 classDef ph fill:#dcfce7,stroke:#15803d,color:#000 classDef meta fill:#fef9c3,stroke:#a16207,color:#000

每类数据库背后都是一种工程哲学

  • RDBMS:通用 + 强一致 = 业务流程的中流砥柱
  • TSDB:时间维度做到极致 = 让监控/IoT 便宜 100x
  • Graph:关系维度做到极致 = 让社交/推荐跑得起来
  • Column:扫描维度做到极致 = 让 PB 级分析分钟出结果
  • Vector:相似度做到极致 = 打开 AI 应用的大门

十九、回到标题:为什么要对数据库进行细分

flowchart TB T[数据库细分的本质]:::t T1[业务多样化]:::r --> T T2[数据模型多样化]:::r --> T T3[物理模型多样化]:::r --> T T --> A["不存在万能数据库<br/>存在专业化的工具"] A --> B[12 类数据库<br/>每类优化一种场景] B --> C[业务架构:<br/>5 个数据库搞定一切<br/>而非 1 个数据库搞定一切] C --> D[5 数据库选型框架<br/>OLTP / OLAP / 缓存<br/>搜索 / 专用] classDef t fill:#fce7f3,stroke:#be185d,color:#000 classDef r fill:#dcfce7,stroke:#15803d,color:#000

回答标题:数据库细分是必然——因为:

  1. 业务多样化 → 没有一种数据库能满足所有场景
  2. 数据模型多样化 → 不同数据有不同灵魂结构
  3. 物理模型多样化 → 不同访问模式需要不同存储引擎

未来 5 年趋势

  • AI 时代会催生更多专用数据库(向量、图、RAG)
  • 多模融合会继续(pgvector、PostGIS 都是 PG 在扩张边界)
  • 云原生会重新定义”专用”(Snowflake、Pinecone 都是托管服务)

二十、3 条经验法则

20.1 法则 1:先 PG + Redis,看性能瓶颈再加专用

80% 的业务

flowchart LR APP[应用] --> PG[(PG)]:::pg APP --> REDIS[(Redis)]:::redis

再加专用 DB 的信号

信号 加什么
日志搜索慢 Elasticsearch
BI 报表慢 ClickHouse
设备数据写入慢 InfluxDB / TDengine
推荐召回慢 Milvus / pgvector
知识图谱查询 Neo4j

20.2 法则 2:避免数据库”宗教战争”

flowchart LR M[数据库宗教战]:::m PG[PG 派]:::p MY[MySQL 派]:::q MO[MongoDB 派]:::r RE[Redis 派]:::s M --> PG & MY & MO & RE PG -.-> D[真实业务需求]:::d MY -.-> D MO -.-> D RE -.-> D classDef m fill:#fce7f3,stroke:#be185d,color:#000 classDef p fill:#dcfce7,stroke:#15803d,color:#000 classDef q fill:#fef9c3,stroke:#a16207,color:#000 classDef r fill:#dbeafe,stroke:#1d4ed8,color:#000 classDef s fill:#fef9c3,stroke:#a16207,color:#000 classDef d fill:#dcfce7,stroke:#15803d,color:#000

正解:用业务需求反推技术选型,不是反过来。

20.3 法则 3:组合胜于万能

5 数据库搞定一切 > 1 数据库搞定一切。

flowchart TB ONE["1 数据库搞定一切<br/>(不可能)"]:::bad MULTI["5 数据库搞定一切<br/>(真实生产)"]:::good ONE -.失败.- X[烂架构] MULTI --> Y[好架构] classDef bad fill:#fce7f3,stroke:#be185d,color:#000 classDef good fill:#dcfce7,stroke:#15803d,color:#000

二十一、参考资料

同系列前文

推荐阅读

各类型代表数据库官方资源

  • RDBMS:postgresql.org / mysql.com
  • TSDB:docs.influxdata.com / docs.timescale.com
  • Graph:neo4j.com / nebula-graph.io
  • Document:mongodb.com / ferretdb.com
  • KV:redis.io / etcd.io
  • Column:clickhouse.com / duckdb.org
  • Search:elastic.co / opensearch.org
  • Vector:milvus.io / github.com/pgvector/pgvector
  • Embedded:sqlite.org / duckdb.org
  • Multi-model:arangodb.com / surrealDB.com
  • GIS:postgis.net
  • Data Warehouse:snowflake.com / cloud.google.com/bigquery

文章作者: growdu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 growdu !
  目录
分类导航
随笔2 AI27 算法1 计算机基础13 博客搭建7 ChatGPT2 集群63 计算机通信1 数据库34 数据库深入80 DPDK26 Docker11 Elasticsearch4 编辑工具4 FAQ1 Go Web1 hometown2 编程语言16 网络9 OPC1 Linux38 openGauss4 页面12 PostgreSQL54 程序员自我修养1 协议11 成长之路1 stock1 存储5 工具20 VPP18 视频作品1 Vue13 Web1 代码示例11 数据库15 BenchmarkSQL1 PostgreSQL 源码修炼之路14
最热文章
1
13 逻辑复制深入
数据库深入🔥 1570
2
0 Postgresql存储、索引及系统优化、主备切换
PostgreSQL🔥 1495
3
一文读懂openguass dcf网络模块
集群🔥 1420
4
逻辑复制源码分析
数据库深入🔥 1327
5
PostgreSQL 分区表:从一行 `PARTITION BY` 到路由热路径的全链路拆解
数据库🔥 1094
6
applyparallelworker.c 之 LA 端源码深度解析:Leader Apply Worker 的指挥中枢
数据库深入🔥 1082
7
PostgreSQL Background Worker 全解:从 `RegisterBackgroundWorker` 到逻辑复制 4 类 worker 的全生命周期
数据库🔥 1078
8
PostgreSQL的后台进程walsender分析 - 关系型数据库 - 亿速云
PostgreSQL🔥 1033
9
PostgreSQL 逻辑复制的监控:六张视图 + 一组可执行 SQL,把 publisher/subscriber 的速率与健康度彻底看透
数据库🔥 1032
10
PostgreSQL 逻辑复制支持 DDL 之后:DDL 与 DML 的时序难题(重点:分区表)
数据库🔥 999
11
reorderbuffer.c 源码深度解析:PostgreSQL 逻辑复制的"事务重组引擎
数据库深入🔥 953
12
PostgreSQL 内核开发:读取一张表的 9 步标准流程与缓存全景
数据库🔥 938
13
从 `postgres` 二进制到生产级守护 —— PostgreSQL 最外层模块与启动全流程拆解
数据库🔥 936
14
支持逻辑复制同步 DDL 适配 SQL Server 方案
数据库深入🔥 934
15
PostgreSQL 逻辑复制的 ReorderBuffer 与事务机制:从一行 WAL 到一致性变更流的全链路绑定
数据库🔥 913
16
DDL同步架构(美化版)
数据库深入🔥 908
17
PostgreSQL Latch 机制详解:从一行 SetLatch 到 epoll 的内核之旅
数据库🔥 871
18
pgbench 源码全解:一个 C 文件如何撑起 PostgreSQL 官方压测工具
数据库🔥 860
19
PostgreSQL libpq 机制与缓冲区详解
数据库🔥 850
20
PostgreSQL 逻辑复制 spill 文件深度剖析:从 `xid-*.spill` 到 TPC-C 的增长方程
数据库🔥 845