百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Postgres是个六边形战士,其他很多工具是没必要的

itomcoil 2025-09-03 00:06 3 浏览

你只是想部署一个简单应用,一个仪表盘、一个聊天工具,或者个人项目。突然之间,你得启动 Redis 做缓存,上 Elasticsearch 做搜索,用 Firebase 实现实时同步,配置无服务器函数的定时任务,接入 Auth0 处理登录,搭建 GraphQL 服务,再引入某个来路不明的 Cookie 追踪分析工具,最后收获一张能供你喝一年咖啡的账单。


Postgres 现在能搞定上述大部分功能,而且它真的做得不错。

没错,就是那个被编程训练营导师评价为“还行,不过有点过时”的老古董 SQL 数据库。它已经悄悄进化成了后端猛兽。只要搭配合适的扩展和最佳实践,你可以用纯 SQL 替换掉十多个工具、服务和 SaaS 订阅,把所有功能集中在一个地方运行。

没有炒作。没有脆弱的技术栈。只有被低估的、由 SQL 驱动的简洁方案。

本文涵盖内容:

  1. 总结 一图看懂 Postgres 能替代什么
  2. 灵活的 JSONB 架构 让非结构化数据也能享受 SQL 查询
  3. 使用 pg_cron 实现任务调度 告别 crontab 的定时任务管理
  4. 通过无日志表实现缓存 拥有 Redis 级速度,但不用装 Redis
  5. 使用 pgvector 实现 AI 向量搜索 在数据库里玩转 RAG 魔法
  6. 借助 TSVECTOR 实现全文搜索 自己动手打造搜索引擎
  7. 认证、JWT 与行级安全 仅用 SQL 实现登录流程
  8. 分析与仪表盘 无需外传数据即可追踪用户行为
  9. 总结 + 对照表 一览被替代的工具及后续方向

1. Postgres 能替代什么(以及何时最合适)

如果你正开着终端窗口、线上环境着火,或者三分钟后就要开 Zoom 站会,这里是简明版:

Postgres 现在可以替代:

工具

使用 Postgres 功能

Redis

UNLOGGED tables

Cron jobs

pg_cron

Firebase

ElectricSQL

Elasticsearch

TSVECTOR

Pinecone

pgvector

Auth0/Firebase Auth

pgcrypto, JWTs, row-level security

Google Analytics

pgme, TimescaleDB

GraphQL Server

PostGraphile

NoSQL (Mongo)

JSONB columns

什么时候选择“Postgres 优先”最合适:

  • 你在构建 MVP 或独立 SaaS 产品
  • 你是个人开发者或小团队
  • 你讨厌为了发个密码重置邮件而对接六个 API
  • 你想要更少的工具、更轻的配置、更多的实际交付

真实案例:Supabase Studio 自身就在底层使用了 PostgreSQL + pg_cron + 行级安全机制。
如今许多独立 SaaS 工具已经将 90% 的后端逻辑放在数据库内运行,而且扩展性依然出色。

什么时候不太适合:

  • 你处在淘宝级别的规模并运行多区域部署
  • 你的技术栈依赖非 SQL 类数据存储(比如海量对象二进制数据)
  • 你享受写 YAML 流水线和摆弄 SQS 队列(敬佩你)

2. 使用 JSONB 实现灵活架构:让非结构化数据也能用 SQL 查询

过去,如果你想要灵活、无模式的数据存储,你会选择 MongoDB。想存一些用户设置、标记或日志?SQL 原本不是为这设计的,直到它进化了。

Postgres 推出了 JSONB,一种二进制格式的 JSON 列类型,它把 NoSQL 的灵活SQL 的强大 结合在了一起。两全其美。

适用场景:用户偏好、插件配置、产品元数据

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  email TEXT,
  settings JSONB
);

插入灵活数据:

INSERT INTO users (email, settings)
VALUES (
  'dev@postgres.gg',
  '{"theme": "dark", "notifications": {"email": true}}'
);

查询深层嵌套键值:

SELECT email FROM users
WHERE settings->'notifications'->>'email' = 'true';

为什么它很棒:

  • 不必每次字段变动都改表结构
  • 可以用完整的 SQL 语法查询
  • 通过 GIN 索引提升性能

注意别滥用 JSON:

