«

都 2026 年了,数据库直接选 postgres 就行,不用 SQL 了

时间:2026-2-13 22:39     作者:独元殇     分类: 开发相关


欢迎关注我的公众号,名叫「串串狗小刊」

都 2026 年了,在 99% 的情况下,选择 postgres 才对!

我们在项目开发里,会遇到各种不同项目类型的解决方案,比如 缓存 Redis 、存大量文档 MongoDB ,消息队列就是 kafka ,搜索就是 elasticsearch ,向量数据库 就是 pinecone ,还有很多很多。

这些都是专用数据库!

但是..... 但是有个问题,你每类数据库的 查询语言、维护策略都不一样,甚至你还得每天轮流看 7 个仪表盘。《数据库泛滥》《数据库蔓延》!

而解决这个事儿, postgres 就是最优解!

尤其是现在这个 AI 时代。

我是搞 独立站出海 SaaS 的,现在严重依赖 AI 来给我写代码。

如果还是以前那样,很难快速启动一个万人用户规模的项目 demo 。当然,也不是很难,就是麻烦,配置又慢又麻烦,完后还得再挨个儿卸载。出了问题更是头疼!

当然,这些都是专业的专用数据库,不错,可是我觉得它们提升了很多的复杂性。

其实 99.99% 的项目根本用不到这么牛的东西。

这个时候直接来个 postgres 就 OK 了。全部都搞定了!

外网的大佬 Raja Rao DV 说:Postgres 扩展使用的算法与专用数据库相同甚至更优(在许多情况下)

比如这个对比:

img

很多性能都媲美专用数据库!(这些插件的平均寿命是 10 年左右,已经具备多年的生产环境稳定性了)

只需要这样就行了:

-- 全文搜索 BM25
CREATE EXTENSION pg_textsearch;

-- 向量 for AI
CREATE EXTENSION vector;
CREATE EXTENSION vectorscale;

-- RAG 应用需要的流水线
CREATE EXTENSION ai;

-- 时间
CREATE EXTENSION timescaledb;

-- 队列管理
CREATE EXTENSION pgmq;

-- 日程表
CREATE EXTENSION pg_cron;

-- GIS
CREATE EXTENSION postgis;

比如说 pg_textsearch 这个插件,你安装后,就可以获得和 Elasticsearch 完全相同的 BM25 算法!而且只需要使用 SQL 就行!

可能有差距,但很小,可以直接忽略,但带来的好处是 构建速度、维护方便性,都大幅度提升了!故障也容易排除了。

而且 Reddit、Instagram、Discord、Netflix、Spotify、Uber 这些海外大企业也都在用 posygreSQL !

大佬 Raja Rao 整理了一些安装代码,在 https://www.tigerdata.com/blog/its-2026-just-use-postgres 这篇文章里,我觉得非常有用!

下面是摘录:

全文搜索(替代 Elasticsearch)

扩展: pg_textsearch(真正的 BM25 排名算法)

您正在替换的是:

您将获得: 与 Elasticsearch 完全相同的 BM25 算法 ,直接在 Postgres 中运行。

-- Create table
CREATE TABLE articles (
  id SERIAL PRIMARY KEY,
  title TEXT,
  content TEXT
);

-- Create BM25 index
CREATE INDEX idx_articles_bm25 ON articles USING bm25(content)
  WITH (text_config = 'english');

-- Search with BM25 scoring
SELECT title, -(content <@> 'database optimization') as score
FROM articles
ORDER BY content <@> 'database optimization'
LIMIT 10;

混合搜索:BM25 + 向量,一查询搞定:

SELECT 
  title,
  -(content <@> 'database optimization') as bm25_score,
  embedding <=> query_embedding as vector_distance,
  0.7 * (-(content <@> 'database optimization')) + 
  0.3 * (1 - (embedding <=> query_embedding)) as hybrid_score
FROM articles
ORDER BY hybrid_score DESC
LIMIT 10;

这是 Elasticsearch 需要单独插件才能实现的功能。而在 Postgres 中,只需使用 SQL 即可。

向量搜索(替代 Pinecone)

扩展功能: pgvector + pgvectorscale

你所替换的:

你所获得的:pgvectorscale 采用 DiskANN 算法 (来自微软研究院),在 99%召回率下,实现了 p95 延迟降低 28 倍吞吐量提升 16 倍 的性能,优于 Pinecone。

-- Enable extensions
CREATE EXTENSION vector;
CREATE EXTENSION vectorscale CASCADE;

-- Table with embeddings
CREATE TABLE documents (
  id SERIAL PRIMARY KEY,
  content TEXT,
  embedding vector(1536)
);

-- High-performance index (DiskANN)
CREATE INDEX idx_docs_embedding ON documents USING diskann(embedding);

-- Find similar documents
SELECT content, embedding <=> '[0.1, 0.2, ...]'::vector as distance
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
LIMIT 10;

使用 pgai 自动同步嵌入:

SELECT ai.create_vectorizer(
  'documents'::regclass,
  loading => ai.loading_column(column_name=>'content'),
  embedding => ai.embedding_openai(model=>'text-embedding-3-small', dimensions=>'1536')
);

现在每次 INSERT/UPDATE 操作都会自动重新生成嵌入向量。无需同步作业。杜绝数据漂移。告别凌晨三点的告警通知。

时序数据库(替代 InfluxDB)

扩展组件: TimescaleDB(GitHub 星标数 21K+)

您将替代的是:

您将获得:自动时间分区、高达 90%的压缩率、持续聚合功能,以及完整的 SQL 支持。

-- Enable TimescaleDB
CREATE EXTENSION timescaledb;

