网站首页 > 技术文章 正文
你只是想部署一个简单应用,一个仪表盘、一个聊天工具,或者个人项目。突然之间,你得启动 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 将会更加强大。
你可以在这里了解更多:
猜你喜欢
- 2025-10-08 一个人最好的修养,遇事不纠缠,事过翻篇。
- 2025-10-08 在 JavaScript 中 if else, 三元运算符、switch如何选择
- 2025-10-08 海岛上,叫响“看我的”“跟我上”
- 2025-10-08 双色球2025113期,温号码大步回补,蓝球看好中前段
- 2025-10-08 颠覆前端开发!3秒克隆任何网站为React应用的AI神器
- 2025-10-08 前段时间,包工头老李通过中间人的介绍承接了一个工程,约定好给
- 2025-10-08 9500F配什么主板合适?_9500 9500f
- 2025-10-08 前端调试工具有哪些?常用前端调试工具推荐、前端调试工具对比
- 2025-10-08 ReactNode、JSX.Element 和 ReactElement 的正确用法
- 2025-10-08 CSS锚点定位:前端布局的革命性突破
你 发表评论:
欢迎- 最近发表
-
- Three.js vs Unity:工业可视化为何选择Web方案?
- 一款全新Redis UI可视化管理工具,支持WebUI和桌面——P3X Redis UI
- 时间线可视化实战:三款AI工具实测,手把手教你制作人生轨迹图
- 【推荐】一款可视化在线 Web 定时任务管理平台,支持秒级任务设置
- 重磅更新!FastDatasets 推出可视化 Web 界面
- 模具设计之UG钣金实例教程(3)_ug钣金基础教程
- 前端基于 RBAC 模型的权限管理实现
- 别再把JWT存在localStorage里了!2025年前端鉴权新思路
- 模具设计之曲面造型中不圆润的曲面如何处理技巧
- 9个专业级别的CSS技巧区分了解和精通的鸿沟
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)