PostgreSQL 适用一切场景

这篇文章(Dr. Raphael A. Bauer 的《PostgreSQL for Everything》)的核心论点是:PostgreSQL 不是万能答案,但能覆盖你想象中多得多的场景;在中小规模下,先用 PG 统一数据层,遇到真实瓶颈再换专用系统,是更省维护成本、更快交付的架构选择。

PostgreSQL 凭借“老牌稳定 + 现代特性 + 插件生态”,在初创和中型业务里可以一个数据库顶住搜索、文档、队列、时序、向量、缓存、层级数据等多套中间件;它的真正价值不是性能碾压专用库,而是用更低的运维与认知成本,让你把时间花在业务功能上

一、为什么选 PostgreSQL:三个底层优势

  • 成熟且持续进化:1996 年至今,bug 被长期打磨;社区向后兼容地加现代特性(CTE、分区、JSONB、逻辑复制等)。
  • 部署与生态极简:本地 brew/apt/docker、Testcontainers 测生产一致性、云厂商一键托管,维护成本极低。
  • 可扩展性强:原生能力 + 插件(TimescaleDB、pgvector、pgai、LTREE 等)把多种数据模型收进同一个 ACID 库。

二、PG 能“单库替多中间件”的场景清单

作者用自己 CTO 生涯的实战说明,以下场景不必急着引入专用组件

原本的专用系统 PostgreSQL 方案 关键机制
MySQL + Lucene/Solr 原生全文检索 tsvector + GIN 索引(Contentful、Instacart 实践)
MongoDB 文档存储 jsonb + GIN,支持 JSONPath 查询
Kafka / RabbitMQ / SQS 表即队列 FOR UPDATE SKIP LOCKED、递归/游标消费,先 PG 后换 MQ
ClickHouse / InfluxDB 时序数据 TimescaleDB 超表 + 连续聚合
Pinecone / 专用向量库 向量检索 pgvectorpgai 做 embedding 同步与 RAG
Redis 缓存 内存级缓存 UNLOGGED 表 + 触发器模拟 TTL,多数用例够快
文件系统存小二进制 Blob 列 Flatbuffers 序列化入 bytea,缓存策略下比裸文件 IO 更快
树形/层级数据 LTREE 类型 比递归 CTE 更易维护
微服务中间层 直接出 JSON 查询里拼 JSON 返回,省一层应用中间层

作者强调:这些都是“先 PG 起步”的策略,不是否认专用系统——当吞吐/并发/规模真正打满时,再切 Kafka、ClickHouse、Redis 不迟。

三、架构哲学:用“无聊”换速度

  • 少零件 = 少同步 = 少漂移:避免 ES 与 PG 双写、Mongo 与 PG 对账这类管道腐烂。
  • 团队认知负担下降:一套 SQL 技能覆盖关系、文档、搜索、队列、时序、向量。
  • 决策顺序建议:新需求来了先问“PG 能不能做”→ 能做就用 → 压测出真实瓶颈再引入新技术,而不是反过来为“技术新鲜感”买单。

这篇文章带来很好的启发:PostgreSQL拥有多模型存储能力,原生支持文档(jsonb)、轻量缓存、全文检索、向量检索、队列表等场景。在不少业务场景下,可以优先基于PG实现相关能力,避免盲目引入新的中间件,降低系统复杂度。

但我不认同将其作为一套可直接落地的生产级通用方案,存在明显边界约束(架构收敛不能牺牲稳定性):

  1. 把缓存、海量文档等旁路能力并入同一套业务主库,存在严重稳定性风险。
    业务主库承载核心交易、用户等核心数据,属于不可丢失的Source of Truth。缓存、高频半结构化读写具备流量大、允许降级、可丢失的特征,二者共用数据库会造成资源互相抢占、故障域合并;缓存流量抖动、jsonb频繁更新引发的膨胀与IO压力,会直接拖慢核心业务SQL,极端场景导致全站故障。
  2. 如果为了替代Redis、MongoDB等而新部署一套PostgreSQL,无法降低架构成本,反而是牺牲性能、增加运维负担。
    新增独立PG集群会带来额外的机器、运维、监控、高可用成本,相比直接引入轻量专用组件,总体成本更高,违背“简化架构”初衷。

适用场景:

  1. 新项目、初创项目、MVP阶段:快速迭代优先,减少中间件维护成本,等业务出现真实瓶颈后再拆分专用组件;
  2. 内部系统、后台管理平台、低频运营系统:无C端高并发压力,可用性要求适中;
  3. 边缘业务、工具类、小型独立服务:规模有限,无需搭建复杂中间件体系。
如果你有魔法,你可以看到一个评论框~