Postgres是个六边形战士,其他很多工具是没必要的
itomcoil 2025-09-03 00:06 3 浏览
你只是想部署一个简单应用,一个仪表盘、一个聊天工具,或者个人项目。突然之间,你得启动 Redis 做缓存,上 Elasticsearch 做搜索,用 Firebase 实现实时同步,配置无服务器函数的定时任务,接入 Auth0 处理登录,搭建 GraphQL 服务,再引入某个来路不明的 Cookie 追踪分析工具,最后收获一张能供你喝一年咖啡的账单。
Postgres 现在能搞定上述大部分功能,而且它真的做得不错。
没错,就是那个被编程训练营导师评价为“还行,不过有点过时”的老古董 SQL 数据库。它已经悄悄进化成了后端猛兽。只要搭配合适的扩展和最佳实践,你可以用纯 SQL 替换掉十多个工具、服务和 SaaS 订阅,把所有功能集中在一个地方运行。
没有炒作。没有脆弱的技术栈。只有被低估的、由 SQL 驱动的简洁方案。
本文涵盖内容:
- 总结 一图看懂 Postgres 能替代什么
- 灵活的 JSONB 架构 让非结构化数据也能享受 SQL 查询
- 使用 pg_cron 实现任务调度 告别 crontab 的定时任务管理
- 通过无日志表实现缓存 拥有 Redis 级速度,但不用装 Redis
- 使用 pgvector 实现 AI 向量搜索 在数据库里玩转 RAG 魔法
- 借助 TSVECTOR 实现全文搜索 自己动手打造搜索引擎
- 认证、JWT 与行级安全 仅用 SQL 实现登录流程
- 分析与仪表盘 无需外传数据即可追踪用户行为
- 总结 + 对照表 一览被替代的工具及后续方向
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 将会更加强大。
你可以在这里了解更多:
- 上一篇:PostgreSQL开发与实战(5)备份管理pg_probackup
- 已经是最后一篇了
相关推荐
- 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...
- 一周热门
- 最近发表
-
- Postgres是个六边形战士,其他很多工具是没必要的
- PostgreSQL开发与实战(5)备份管理pg_probackup
- 了解 PostgreSQL 的 MVCC 可见性基本检查规则
- PostgreSQL初学者需要知道一些技巧
- Python - 操作 PostgreSQL 数据库的基本方法与代码
- 详解PostgreSQL 12.2时间点恢复 (PITR)
- PostgreSQL 17即将发布,新功能Top 3
- PostgreSQL从入门到精通教程 - 第39讲:数据库完全恢复
- PostgreSQL建库说明_postgresql能创建多少表
- 为什么delete后磁盘空间没有释放而truncate会释放?
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)