如果所有数据都塞成大 blob,你就失去了类型安全和关联查询能力。把 JSONB 用在需要灵活的部分,核心表继续保持结构化。

3. 使用 pg_cron 实现任务调度:告别 crontab 的定时任务

我们都经历过:SSH 登服务器,打开 crontab -e,复制粘贴一串定时字符串,然后祈祷下个月它还能跑。

有了 Postgres,你不用碰终端。直接上 pg_cron。

什么是 pg_cron?

一个 Postgres 扩展,让你 直接用 SQL 语句设定定时任务。没了,没外部服务,没 Linux 黑魔法。

适用场景:自动删除过期会话

CREATE EXTENSION IF NOT EXISTS pg_cron;

SELECT cron.schedule(
  'clean_sessions',
  '0 * * * *', 
  $ DELETE FROM sessions WHERE expires_at < now(); $
);

任务直接在数据库里跑。没有服务器,没有任务队列,只有清爽的 SQL。

彩蛋:像查普通表一样查看和编辑任务

SELECT * FROM cron.job;

想暂停、更新或删除?一条 SQL 全搞定。

注意事项:

  • 仅在主节点运行
  • 需启用后台工作进程(Neon、Supabase、Railway 上效果极佳)

对大多数应用来说,这可以替代:

  • 用 GitHub Actions 清理数据
  • 用 Lambda / 云函数定时器
  • 运维人员为 shell 脚本误触发而抓狂

4. 使用无日志表实现缓存:拥有 Redis 级速度,但不用装 Redis

Redis 是快,但部署它意味着:
又一个服务
又一个心智负担
又一张账单

如果你只需要 快速、可丢弃的缓存,Postgres 用 UNLOGGED 表来拯救你。

什么是无日志表?

  • 不写预写式日志(WAL)
  • 基本住在内存里
  • 崩溃时不保留数据
  • 写密集型临时数据超快

适用场景:会话令牌、验证码、临时标记

CREATE UNLOGGED TABLE session_cache (
  token UUID PRIMARY KEY,
  user_id INT,
  expires_at TIMESTAMPTZ
);

插入和查询跟平常一样:

INSERT INTO session_cache (token, user_id, expires_at)
VALUES (gen_random_uuid(), 42, now() + interval '30 minutes');

SELECT * FROM session_cache WHERE token = '...';

依然是熟悉的 SQL
没有 Redis 网络配置
本地开发体验一致

只是记住:

  • 崩溃 = 数据丢失
  • 别用于关键或持久化数据
  • 多数配置下不会跨副本共享

想追求极致的临时速度?很多 Redis 应用场景,用它就能替代,连 Docker 容器都不用拉。

5. 使用 pgvector 实现 AI 向量搜索:在数据库里玩转 RAG 魔法

你正在做一个 AI 相关的应用:文档助手、智能搜索,或者一个不怎么胡说八道的聊天机器人。
你首先想到 Pinecone……然后马上被 SDK、同步麻烦和 API 限制迎头痛击。

不如试试这个:直接把向量嵌入存进 Postgres,用 pgvector。

什么是 pgvector?

一个扩展,为 Postgres 增加了 VECTOR(n) 类型,让你可以:

  • 存储 OpenAI / Cohere / Claude 的向量
  • 执行相似度搜索(余弦、欧几里得、内积)
  • 为这些向量建立索引以加速查询

适用场景:从你自己的文档中做语义搜索

CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE docs (
  id SERIAL PRIMARY KEY,
  content TEXT,
  embedding VECTOR(1536)
);

然后搜索:

SELECT content
FROM docs
ORDER BY embedding <-> '[0.011, -0.043, ...]'::vector
LIMIT 5;

用的是真实数据
可结合 SQL 条件过滤(如 WHERE category = 'legal')
没有向量数据库的计费层级焦虑

什么时候不够用:

  • 你要处理数百万高维向量
  • 你需要 HNSW 或高级近似最近邻算法(ANN)

对于大多数 MVP 和 1 万到 10 万向量的场景?pgvector 已经够用,而且它和你的其他数据在同一个数据库里

6. 使用 TSVECTOR 实现全文搜索:自己动手打造搜索引擎

搜索看似简单,直到你开始追求速度、排序、容错拼写和良好体验。多数开发者跑去用 Elasticsearch。但那又是另一个服务、另一套配置、另一个可能崩溃的环节。

