【DB】数据库分类与选型:关系型,键值缓存型,文档与图,时间序列与监控,列式分析,搜索与向量
【DB】数据库分类与选型:关系型Mysql,键值缓存型Redis,文档与图MongoDB-Neo4j,时间序列与监控Prometheus,列式分析 ClickHouse,搜索与向量 ES-VexDB
文章目录
- 一、数据库到底有几类
- 什么是数据库?
- 为什么不能只按产品名称分类
- 先按工作负载分成六个大类
- 同一大类内还要继续细分
- 二、六大类数据库的产品差异
- 1. 关系型交易数据库:优先承载核心事实(MySQL,PostgreSQL,SQL Server)
- 2. 键值数据库与缓存:用速度换取模型简单(Redis,Memcached,KeyDB)
- 3. 文档、图、目录与无代码数据库:模型随业务而变(MongoDB,Neo4j)
- 4. 时间序列与监控数据库:时间是第一索引(InfluxDB,TDengine,Prometheus)
- 5. 列式分析和 MPP:让聚合扫描跑得快(ClickHouse,StarRocks)
- 6. 搜索与向量数据库:为“找得准、找得快”建索引(Elasticsearch,Typesense,VexDB)
- 三、按业务场景做数据库选型
- 先问业务,再看产品
- 常见场景的推荐组合
- 一个可落地的电商数据架构
- 上线前的容量估算
- 四、实践、运维边界与常见问答
- 关系型数据库:事务和索引先行
- 缓存:使用 Cache-Aside,并处理三类故障
- 搜索、分析和向量:明确“最终一致”
- 运维检查清单
- 常见问答
数据库不是“把数据存进去”的同一种软件。它们对数据的组织方式、查询语言、事务能力、扩展方式和运维成本都不同。选型时如果只看“谁的性能更高”,很容易把缓存当主库、把搜索引擎当事务库,或者用分析型数据库承载高频订单写入。
本文不按厂商或产品名称罗列数据库,而是先建立一张“类型地图”,再把常见产品放回各自适合的位置。你会看到,数据库并不是互相割裂的几十个物种:很多产品共享同一类数据模型,只是在事务能力、查询方式、扩展策略和运维成本上有所不同。文中提到的“集群”属于部署和可靠性方案,不代表一种新的数据模型。
一、数据库到底有几类
什么是数据库?
数据库管理系统(Database Management System,DBMS)是负责持久化、组织、查询、并发控制、权限管理和恢复数据的软件。数据库本身是数据集合,DBMS 才是提供服务的程序。Redis、Elasticsearch、Prometheus 等虽然常被叫作数据库,但它们的主要目标分别是高速数据结构访问、搜索和监控时序存储,不能简单地和关系型数据库互换。
为什么不能只按产品名称分类
同一个产品可以同时属于多个维度。例如 ClickHouse 是列式数据库,也是分析型数据库;Redis 是键值数据库,也常被用作缓存;OceanBase 是关系型数据库,同时提供分布式扩展能力。因此选型至少要回答四个问题:
| 判断维度 | 要回答的问题 | 典型选项 |
|---|---|---|
| 数据模型 | 一条数据如何组织和关联? | 表、文档、键值、图、时间序列、向量 |
| 工作负载 | 主要是读写交易,还是聚合分析? | OLTP、OLAP、搜索、缓存、监控 |
| 一致性 | 是否需要事务、约束和强一致? | 强一致事务、最终一致、允许丢失的缓存 |
| 扩展方式 | 数据增长后如何扩容? | 垂直扩容、读写分离、分片、MPP、集群 |
先按工作负载分成六个大类
| 大类 | 共同特征 | 代表产品 | 主要解决的问题 |
|---|---|---|---|
| 关系型交易(OLTP) | 表结构、SQL、事务和约束 | MySQL、PostgreSQL、MariaDB、Microsoft SQL Server、OceanBase、GreatSQL | 订单、账户、库存、权限等核心事实 |
| 键值与缓存 | 通过 key 快速访问,部分产品提供丰富数据结构 | Redis、KeyDB、Valkey、Memcached | 热点数据、Session、限流、排行榜和短期状态 |
| 文档、图与数据平台 | 用文档、关系、层级对象或界面组织数据 | MongoDB、Neo4j、OpenLDAP、NocoDB | 结构灵活的内容、多跳关系、身份目录和内部工具 |
| 时序与可观测性 | 按时间追加,强调标签、窗口聚合和保留策略 | InfluxDB、TDengine、Prometheus | 指标、设备测点、告警和运行监控 |
| 分析型(OLAP) | 列式存储、压缩和并行聚合 | ClickHouse、StarRocks | 埋点、日志、报表和实时数仓 |
| 检索型 | 倒排索引或向量近邻检索 | Elasticsearch、Typesense、Manticore Search、VexDB | 全文搜索、联想、语义召回和推荐 |
同一大类内还要继续细分
| 关系较近的产品 | 共同点 | 主要差异 |
|---|---|---|
| MySQL、MariaDB、GreatSQL | 兼容 MySQL 协议和常见 SQL,迁移成本相对较低 | 版本分支、优化器、存储引擎、高可用和商业支持不同 |
| Redis、KeyDB、Valkey | 兼容 Redis API,提供内存数据结构访问 | 线程模型、社区治理、模块生态、持久化和集群工具不同 |
| InfluxDB、TDengine、Prometheus | 都保存带时间和标签的指标或测点 | 写入模型、查询语言、采集方式、长期存储和高基数处理不同 |
| ClickHouse、StarRocks | 都面向列式分析和大规模聚合 | 数据导入、更新语义、联邦查询、Join 能力和并发模型不同 |
| Elasticsearch、Typesense、Manticore Search | 都通过索引加速全文、过滤和排序 | 分词与相关性、资源占用、运维复杂度和 API 生态不同 |
这六个大类是从“工作负载”角度做的第一层分组,并不是六个互不相容的盒子。列式说的是存储方式,OLAP说的是分析型负载,集群说的是部署方式,开源/商业说的是产品和授权方式,它们本来就不在同一个维度。一个产品可以同时拥有多个标签:ClickHouse 是列式数据库和 OLAP 数据库,Redis 是键值数据库也常被当作缓存,OceanBase 是关系型数据库同时具备分布式扩展能力。
再往下看,同一大类里的产品也不是完全相同:MySQL、MariaDB、GreatSQL 更接近“兼容 MySQL 生态”的路线,PostgreSQL 更强调标准 SQL 和扩展能力;Redis、KeyDB、Valkey 都理解 Redis 协议,但线程模型、治理方式和兼容性不同;ClickHouse 与 StarRocks 都能做 OLAP,却分别在存储、导入、联邦查询和并发模型上有侧重。选型的正确顺序是:先确定大类,再比较同类产品的差异,最后用真实数据和查询压测验证。
有三个原则值得先记住:主库负责事实,缓存负责加速,搜索和数仓负责派生数据;先根据查询模式选模型,再比较具体产品;集群是部署和可靠性问题,不是新的数据模型。只要把这三点分开,数据库选型会清晰很多。
二、六大类数据库的产品差异
1. 关系型交易数据库:优先承载核心事实(MySQL,PostgreSQL,SQL Server)
关系型数据库把数据放在表中,用主键、外键、唯一约束和事务保证业务规则。典型事务要满足 ACID:原子性、一致性、隔离性和持久性。对于“扣库存、写订单、记账”这类必须正确的操作,关系型数据库通常是第一选择。
| 数据库 | 类型与特点 | 什么时候用 |
|---|---|---|
| MySQL | 开源关系型数据库,生态成熟、使用广泛,读写性能和运维工具丰富 | Web 业务、内容系统、电商主库;团队希望快速交付且使用成本可控时 |
| PostgreSQL | 开源关系型数据库,SQL 标准、事务、扩展类型和复杂查询能力强 | 地理信息、复杂报表、数据分析前置处理,或对约束和 SQL 能力要求高的系统 |
| MariaDB | MySQL 的社区分支,协议和使用方式相近 | 已有 MySQL 经验、需要社区分支或发行版支持,并且应用兼容性已验证时 |
| Microsoft SQL Server | 微软的商业关系型数据库,和 Windows、.NET、BI 工具集成紧密 | 企业内部系统、微软技术栈、需要 SSIS/SSRS/Power BI 等配套能力的场景 |
| OceanBase | 兼容 MySQL 的分布式关系型数据库,支持多副本和水平扩展 | 数据量或可用性超过单机边界,又希望保留 MySQL 生态和 SQL 使用习惯时 |
| GreatSQL | 面向 MySQL/Percona Server 的增强分支,关注高可用、安全和国产化生态 | 已经使用 MySQL,希望在兼容基础上获得增强特性、技术支持或国产替代方案时 |
这几种产品不是越“高级”越好。小型业务优先考虑 MySQL 或 PostgreSQL;已经绑定微软生态就选择 SQL Server;需要分布式事务、跨节点扩展时再评估 OceanBase。GreatSQL 和 MariaDB 都要先做应用、驱动、SQL 方言及备份恢复的兼容性测试。
MySQL-Cluster、PostgreSQL-Cluster不是全新的数据库类型,而是对应数据库的复制/高可用部署形态。常见的一主多从方案由主库处理写入,从库提供只读能力或灾备。它们能提升读吞吐和故障切换能力,但不会自动解决跨库事务、主从延迟和写入单点问题。生产环境还需要故障探测、选主、备份、演练和连接层路由。
2. 键值数据库与缓存:用速度换取模型简单(Redis,Memcached,KeyDB)
| 数据库 | 主要能力 | 什么时候用 | 关键边界 |
|---|---|---|---|
| Redis | 单线程事件循环(部分版本包含多线程 I/O)、丰富数据结构、Lua/事务、持久化 | 缓存、Session、排行榜、延迟队列、限流、分布式锁 | 内存成本高;不要把未持久化的数据当唯一事实 |
| Redis-Cluster | Redis 的分片和故障转移部署,按 slot 分布 key | 数据量或吞吐超过单节点,需要水平扩展时 | 多 key 操作要遵守同一 hash slot;集群不等于强一致事务 |
| KeyDB | Redis 协议兼容的多线程分支,擅长提高单节点并发 | 已有 Redis 客户端,希望利用多核降低延迟时 | 版本、模块和持久化行为要单独验证,不要默认完全等价 |
| Valkey | Redis 协议兼容的开源数据结构服务器,由社区维护 | 需要开放治理、兼容 Redis API 的缓存或数据结构服务时 | 仍要评估版本兼容、集群工具和云厂商支持 |
| Memcached | 极简的分布式内存缓存,key-value、无持久化、易横向扩展 | 只需要缓存热点结果,且允许缓存失效或丢失时 | 不支持复杂数据结构、持久化和可靠消息语义 |
Redis、KeyDB、Valkey 适合承载“可重建的状态”。例如商品详情可以从 MySQL 重建,验证码过期后没有价值;而账户余额不能只放在 Redis。Memcached 更简单,适合纯缓存和大规模横向扩容,不适合需要列表、集合、发布订阅或持久化的场景。
3. 文档、图、目录与无代码数据库:模型随业务而变(MongoDB,Neo4j)
- MongoDB:文档型数据库,以 BSON/JSON 文档为中心,字段可逐步演进。适合商品属性、CMS 内容、用户行为事件等结构差异较大的数据。需要跨文档强事务、严格外键和复杂联表时,关系型数据库通常更稳妥。
- Neo4j:图数据库,用节点、关系和属性表达数据,擅长多跳遍历,例如“朋友的朋友”“设备经过哪些网关”“某个风险账户关联了哪些主体”。如果主要查询是按主键取一行,使用图数据库会增加不必要的复杂度。
- NocoDB:无代码数据库平台,把表格界面、权限和 API 叠加在底层数据源上。它适合内部管理台、项目协作和原型验证,价值在于快速让非研发人员维护数据;它不是自动替代 MySQL/PostgreSQL 的高并发交易内核。
- OpenLDAP:LDAP 协议的开源目录服务,数据通常是层级化的 DN、组织、用户和组。适合统一认证、通讯录和组织架构查询;它的查询和更新模型与业务数据库不同,不应用来存订单明细。
4. 时间序列与监控数据库:时间是第一索引(InfluxDB,TDengine,Prometheus)
| 数据库 | 适合的数据 | 使用建议 |
|---|---|---|
| InfluxDB | 指标、事件和带 tag 的时间序列 | 应用监控、IoT 采集、按时间窗口聚合;注意高基数 tag 会造成内存和索引压力 |
| TDengine | 工业物联网中的设备测点和高频时序数据 | 设备数量大、写入持续、需要降采样和保留策略时;建模时区分设备表、超级表和标签 |
| Prometheus | 监控指标,采用拉取模型,内置本地 TSDB 和 PromQL | Kubernetes、服务监控和告警;短期高效可靠,长期保存应接远程存储,不承担业务明细 |
时间序列库的共同点是写入通常按时间追加,查询常见“最近一小时平均值”“按设备聚合”。不要把每个用户 ID、请求 ID 都当作标签,否则标签基数会爆炸。Prometheus 的instance、pod等标签适合监控维度,但用户行为明细更适合日志系统或分析型数据库。
5. 列式分析和 MPP:让聚合扫描跑得快(ClickHouse,StarRocks)
- ClickHouse:列式存储、压缩率高、向量化执行,适合埋点、日志、广告和财务报表的海量聚合。它对批量写入和追加友好,对频繁单行更新、复杂事务和强外键约束不友好。
- StarRocks:新一代极速全场景 MPP 数据库,强调实时数仓、联邦查询和高并发分析。适合需要较低延迟报表、明细加聚合混合查询的场景。上线前应按数据导入方式、分区、分桶和并发模型做压测。
ClickHouse 和 StarRocks 都能做分析,但不能只凭基准分数选择。数据是否持续更新、是否需要多表关联、查询并发和运维团队经验,往往比单次扫描速度更重要。常见做法是:事务库保存事实,CDC 或消息队列把变更同步到 OLAP,再由 OLAP 服务报表。
6. 搜索与向量数据库:为“找得准、找得快”建索引(Elasticsearch,Typesense,VexDB)
| 数据库 | 特色 | 什么时候用 |
|---|---|---|
| Elasticsearch | 分布式倒排索引、全文检索、聚合、日志生态成熟 | 日志检索、商品搜索、复杂过滤和可观测性平台 |
| Typesense | 轻量、低延迟、容错搜索,接口相对简单 | 中小规模站内搜索、自动补全、拼写容错,团队希望降低运维复杂度 |
| Manticore Search | 高性能全文搜索和分析,支持多种存储与 SQL 风格访问 | 需要搜索性能、SQL 接入或与已有关系型数据配合的场景 |
搜索索引通常是主库的派生数据。正确流程是“先写主库,再通过 CDC/消息更新索引”,而不是只写 Elasticsearch。需要接受短暂的一致性延迟,并设计重建索引、删除同步、版本切换和查询降级。搜索结果涉及权限时,必须在索引阶段或查询阶段做权限过滤。
VexDB可以理解为融合关系数据能力与多路语义检索能力的向量数据库。这类数据库把文本、图片或其他对象转换为向量,使用余弦相似度、内积或 L2 距离查找近邻,适合知识库问答(RAG)、语义搜索、相似商品和推荐召回。向量检索得到的是候选集合,通常还需要结合关键词、权限、时间和业务规则做过滤与重排。
向量库的关键设计包括:嵌入模型版本、向量维度、距离函数、分片索引、元数据过滤和删除策略。更换嵌入模型时,旧向量不能和新向量直接混查,最好通过版本字段和双索引平滑切换。订单、余额、库存等结构化事实仍应放在关系型数据库中。
三、按业务场景做数据库选型
先问业务,再看产品
可以按下面的顺序缩小范围:
是否需要事务、约束和准确更新? ├─ 是:MySQL / PostgreSQL / SQL Server │ └─ 单机边界不够:评估 MySQL-Cluster、PostgreSQL-Cluster 或 OceanBase └─ 否:主要需求是什么? ├─ 热点 key 和短期状态:Redis / Valkey / KeyDB / Memcached ├─ JSON 文档:MongoDB ├─ 多跳关系:Neo4j ├─ 时间窗口聚合:InfluxDB / TDengine / Prometheus ├─ 海量报表分析:ClickHouse / StarRocks ├─ 关键词和全文:Elasticsearch / Typesense / Manticore Search ├─ 语义相似度:VexDB └─ 组织身份目录:OpenLDAP;快速内部表格:NocoDB常见场景的推荐组合
| 场景 | 主数据 | 加速或派生数据 | 说明 |
|---|---|---|---|
| 电商下单 | MySQL / PostgreSQL / OceanBase | Redis、Elasticsearch、ClickHouse | 主库保证订单和库存;缓存防热点;搜索和报表异步构建 |
| SaaS 多租户 | PostgreSQL 或 MySQL | Redis、Typesense | 租户字段、索引和权限模型先设计清楚,再决定分库分表 |
| IoT 设备平台 | MySQL 保存设备与配置 | TDengine/InfluxDB,Prometheus 做平台监控 | 测点数据和业务配置分离,按时间分区和保留策略治理 |
| Kubernetes 可观测性 | 业务库按需选择 | Prometheus、Elasticsearch、ClickHouse | 指标、日志、链路分别建模,避免一个系统包打天下 |
| 企业统一认证 | OpenLDAP | 关系库保存业务授权映射 | LDAP 保存身份目录,订单和业务权限仍由业务系统管理 |
| 知识库问答 | PostgreSQL/MySQL 保存文档元数据 | VexDB + Elasticsearch/Typesense | 关键词和向量召回结合,最终回答前校验权限和版本 |
| 内部协作原型 | NocoDB | 根据增长情况接入 MySQL/PostgreSQL | 先验证流程,达到并发、审计或事务要求后再工程化 |
一个可落地的电商数据架构
浏览器 / App │ ├─ 订单、库存、支付 ──> MySQL 或 OceanBase(唯一事实来源) ├─ 热点商品、Session ──> Redis / Valkey(缓存和短期状态) ├─ 商品检索 ──────────> Elasticsearch / Typesense(异步索引) ├─ 经营报表 ──────────> ClickHouse / StarRocks(批量或实时同步) ├─ 运行监控 ──────────> Prometheus;日志检索可用 Elasticsearch └─ 语义推荐(可选) ──> VexDB这套架构的重点不是组件越多越好,而是每个组件只有一个清晰职责。主库写入成功后再发布领域事件;消费者失败可以重试或补偿;缓存失效可以回源;搜索和报表不可用时,核心下单链路仍然能够工作。
上线前的容量估算
至少估算五组数字:峰值读 QPS、峰值写 QPS、单条数据大小、保留周期、查询并发。以时间序列为例,设备数乘以每秒采样点数决定写入量,保留 30 天和保留 3 年会直接改变存储规模。以 Redis 为例,除了 value 大小,还要计算 key、对象编码、复制和集群预留内存,不能只看业务字段长度。
四、实践、运维边界与常见问答
关系型数据库:事务和索引先行
CREATETABLEorders(idBIGINTPRIMARYKEY,user_idBIGINTNOTNULL,statusVARCHAR(20)NOTNULL,amountDECIMAL(18,2)NOTNULL,created_atTIMESTAMPNOTNULL,UNIQUEKEYuk_user_order(user_id,id),KEYidx_user_created(user_id,created_at));STARTTRANSACTION;UPDATEinventorySETavailable=available-1WHEREsku_id=1001ANDavailable>0;-- 检查受影响行数为 1 后再写订单INSERTINTOorders(id,user_id,status,amount,created_at)VALUES(90001,42,'PAID',99.00,CURRENT_TIMESTAMP);COMMIT;表结构要表达业务约束,金额使用定点类型而不是浮点数,扣库存要检查更新行数。读写分离后,刚写入的数据可能在从库不可见;需要强一致读取的请求应回主库,或携带位点等待从库追平。
缓存:使用 Cache-Aside,并处理三类故障
读取: value = cache.get(key) if value != nil: return value value = db.query(id) if value != nil: cache.set(key, value, ttl=300s) return value 更新: db.transaction(update) cache.delete(key) # 删除而不是直接写缓存,减少并发覆盖需要额外防护缓存击穿、缓存穿透和雪崩:热点 key 加互斥锁或 singleflight;不存在的数据写入短 TTL 的空值;TTL 增加随机抖动并准备限流和降级。分布式锁要设置过期时间、唯一 token 和释放校验,不能把SETNX当成完整的锁服务。
搜索、分析和向量:明确“最终一致”
主库提交事务 → 可靠消息/CDC → 搜索索引或 OLAP 导入 → 记录 offset 和失败原因 → 可重放、可校验、可重建搜索索引要有全量重建方案,OLAP 表要有分区和数据校验,向量索引要记录模型版本。任何派生库都应能从主库或原始事件重新生成,否则数据损坏后只能人工修复。
运维检查清单
| 方面 | 至少要做什么 |
|---|---|
| 备份恢复 | 明确 RPO/RTO,定期做全量与增量备份,真实环境演练恢复 |
| 高可用 | 验证故障探测、选主、脑裂保护、连接重试和读写路由 |
| 数据安全 | 最小权限、传输与静态加密、敏感字段脱敏、审计留痕 |
| 性能 | 记录慢查询、命中率、P95/P99 延迟、写入滞后和磁盘水位 |
| 容量 | 设置内存、磁盘、连接数、分片和标签基数的告警阈值 |
| 变更 | 版本升级、表结构、索引和分词模型都要可回滚 |
| 一致性 | 标明主库、缓存、搜索和数仓之间允许的延迟范围 |
常见问答
问:MySQL 和 PostgreSQL 应该怎么选?
答:业务以常规 Web 事务为主、团队和云服务更熟悉 MySQL 时,MySQL 是稳妥起点;需要复杂 SQL、丰富类型、地理信息或更严格约束时,优先 PostgreSQL。最终以真实 SQL、数据量和团队运维能力压测,不要只看排行榜。
问:Redis、Memcached 和 Valkey 是替代关系吗?
答:它们都能做缓存,但能力范围不同。Memcached 最简单;Redis/Valkey 提供集合、列表、脚本和持久化等能力;Valkey 重点是开源社区治理。若应用只使用基础 GET/SET,三者都可评估;若依赖 Redis 特性,要逐项检查兼容性。
问:Prometheus 能不能存所有业务数据?
答:不能。Prometheus 面向带标签的监控指标和告警,适合短中期时间序列。订单明细、用户行为原文和长期数仓数据应放在对应的关系型、日志或分析型系统中。
问:为什么已经有 Elasticsearch,还需要 Typesense 或 Manticore Search?
答:它们解决的仍是搜索问题,但运维模型、查询接口、资源占用和功能侧重点不同。中小规模站内搜索可以选更轻量的 Typesense;需要 SQL 风格接入或多存储组合时可以评估 Manticore Search;复杂日志、聚合和生态集成通常选择 Elasticsearch。
问:向量数据库是不是可以替代关系型数据库?
答:不能。向量库负责近邻召回,关系库负责可验证的结构化事实。RAG 系统通常同时保存文档元数据、权限和版本,再把分块向量写入 VexDB,并在召回后回查主库。
问:什么时候应该上“集群”?
答:当单节点的容量、吞吐或故障恢复目标确实不够时再上。集群会引入分片键、复制延迟、网络故障、运维和成本。先通过索引、读写分离、缓存和归档解决单机问题,再根据明确的容量和 RTO/RPO 指标选择MySQL-Cluster、PostgreSQL-Cluster、Redis-Cluster或 OceanBase。
最后可以用一句话复盘选型:数据的事实在哪里,最常见的查询是什么,允许多大的一致性延迟,预计如何扩容,团队能否长期运维?能回答这五个问题,数据库类型通常已经确定;具体产品则交给兼容性验证、容量压测和故障演练来决定。