-- Create table
CREATE TABLE metrics (
  time TIMESTAMPTZ NOT NULL,
  device_id TEXT,
  temperature DOUBLE PRECISION
);

-- Convert to hypertable
SELECT create_hypertable('metrics', 'time');

-- Query with time buckets
SELECT time_bucket('1 hour', time) as hour,
       AVG(temperature)
FROM metrics
WHERE time > NOW() - INTERVAL '24 hours'
GROUP BY hour;

-- Auto-delete old data
SELECT add_retention_policy('metrics', INTERVAL '30 days');

-- Compression (90% storage reduction)
ALTER TABLE metrics SET (timescaledb.compress);
SELECT add_compression_policy('metrics', INTERVAL '7 days');

缓存(替代 Redis)

功能特性: 非日志表 + JSONB

-- UNLOGGED = no WAL overhead, faster writes
CREATE UNLOGGED TABLE cache (
  key TEXT PRIMARY KEY,
  value JSONB,
  expires_at TIMESTAMPTZ
);

-- Set with expiration
INSERT INTO cache (key, value, expires_at)
VALUES ('user:123', '{"name": "Alice"}', NOW() + INTERVAL '1 hour')
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;

-- Get
SELECT value FROM cache WHERE key = 'user:123' AND expires_at > NOW();

-- Cleanup (schedule with pg_cron)
DELETE FROM cache WHERE expires_at < NOW();

消息队列(替代 Kafka)

扩展组件:pgmq

CREATE EXTENSION pgmq;
SELECT pgmq.create('my_queue');

-- Send
SELECT pgmq.send('my_queue', '{"event": "signup", "user_id": 123}');

-- Receive (with visibility timeout)
SELECT * FROM pgmq.read('my_queue', 30, 5);

-- Delete after processing
SELECT pgmq.delete('my_queue', msg_id);

或者原生的 SKIP LOCKED 模式:

CREATE TABLE jobs (
  id SERIAL PRIMARY KEY,
  payload JSONB,
  status TEXT DEFAULT 'pending'
);

-- Worker claims job atomically
UPDATE jobs SET status = 'processing'
WHERE id = (
  SELECT id FROM jobs WHERE status = 'pending'
  FOR UPDATE SKIP LOCKED LIMIT 1
) RETURNING *;

文档(替代 MongoDB)

功能特性: 原生 JSONB

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  data JSONB
);

-- Insert nested document
INSERT INTO users (data) VALUES ('{
  "name": "Alice",
  "profile": {"bio": "Developer", "links": ["github.com/alice"]}
}');

-- Query nested fields
SELECT data->>'name', data->'profile'->>'bio'
FROM users
WHERE data->'profile'->>'bio' LIKE '%Developer%';

-- Index JSON fields
CREATE INDEX idx_users_email ON users ((data->>'email'));

地理空间(替代专业地理信息系统)

扩展功能:PostGIS

CREATE EXTENSION postgis;

CREATE TABLE stores (
  id SERIAL PRIMARY KEY,
  name TEXT,
  location GEOGRAPHY(POINT, 4326)
);

-- Find stores within 5km
SELECT name, ST_Distance(location, ST_MakePoint(-122.4, 37.78)::geography) as meters
FROM stores
WHERE ST_DWithin(location, ST_MakePoint(-122.4, 37.78)::geography, 5000);

定时任务(替代 Cron)

扩展功能: pg_cron

CREATE EXTENSION pg_cron;

-- Run every hour
SELECT cron.schedule('cleanup', '0 * * * *', 
  $$DELETE FROM cache WHERE expires_at < NOW()$$);

-- Nightly rollup
SELECT cron.schedule('rollup', '0 2 * * *',
  $$REFRESH MATERIALIZED VIEW CONCURRENTLY daily_stats$$);

混合搜索(BM25 + 向量)

对于 AI 应用,您通常需要同时具备关键词搜索和语义搜索功能:

-- Reciprocal Rank Fusion: combine keyword + semantic search
WITH bm25 AS (
  SELECT id, ROW_NUMBER() OVER (ORDER BY content <@> $1) as rank
  FROM documents LIMIT 20
),
vectors AS (
  SELECT id, ROW_NUMBER() OVER (ORDER BY embedding <=> $2) as rank  
  FROM documents LIMIT 20
)
SELECT d.*, 
  1.0/(60 + COALESCE(b.rank, 1000)) + 
  1.0/(60 + COALESCE(v.rank, 1000)) as score
FROM documents d
LEFT JOIN bm25 b ON d.id = b.id
LEFT JOIN vectors v ON d.id = v.id
WHERE b.id IS NOT NULL OR v.id IS NOT NULL
ORDER BY score DESC LIMIT 10;

若用 Elasticsearch + Pinecone 实现此功能,您将需要两次 API 调用、结果合并、故障处理,并承受双倍延迟。

在 Postgres 中:一次查询,一个事务,一个结果。

模糊搜索(容错拼写)

扩展功能: pg_trgm(内置于 Postgres)

CREATE EXTENSION pg_trgm;

CREATE INDEX idx_name_trgm ON products USING GIN (name gin_trgm_ops);

-- Finds "PostgreSQL" even with typo
SELECT name FROM products
WHERE name % 'posgresql'
ORDER BY similarity(name, 'posgresql') DESC;

图遍历(替代图数据库)

功能: 递归 CTE

-- Find all reports under a manager (org chart)
WITH RECURSIVE org_tree AS (
  SELECT id, name, manager_id, 1 as depth
  FROM employees WHERE id = 42

  UNION ALL

  SELECT e.id, e.name, e.manager_id, t.depth + 1
  FROM employees e
  JOIN org_tree t ON e.manager_id = t.id
  WHERE t.depth < 10
)
SELECT * FROM org_tree;

标签: 原创 postgres