专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

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

ins518 2025-10-08 18:30:00 技术文章 19 ℃ 0 评论

你只是想部署一个简单应用,一个仪表盘、一个聊天工具,或者个人项目。突然之间,你得启动 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 将会更加强大。
你可以在这里了解更多:

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表