2026年任何人能给出的最有用的数据库建议仍然是”直接使用Postgres”——但这种说法其实做了很多简化工作,知道它何时失效与了解它为何通常正确同样重要。在2026年在Postgres、SQLite和Redis之间选择数据库的决定看似简单,直到你花了六个月时间从错误的数据库中迁移出来才会发现并非如此。切换数据库成本高昂、具有破坏性,而且很少值得庆祝。糟糕的数据库选择带来的真正成本不在于迁移的那一个周末——而在于你最终决定更换数据库前,长达十八个月积累的各种变通方案。
这是一篇实践层面的分析,介绍每种数据库何时占优,默认答案何时失效,以及在编写一行模式代码前如何进行决策推理。
Postgres:为何它是默认选择以及何时应该使用
Postgres凭借其真正的广度赢得了默认地位。它不仅仅碰巧是开源的关系型数据库——它是一个可扩展的数据平台,在单一系统中处理结构化数据、半结构化数据、全文搜索、地理空间查询和向量相似度。对于大多数应用而言,这种广度意味着你永远不需要使用第二种数据库。
使Postgres成为大多数生产工作负载正确选择的特定能力:
- JSONB存储和索引。 Postgres以二进制形式存储JSON,支持在JSON字段上创建GIN索引,并允许你使用在大规模下仍能快速运行的运算符查询嵌套JSON。当Postgres能够以单一索引类型和完整的ACID保证处理混合关系-文档模型时,”我需要文档存储”这一论点已不足以成为选择MongoDB的理由。
- 全文搜索。 内置的
tsvector和tsquery类型涵盖了大多数搜索用例,无需借助Elasticsearch。对于基本搜索功能就能满足用户需求的应用,添加单独的搜索索引是Postgres所消除的操作开销。 - pgvector。 语义搜索和检索增强生成需要向量相似度查找。
pgvector扩展将你现有的Postgres实例转变为向量存储。对于不需要极高每秒向量查询吞吐量的应用,这完全可以消除对Pinecone、Weaviate或专用向量数据库的需求。 - 外部数据包装器、逻辑复制和成熟的扩展生态系统。 扩展模型意味着Postgres能够适应在其他系统上会强制要求更换数据库的需求。
诚实的提醒:Postgres 在垂直扩展方面表现良好,但在水平扩展方面则显得笨拙。只读副本实现简单。水平写入分片需要像 Citus 这样的工具,谨慎的应用层分区,或者转向分布式 Postgres 服务。如果你正在构建需要跨分区处理数十万并发写入的应用,原生的 Postgres 将需要架构调整。对于另外 95% 的应用来说,使用只读副本进行垂直扩展在几年内都是足够的。
SQLite:2026 年使其成为合法选项的被低估选择
SQLite 在其大部分生命周期中都是嵌入式应用、移动应用和开发环境的数据库。这种描述既准确又具有限制性。Litestream、Turso 以及向边缘计算的广泛转变相结合,使 SQLite 成为特定应用类别中的真实生产选项,在这些应用中,SQLite 不是妥协,而是正确答案。
当你构建单服务器应用时,SQLite 是最佳选择,基于文件的数据库的操作简便性胜过客户端-服务器模型的灵活性。SQLite 数据库就是一个文件。备份就是复制文件。恢复就是覆盖文件。数据库进程就是你的应用进程。没有连接池,没有应用与数据库之间的网络延迟,也没有需要监控的独立服务。对于不需要多服务器并发性的应用,这种简便性不是限制——而是一个能显著减少基础设施面积的特性。
扩展 SQLite 合法性的具体工具:
- Litestream。 将 SQLite 的变更持续流式传输到 S3(或兼容的对象存储),实现接近零 RPO 的灾难恢复,而无需辅助数据库服务器。其复制模型是仅追加的 WAL 传输。对于运行单个应用服务器的独立开发者或小型团队,Litestream 使 SQLite “但数据丢失怎么办?”的反对意见变得可以处理。
- Turso。 基于 libSQL 的分布式 SQLite,专为边缘部署设计。Turso 为你提供一个 SQLite 兼容的数据库,副本分布在各个区域,使其适用于对延迟敏感的应用,这些应用希望数据靠近用户,但又不想承担全局分布式 Postgres 设置的运营负担。
SQLite 是错误选择的情况:任何需要多个进程或服务器并发写入、高吞吐量写入工作负载,或从数据库级用户管理中受益的复杂访问控制模式的应用。SQLite 的写入并发模型是文件级锁定;它能很好地处理并发读取,适当地处理序列化写入,但在多个连接的写入争用下会崩溃。
实际的理想应用场景:SaaS 工具、内部应用、个人项目,以及任何部署中”一台服务器就能处理此负载”是诚实的容量规划的场景。
Redis:它的用途与不适用之处
Redis经常被两个方向误解:一方面,团队手动重新实现缓存功能而未充分利用Redis作为缓存层;另一方面,团队发现Redis速度快就将其用作主数据库,进而认为它是通用型数据库。这两种错误都很常见。
Redis是一个数据结构服务器。它擅长那些能与其内存数据结构完美映射且具有自然过期或可容忍丢失语义的操作。典型的正确用途:
- 缓存。数据库查询结果、渲染的HTML片段、计算聚合结果—任何生产成本高而缓存成本低的内容。Redis的TTL支持和LRU淘汰机制使其专为缓存而设计。旁路缓存模式(检查Redis,回退到Postgres,将结果写入Redis)简单、正确,是大多数高读取应用的理想解决方案。
- 会话存储。会话数据量小、读取密集、具有原生过期特性,不需要关系数据库的持久性保证。Redis可以处理数百万个会话,内存开销极小,读取时间在亚毫秒级。
- 速率限制。
INCR和EXPIRE原语可以原子性地实现令牌桶或滑动窗口计数器。基于Redis的速率限制实现简单且正确,可扩展到处理分布式应用服务器的速率限制,无需协调开销。 - 队列和发布/订阅。Redis Streams和基于列表的队列模式(Node.js生态中的BullMQ使用此模式)很好地处理后台任务队列、事件总线和轻量级发布/订阅。对于不需要Kafka或RabbitMQ持久性保证的应用,Redis队列在运维上更简单且足够用。
- 排行榜和计数器。有序集合使实时排行榜和排名查找变得简单,而在关系数据库中这需要昂贵的查询。
Redis不是什么:不能承受丢失的应用数据的主数据库。Redis的持久化模式(RDB快照和AOF日志)降低了数据丢失风险,但其操作模式本质上是内存型的,具有可选的持久性,而不是具有可选缓存的持久存储。将用户记录、金融交易或主应用状态通过Redis作为主存储路由的团队,正在积累一种难以量化直到问题发生时才会显现的风险类别。
2026年的MongoDB:它仍然适用的领域
MongoDB吸收了多年的批评,其中许多是应得的,如今已成为比早期”网络规模”时代更成熟的数据库。诚实地评估它在决策矩阵中仍然适用的位置:
当你的数据真正以文档为中心、深度嵌套且模式灵活,而关系型规范化 actively 抵制时,MongoDB 是正确的选择。具有高度可变文档结构的内容管理系统、具有异构属性集的产品目录以及具有不断演变负载形状的事件日志,这些情况都是文档模型真正更好而不仅仅是熟悉的情况。
诚实的限制:Postgres 的 JSONB 已经吸收了许多曾经证明 MongoDB 合理的工作负载。如果你的应用主要是关系型的,只有少数文档形式的边缘情况,Postgres 中的 JSONB 列可以处理这些边缘情况,而无需单独的操作依赖。当大多数查询都是面向文档的,且模式变异性是真实存在的而非理论上的,MongoDB 才能证明其价值。
MongoDB Atlas 也已成为一个成熟的托管服务。如果你的团队已经在 MongoDB 的思维模型中工作,并且工作负载真正是面向文档的,那么 Atlas 是一个合理的主机选择。当 Atlas 为你处理这种复杂性时,仅仅为了减少操作复杂性而切换到 Postgres 的论点就变得不那么有力了。
新竞争者:SurrealDB、Turso、PlanetScale、Neon
2024 和 2025 年,有几家数据库积极定位自己。它们的实际生产准备程度各不相同。
SurrealDB 是一个多模型数据库,试图在单一的类 SQL 查询语言下统一关系型、文档型和图模型。其雄心是真实的;生产成熟度仍在追赶。早期采用者报告称,对于图密集型应用(其中 Postgres 中的连接复杂性变得难以处理),它很有前景。对于无法承受破坏性变更或在调试复杂问题时缺乏社区支持的团队来说,这不是一个安全的选择。
Turso(分布式 SQLite,上文提到)是针对特定用例的新进入者中最实用的。如果你的要求是具有 SQLite 兼容性的边缘部署,Turso 是生产可行的。除此之外,它是一个你可能不需要的问题解决方案。
PlanetScale 通过其分支工作流(数据库模式变更作为拉取请求)和无服务器扩展模式颠覆了 MySQL 托管服务。2024 年取消其免费层降低了其对早期阶段项目的吸引力,基于 Vitess 的分片模型引入了大多数应用在达到显著规模之前不需要的操作复杂性。对于重视分支工作流的高规模 MySQL 工作负载,它仍然是一个强有力的选择。
Neon是一种无服务器 PostgreSQL,采用存储与计算分离架构,实现了零扩展和类似 PlanetScale 的分支工作流。对于数据库分支有价值且在低流量实例上需要成本效益的开发工作流,Neon 值得评估。对于高吞吐量的生产工作负载,无服务器模型会引入难以预测的延迟特性。
托管 vs. 自托管:决策框架
托管与自托管的问题主要不是技术问题,而是经济和运营问题。真正的问题是:当凌晨 3 点出现故障时,您团队每小时的时间成本是多少?这与托管服务的月度费用相比如何?
对于早期产品和小型团队,托管数据库几乎总是正确的选择。可靠运行 PostgreSQL 所需的运营专业知识——配置调优、WAL 管理、清理分析、备份验证、故障转移测试——需要多年才能掌握。支付托管提供商维护这种专业知识是资本的有效利用。与在原始 VPS 上自托管 PostgreSQL 相比,RDS 或 Supabase 的月度溢价是真实的;而替代方案隐藏的成本则是工程团队从产品开发转向数据库运营所花费的时间。
当托管服务的溢价相对于您的基础设施预算变得显著,或者您拥有内部专业知识可以可靠地运营 PostgreSQL 时,自托管 PostgreSQL 才变得经济合理。这个交叉点比大多数团队想象的要高,因为大规模自托管 PostgreSQL 的故障模式(写入高峰期间的复制延迟、自动清理与查询计划的冲突、连接池耗尽)并不明显,且缺乏经验的情况下难以调试。
成本陷阱:RDS vs. 自托管 PostgreSQL
AWS RDS 是最常见的生产 PostgreSQL 部署方式,同时也是相对于所获得的服务而言最昂贵的运行方式之一。RDS 收费包括计算实例、存储、存储 I/O(在 gp2 卷上)、数据传出以及多可用区备用实例。一个具有多可用区和充足存储的中等规模 RDS 实例,其成本显著高于在 EC2 上运行具有流式复制到副本的自托管 PostgreSQL 的等效计算资源。
当您的团队缺乏数据库运营专业知识,或者您实际付费购买的功能是托管故障转移,或者不拥有数据库的运营简便性值得其溢价时,RDS 的溢价是合理的。当您的团队具备管理 PostgreSQL 的技能,工作负载可预测,且您处于成本优化阶段时,这种溢价就不合理。在规模上,从 RDS 迁移到 EC2 或 Hetzner(针对欧洲部署)上的自托管 PostgreSQL,是可用的基础设施成本削减中杠杆率较高的选择之一。
值得评估的 RDS 替代方案:Supabase 适合需要内置身份验证层和对象存储的 Postgres 团队;Railway 适合需要简单托管部署而不想处理 AWS 复杂性的团队;Fly.io 及其内置的 Postgres 服务适合全球分布式应用。
按用例划分的决策矩阵
| 用例 | 主要数据库 | 辅助数据库 | 应避免 |
|---|---|---|---|
| 标准 SaaS 应用 | Postgres | Redis (缓存、会话) | MongoDB 除非是文档密集型应用 |
| 单服务器独立应用/内部工具 | SQLite + Litestream | — | 托管服务 (成本开销) |
| 边缘/全球分布式 | Turso 或 Neon | 边缘 Redis 用于缓存 | 单区域 Postgres 作为主数据库 |
| 带向量搜索的 AI/RAG 应用 | Postgres + pgvector | Redis (速率限制) | 单独的向量数据库,除非 QPS 要求 |
| 文档密集型、模式可变 | MongoDB Atlas | Redis (缓存) | 如果模式变化只是理论上的,则避免 Postgres |
| 实时排行榜/队列 | Postgres | Redis (队列、有序集合) | Postgres 用于临时队列状态 |
| 大规模写入密集型 | Postgres + Citus 或 PlanetScale | Redis (速率限制) | SQLite、单节点 Postgres |
迁移难度:低估错误代价的隐性成本
数据库迁移不同于库升级。它们无法在周末增量完成,而且很少仅限于数据层。从 MongoDB 到 Postgres 的迁移需要模式设计(MongoDB 避免的学科)、数据转换、查询重写、应用层更改、索引重建,以及在过渡期间保持应用运行的切换策略。在任何有意义的数据量级下,迁移本身需要一个双写阶段,即两个数据库保持同步,这在操作上很脆弱,且难以彻底测试。
团队普遍低估的具体成本:
- 查询语义存在差异。 MongoDB 的聚合管道无法直接映射到 SQL。Redis 命令没有对应的 SQL 等价物。迁移不仅仅是移动数据——它需要重写数据访问层,这会影响所有读取或写入数据库的功能。
- 性能特征不同。 在 MongoDB 的文档模型上运行快速的查询,在 Postgres 中可能需要采用连接策略和特定的索引设计。只有当您针对生产数据量运行新查询时,迁移才会发现这些问题。
- 迁移窗口存在风险。 在实时生产数据库上进行大规模数据迁移,同时持续有写入操作,是生产工程团队可以运行的最高风险操作之一。每个迁移计划在执行前看起来都比实际执行更顺利。
实际影响:认真对待您最初的数据库选择,就像对待一个需要持续三到五年的决定一样。”直接使用 Postgres”的默认选择并非保守——它基于 Postgres 能够随着应用程序超出初始需求而共同发展的良好记录。选择一个适合原型阶段但在应用程序成熟后会造成迁移压力的数据库,是一种技术债务,其影响方式在初期难以预测。
实际框架:如何选择
将决策简化为四个问题:
- 您的数据主要是关系型的,实体之间有明确的关系吗? 选择 Postgres。这涵盖了围绕用户、账户、交易、内容以及具有外键关系的类似实体构建的大多数应用程序。
- 您是否在构建单服务器应用程序,其中运营简单性比分布式更重要? 使用 SQLite 和 Litestream。基于文件的模型消除了服务依赖及其带来的运营开销。
- 您是否有特定的缓存、会话、队列或限速需求? 将 Redis 作为辅助服务添加到您的主数据库旁边,而不是替代它。
- 您的数据是否真正以文档为中心,并且在字段级别存在真实的模式可变性? 评估 MongoDB。如果模式可变性主要是理论上的,而实际数据是关系型的,则继续使用 Postgres,并使用 JSONB 列来处理可变部分。
新的竞争者(SurrealDB、Turso、PlanetScale、Neon)在直接解决特定约束(边缘分发、成本结构或分支工作流)时值得评估,而不是作为通用替代品。它们为特定配置文件解决了实际问题;对于典型的 Web 应用程序,它们并非对 Postgres 的改进。
数据库选择是少数真正会限制你未来选择的基础设施决策之一。它在项目开始前值得团队进行比通常更深入的分析,而在选择做出并生产流量验证后,则应大幅减少重新评估。
常见问题
在2026年,”直接使用Postgres”仍然是个好建议吗?
对于大多数Web应用和SaaS产品,是的。Postgres在一个具有强ACID保证和成熟运维生态的系统中处理关系型数据、半结构化JSON、全文搜索以及通过pgvector实现的向量相似度。Postgres不适合的情况——边缘分发需求、倾向于SQLite的单服务器简单性,或真正的文档模型数据——确实存在,但只代表典型应用工作负载的一小部分。
什么时候应该为基于Postgres的应用添加Redis?
当你有特定的、具体的需求与Redis的数据结构相对应时,添加Redis:缓存昂贵的查询或渲染片段、存储会话数据、在分布式服务器间实现速率限制,或运行后台任务队列。不要推测性地添加Redis。运行第二个数据存储的运维复杂性只有在需求真实且Redis模型能干净地解决它时才是合理的。
SQLite在2026年真的适合生产环境吗?
对于单服务器应用,是的——特别是有了Litestream提供到对象存储的连续复制。SQLite在启用WAL模式的情况下嵌入到应用进程中运行,可以无问题地处理读密集型工作负载和适度的写入速率。它不适合需要多服务器并发写入或水平扩展的应用。Turso项目也使分布式SQLite对边缘部署变得可行,在这些场景下Postgres需要更多的基础设施复杂性。
RDS和自管理Postgres之间的实际成本差异有多大?
一个代表性的比较:一个配备100GB gp3存储的RDS db.t3.medium多可用区实例每月运行成本约为150-200美元。一个配备相同存储的自管理Postgres的等效EC2 t3.medium每月运行成本约为40-60美元,加上你团队的运维时间。管理溢价是巨大的,对于没有数据库运维专业知识或当托管故障转移是核心价值的团队来说是合理的。对于有Postgres管理技能的团队,自管理选项在规模上变得经济合理,特别是当结合pgBackRest等备份管理工具时。
从MongoDB迁移到Postgres有多困难?
比大多数团队预期的要困难得多。除了数据转换本身,迁移还需要重新设计关系模式,将所有查询从聚合管道语法重写为 SQL,重建索引,并根据生产数据量验证查询性能。对于中等规模的应用程序,合理的估计是四到八周的专职工程时间,包括双写过渡期。如果最初选择 MongoDB 是因为数据模型不匹配,那么迁移是值得的;但如果仅仅是为了运营或声誉原因,则不值得进行迁移。
