PostgreSQL
是什么
PostgreSQL 是一个成熟的开源关系型数据库,它将数据存储在带类型的表中,并对 SQL、事务和数据完整性提供强力支持。它以正确性、可扩展性以及 JSONB、全文搜索、窗口函数等丰富特性而著称。对于大多数需要可靠结构化数据的应用后端而言,它是默认的选择。
优势
- 默认提供 ACID 事务和强一致性。
- 强大的 SQL:连接、CTE、窗口函数和聚合。
- 灵活的类型,包括
JSONB、数组、范围和自定义类型。 - PostGIS(地理空间)和
pgvector(嵌入向量)等扩展。 - 强约束、外键和检查规则确保数据质量。
取舍
- 垂直扩展很容易;水平分片则需要额外的工具。
- 随着模型演进,需要进行模式迁移。
- 对于极小的项目,相比单文件数据库,运维更为沉重。
- 在高并发规模下,每客户端一个连接的模型需要连接池(PgBouncer)。
何时使用
对于几乎任何涉及关系型数据、事务或报表需求的应用,都可以把 PostgreSQL 作为默认选择:SaaS 后端、电商、分析,以及任何能从约束和连接中获益的场景。
与 vibe coding 的契合度
在指挥 AI 时,给出实体及其相互关系,然后让它产出一个规范化的模式,包含主键、外键、NOT NULL 约束和合理的索引。坚持使用参数化查询(绝不要用字符串拼接的 SQL)以防止注入,并让 AI 将多步写入包裹在一个事务中。一个好建议:告诉 AI 同时生成一个可回滚的迁移文件,并解释它添加的每个索引,让你在应用之前理解读写上的取舍。
CREATE TABLE users (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE orders (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
total NUMERIC(10,2) NOT NULL CHECK (total >= 0),
status TEXT NOT NULL DEFAULT 'pending'
);
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- 参数化查询(使用占位符,而非拼接)
SELECT o.id, o.total
FROM orders o
WHERE o.user_id = $1 AND o.status = $2;