数据库按存储模型和查询方式分类。下面列出各类的用途、使用场景和常见系统。PostgreSQL、InfluxDB 写到对象模型和查询语句,其余系统写到模型和负载。

消息队列保存待消费的事件,注册与配置中心保存会被监听的配置和注册信息。二者的数据模型与数据库不同,但与数据库处在同一套业务系统中。JDBC(Java Database Connectivity,Java 数据库连接)和 MySQL、PostgreSQL 协议兼容是接入方式,达梦、Snowflake、Hive 等多采用这种方式。接入之后,系统仍归入下面某一类。

1. 分类

类别 用途 使用场景 代表系统
关系型 以事务保存结构化记录,并支持表间关联 账户、订单、库存、权限 PostgreSQL、MySQL、Oracle、SQL Server、SQLite
分析型 对大批量数据做扫描和聚合 报表、多维统计、明细分析 ClickHouse、Doris、Snowflake、BigQuery
文档、键值与搜索 按文档、键、行键或倒排索引访问 内容、缓存、全文检索、宽表归档 MongoDB、Redis、Elasticsearch、Cassandra
图与向量 遍历节点和边,或按向量距离检索 关系网络、语义检索、相似推荐 Neo4j、Milvus、Qdrant
时序 按时间追加数据点,并做时间窗口聚合 监控指标、接口耗时、设备采样 InfluxDB、TDengine、Prometheus
消息队列 暂存事件,由其他系统按位移或队列消费 异步通知、日志采集、库表变更同步 Kafka、RabbitMQ、RocketMQ
注册与配置 保存配置、服务实例和主节点,并通知变更 服务发现、配置下发、集群选主 etcd、Nacos、ZooKeeper

2. 关系型数据库

数据组织为表。列有类型,行是一条记录,表之间通过主键和外键关联。查询语言为 SQL。多条写入可置于同一事务:提交后同时可见,失败则回滚。此类负载称为 OLTP(Online Transaction Processing,联机事务处理)。

系统 端口 说明
Oracle 1521 商业系统,过程语言为 PL/SQL
SQL Server 1433 使用 T-SQL,常见于 Windows 与 .NET 环境
MySQL 3306 默认事务引擎为 InnoDB。MariaDB 为其分支。TiDB、OceanBase 使用 MySQL 协议提供分布式能力
SQLite 无独立服务端口 数据库为单个文件,由进程内库访问
达梦 视部署而定 语法和运维对象接近 Oracle
openGauss、GaussDB 视部署而定 基于 PostgreSQL。协议兼容不包含系统目录和管理命令

PostgreSQL

默认端口 5432。PostGIS、pgvector、TimescaleDB 分别以扩展提供地理数据、向量和时序。

对象 作用
database 独立数据空间,由连接参数指定
schema 命名空间,默认名为 public
table / view 表存储行,视图保存一条查询
role 登录身份与权限主体

timestamptz 存储绝对时刻。timestamp 不包含时区。参与约束和关联的属性使用独立列;结构不稳定的附属信息使用 jsonb,索引类型为 GIN。等值、范围和排序使用 B-tree。

并发控制为 MVCC(Multi-Version Concurrency Control,多版本并发控制):更新生成新行版本,读不阻塞写。未结束的长事务会保留旧版本。查询账号通常只授予 SELECT。

1
2
3
4
5
6
SELECT id, status, created_at
FROM orders
WHERE created_at >= now() - interval '7 days'
AND status = 'paid'
ORDER BY created_at DESC
LIMIT 50;

3. 分析型数据库

分析型系统针对大批量扫描和聚合,负载称为 OLAP(Online Analytical Processing,联机分析处理)。数据从关系库、日志或消息队列同步而来。查询延迟通常在秒级或更长,单次查询处理的行数远高于 OLTP。

系统 模型
ClickHouse 列式存储。同一列连续存放,用于事件明细的过滤和聚合,如日志、点击、账单
Doris、StarRocks 实时分析引擎,查询协议为 MySQL
Snowflake、BigQuery 云数据仓库。存储与计算分离,按计算资源计费,用于跨业务表的汇总
Databricks 数据存放在数据湖文件中,常见格式为 Delta Lake,查询层为 Spark SQL
Trino 分布式 SQL 引擎。存储位于 Hive、Iceberg、PostgreSQL 等外部系统,Trino 负责查询

订单的当前状态保留在关系库。按地区、渠道统计一段时间的支付金额时,读取同步到分析库的明细。同步存在秒级到分钟级延迟。

4. 文档、键值与搜索

这一类包含四种模型:文档、键值、宽表、倒排索引。访问路径不同。

4.1 文档数据库

一条记录是一篇文档,编码多为 JSON 或 BSON。同一集合中的文档字段可以不同。

MongoDB 的默认端口为 27017,查询使用其查询语言和聚合管道,用于内容、活动配置和字段经常变化的档案。CouchDB 通过 HTTP 访问文档,支持多主复制,用于需要离线同步的数据。

金额、库存等需要约束和对账的字段放在关系库。

4.2 键值数据库

按键读取对应的值。Redis 的默认端口为 6379,值类型包括字符串、哈希、列表、集合和有序集合。数据主要驻留内存,用于缓存、会话、计数和分布式锁。RDB 与 AOF 将内存数据写入磁盘。Redis 模块可以在同一进程中提供搜索或向量索引。

4.3 宽表与列族

行键决定数据所在分片,列按列族分组,单行的列数可以很大。

Cassandra 无独立主节点,写入路径短,用于跨数据中心的高写入。查询条件需要包含分区键。HBase 运行于 Hadoop 文件系统之上,按行键和列族组织,用于历史归档和画像等稀疏宽表。

4.4 搜索引擎