Postgres 自带全文搜索,而且出奇地强大。

认识 TSVECTOR

它能帮你:

  • 为大量文本建立索引
  • 执行带权重的搜索
  • 支持词干提取(比如 “run” 和 “running”)
  • 基础模糊匹配(配合 pg_trgm)

适用场景:博客或帮助中心搜索

ALTER TABLE articles ADD COLUMN search TSVECTOR;

UPDATE articles
SET search = to_tsvector('english', title || ' ' || body);

添加索引:

CREATE INDEX search_idx ON articles USING GIN(search);

执行搜索:

SELECT title, ts_rank(search, plainto_tsquery('postgres vector magic')) AS rank
FROM articles
WHERE search @@ plainto_tsquery('postgres vector magic')
ORDER BY rank DESC
LIMIT 10;

真实排名
GIN 索引带来高速查询
无需任何外部服务

什么时候不理想:

  • 你追求类似 Google 的搜索体验和语义理解
  • 超大规模且要求实时索引

但对于大多数带有文章、文档或论坛的应用?这一招直接让 Elasticsearch 变成多余。

点击或按回车查看大图

https://miro.medium.com/v2/resize:fit:700/1*wHw3hTVg5t8O_6MIR6C9Dw.png

7. 使用认证、JWT 与行级安全:只用 SQL 实现登录流程

身份认证通常让人第一时间想到 Firebase Auth、Auth0,或者某个在测试环境总崩的冷门 OAuth 提供商。

但有了 Postgres,你可以仅靠 SQL 和几个扩展,搭建一个安全、生产级的登录系统。

用 pgcrypto 给密码加密

CREATE EXTENSION IF NOT EXISTS pgcrypto;

UPDATE users
SET password = crypt('plaintext_pw', gen_salt('bf'));

验证:

SELECT * FROM users
WHERE email = 'user@site.dev'
AND password = crypt('plaintext_pw', password);

用 pgjwt(或在应用层生成)处理 JWT

你可以在 Postgres 中存 JWT 密钥,甚至用 SQL 生成令牌,也可在 API 中间件层校验。

用行级安全(RLS)按用户隔离数据

ALTER TABLE todos ENABLE ROW LEVEL SECURITY;

CREATE POLICY user_owns_todo ON todos
USING (user_id = current_setting('app.current_user')::INT);

现在每个查询都会自动限定返回当前用户的数据。

这可以替代:

  • Firebase Auth
  • Auth0
  • 在三个微服务里写自定义认证中间件

温馨提示:

  • 如果你要对外提供 API,仍需妥善管理令牌
  • 非常适合中小型应用,不适合企业级 SSO 场景

8. 使用 Postgres 做分析、仪表盘和事件日志:不用再依赖 Google

你想知道用户点了哪些按钮、何时登录、落地页访问量多少?

你不需要 Google Analytics,不需要 Mixpanel,也不需要把数据传到某个可能卖给广告网络的黑盒子。

你完全可以在 Postgres 里搞定一切。

方案一:自建事件表

CREATE TABLE pageviews (
  path TEXT,
  user_id INT,
  viewed_at TIMESTAMPTZ DEFAULT now()
);

查询访问量:

SELECT path, COUNT(*)
FROM pageviews
GROUP BY path
ORDER BY count DESC;

方案二:使用 TimescaleDB 或 pgme

  • TimescaleDB → 高级时间序列数据库,与 Postgres 完全兼容
  • pgme → 专为 Postgres 设计的轻量分析工具(类似 DuckDB 的列式引擎)

适合:

  • 自定义仪表盘
  • 使用情况报告
  • 漏斗分析和留存曲线

优势:

  • 全都在你自己的技术栈内
  • 完全掌控数据
  • 不用应付像素屏蔽或广告追踪器

总结:一统江湖的“无聊”数据库

Postgres 不再只是一个数据库。它已悄然进化成一个 全能的后端平台

在 2025 年,为了做一个待办事项应用而部署 15 个不同服务,未免有些过度设计了。只要选对扩展,再用点 SQL,你就可以:

  • 定时执行任务
  • 缓存数据
  • 处理用户认证
  • 支持 AI 搜索
  • 构建 GraphQL 接口
  • 实现全文检索与排序
  • 追踪指标数据
  • 实时同步数据

所有功能,来自一个久经考验、免费、开源的系统,很可能你已经在用了。

别忘了,PostgreSQL 18 将会更加强大。
你可以在这里了解更多:

相关推荐

Postgres是个六边形战士,其他很多工具是没必要的

你只是想部署一个简单应用,一个仪表盘、一个聊天工具,或者个人项目。突然之间,你得启动Redis做缓存,上Elasticsearch做搜索,用Firebase实现实时同步,配置无服务器函数的...

PostgreSQL开发与实战(5)备份管理pg_probackup

作者:太阳一、pg_probackup概述pg_probackup是一款免费的postgres数据库集群备份工具,与其他备份工具相比,它主要有如下一些优势:提供增量备份,增量备份一定程度上可以节省磁...

了解 PostgreSQL 的 MVCC 可见性基本检查规则

1.引言根据VadimMikheev的说法,PostgreSQL的多版本并发控制(MVCC)是一种“在多用户环境中提高数据库性能的高级技术”。该技术要求系统中存在同一数据元组的多个“版本”,...

PostgreSQL初学者需要知道一些技巧

PostgreSQL作为一个优雅而且稳健的数据库越来越被大家所采纳,除了Mysql以外很多人都开始接触并学习PostgreSQL。但是PostgreSQL和传统的一些数据库系统还有有点点小小的鸿沟,有...

Python - 操作 PostgreSQL 数据库的基本方法与代码

本文记录在Python编程中操作PostgreSQL数据库的基本方法与实现代码,包括连接数据库、创建数据表、插入/更新/删除数据表中的记录、函数调用、存储过程调用及事务处理等。获取数据库首先把连接数据...

详解PostgreSQL 12.2时间点恢复 (PITR)

概述PostgreSQL提供了不同的方法来备份和恢复数据库,可以是某一时刻数据库快照的完整备份或增量备份,可以使用SQL转储或文件系统级别的备份,在增量备份的基础上还可以实现基于时间点恢复。这...

PostgreSQL 17即将发布,新功能Top 3

按照计划,PostgreSQL17即将在2024年9月份发布,目前已经发布了第三个Beta版本,新版本的功能增强可以参考ReleaseNotes。本文给大家分享其中3个重大的新...

PostgreSQL从入门到精通教程 - 第39讲:数据库完全恢复

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注...

PostgreSQL建库说明_postgresql能创建多少表

1.数据库逻辑结构介绍在一个PostgreSQL数据库系统中,数据库:一个PostgreSQL数据库服务下可以管理多个数据库,当应用连接到一个数据库时,一般只能访问这个数据库中的数据,而不能访问其他...

为什么delete后磁盘空间没有释放而truncate会释放?

背景因项目需求,需要清理一批旧数据,腾出空间给新数据,让同事负责这件事。料想会很顺利,但很快找到我,并告知在postgresql中把一张大的数据表删除掉了,查询表的size并没有改变。我震惊了,问他怎...

PostgreSQL技术内幕6:PostgreSQL索引技术

0.简介本文主要介绍PG的索引技术,包含PG支持的索引类型,语法,查看方式,以及其中B-Tree索引的原理解析和源码解读。1.PG索引类型介绍PG支持多种索引类型:B-tree、Hash、GiST、...

PostGreSQL历史_postgresql序列查询

1973UniversityINGRES(起源于IBMSystemR的一系列文档,MichaelStonebrakerandEugeneWong)1982INGRES1985...

Retool 如何升级主应用 4TB 的 PostgreSQL 数据库

本文最初发布于Retool官方博客。Retool的云托管产品基于一个在微软Azure云中运行的4TB的Postgres数据库。去年秋天,我们把这个数据库从Postgres9.6...

ArcGIS Desktop直连PostgreSQL安装及配置图解(windows)

目录1PostgreSQL11.0安装及配置2psqlODBC安装及配置3PostGIS安装及配置4pgAdmin4使用入门5空间数据导入5.1将PostgreSQL的bin文件路径添加...

基于patroni+etcd打造可自动故障转移的PostgreSQL集群

作者:杭州美创科技有限公司得益于PostgreSQL的开源特性,越来越多的第三方集群管理软件填补了PostgreSQL在集群方面的易用性和可靠性,patroni+etcd提供了一系列的集群管理方案。e...