Elasticsearch 的常见端口为 9200。文本切分为词项后建立倒排索引,再与过滤、聚合组合,用于全文检索和日志检索。OpenSearch 与其同源。Meilisearch 的索引规模和功能面更小,用于站内搜索。

正文和业务状态存放在主库。搜索引擎保存由主库同步出来的索引。

5. 图数据库与向量数据库

关系用边表示、或用高维向量表示时,使用图数据库或向量数据库。

5.1 图数据库

图由节点和边组成,边具有类型和属性。查询沿边进行有限步遍历。

Neo4j 实现属性图,查询语言为 Cypher,用于人物关系、资金网络和组件依赖。节点上的主数据通常另存一份在关系库。

5.2 向量数据库

向量数据库存储嵌入(embedding),即文本、图像或音频对应的高维浮点数组。查询计算余弦距离、点积或欧氏距离,返回距离最近的若干条。数据规模大时使用近似最近邻索引。

系统 说明
Milvus 支持稠密向量、稀疏向量和混合检索,用于检索增强生成(RAG)和推荐
Qdrant 向量检索与标量过滤在同一次查询中执行
Weaviate 提供向量化模块,向量生成与检索处于同一系统
ChromaDB 可嵌入应用进程,用于小规模向量集合
pgvector PostgreSQL 扩展,向量与业务表位于同一实例

稠密检索比较语义向量,稀疏检索比较关键词权重,混合检索合并两类得分。评价指标包括召回率(前 K 个结果中的相关比例)和 QPS(每秒查询数)。

6. 时序数据库

一条时序数据包含时间戳、用于过滤的维度和数值字段。写入以追加为主。查询带有时间范围,并对窗口做聚合。原始点按保留策略删除或降采样。

系统 说明
InfluxDB 通用时序库,写入协议为 Line Protocol(行协议)
TDengine 面向设备数据,以超级表描述同一类设备,查询语言接近 SQL
IoTDB Apache 项目,按设备测点组织,面向工业高写入
QuestDB 使用 SQL 查询,同时接收 Influx 行协议
TimescaleDB PostgreSQL 扩展,时序数据与关系数据位于同一实例
Prometheus 监控系统内置的时序库,主动拉取指标,查询语言为 PromQL。与 Grafana 的关系见《Grafana生态》

InfluxDB

默认端口 8086。行协议由度量、标签、字段和时间戳组成:

1
api_request,app=checkout,path=/pay latency_ms=42,status_code=200 1730000000000000000
部分 含义
measurement 度量名,对应一组点,上例为 api_request
tag 已建索引的维度,上例为 app、path
field 数值或状态,默认不建索引,上例为 latency_ms、status_code
timestamp 该点的时间,行协议中单位通常为纳秒

标签的取值集合需要有限,例如应用、接口、机房。用户 ID、订单号、trace ID 的基数高,写入标签会导致索引膨胀。这类标识放在 PostgreSQL,时序库保留可聚合的数值。

1.x、2.x、3.x 的对象模型和查询语言不同:

版本 数据组织 认证 查询语言
1.x database 与 retention policy(保留策略) 用户名、密码 InfluxQL
2.x organization 与 bucket(桶) API token Flux;部分接口接受 InfluxQL
3.x 表;写入仍可使用行协议 token SQL、InfluxQL

1.x 查询最近一小时的平均耗时:

1
2
3
4
SELECT mean(latency_ms)
FROM api_request
WHERE time > now() - 1h AND app = 'checkout'
GROUP BY time(1m)

2.x 的对应 Flux 为:

1
2
3
4
from(bucket: "metrics")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "api_request" and r.app == "checkout")
|> aggregateWindow(every: 1m, fn: mean)

原始序列按保留时间删除。分钟或小时聚合另存一条序列,供看板和告警读取。订单状态在 PostgreSQL,接口延迟在 InfluxDB。

7. 消息队列

消息队列保存已经产生、尚未被消费的事件,提供堆积和按位置重放。事务型主数据仍在关系库。消费进度与库中的业务状态是两套数据。

系统 模型 场景
Kafka 主题上的追加日志,消费者自行记录位移 日志采集、事件流、向分析库同步变更
RabbitMQ 交换机按路由键将消息写入队列 任务分发
RocketMQ 主题、队列与消费组,支持事务消息 订单、支付链路中的异步处理
Pulsar 服务层与存储层分离,主题隶属于租户和命名空间 多租户消息

8. 注册与配置中心

存放配置项、主节点和服务实例。数据量小,要求一致的读写和变更通知。业务记录在关系库,此处存放进程运行所读取的配置。

系统 用途
etcd 带租约和监听的键值存储。Kubernetes 用它保存集群状态
ZooKeeper 以 ZNode 做协调。Hadoop 及早期 Kafka 用它选主和保存元数据
Nacos 配置管理与服务注册,用于微服务
Consul 服务发现与 KV,同时提供健康检查

9. DBX

同时连接上述多类系统时,可以使用 DBX。它是开源数据库客户端,源码位于 t8y2/dbx。SQL 系统使用查询编辑器、结果网格和表结构;文档、键值、搜索、向量、时序、消息队列和配置中心使用对应的对象界面。桌面版在本机运行。Docker / Web 版在服务器运行,通过浏览器访问。命令行和 MCP(Model Context Protocol,模型上下文协议)读取同一份连接配置,供脚本和外部程序调用。

命令行对 PostgreSQL 可直接查询。InfluxDB 需要桌面版处于运行状态,命令行经桥接访问,以 dbx capabilities 的输出为准。连接可设置为只读,或在检测到写操作时要求确认。权限由数据库账号决定。其导出功能用于小库迁移;生产数据的备份使用数据库自身的备份工具。