作为一个开发者(不懂底层数据库细节的那种),如果让我选一个数据库,Postgres绝对是首选。为啥? 开源免费+丰富的生态支持
最近的项目里,我一直在使用postgres作为我的后端关系数据库,没有遇到任何难以解决的问题,因此我想将它推荐给大家!

PostgreSQL 并不是一个简单的关系型数据库,而是一个数据管理的抽象框架,具有吞噬整个数据库世界的力量。而这也是正在发生的事情
OLAP:citus分布式插件,ANSI SQL兼容,窗口函数,CTE,CUBE等高级分析功能,任意语言写UDF
流处理:PipelineDB扩展,Notify-Listen,物化视图,规则系统,灵活的存储过程与函数编写
时序数据:timescaledb时序数据库插件,分区表,BRIN索引
空间数据:PostGIS扩展(杀手锏),内建的几何类型支持,GiST索引。
搜索索引:全文搜索索引足以应对简单场景;丰富的索引类型,支持函数索引,条件索引
NoSQL:JSON,JSONB,XML,HStore原生支持,至NoSQL数据库的外部数据包装器
数据仓库:能平滑迁移至同属Pg生态的GreenPlum,DeepGreen,HAWK等,使用FDW进行ETL
PostgreSQL支持SQL标准,同时还提供了很多高级功能,例如复杂查询、触发器、视图、事务和多版本并发控制等
docker部署postgreSQL
docker run -id --name=postgresql -v postgre-data:/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e LANG=C.UTF-8 postgres
丰富的ORM支持
Django
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
sqlalchemy
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
go GORM
import "gorm.io/gorm"
type User struct {
gorm.Model
Name string
Email string `gorm:"unique"`
}
db, _ := gorm.Open(postgres.Open("host=localhost user=gorm"), &gorm.Config{})
企业级开源
与许多"免费但功能受限"的开源数据库不同,PostgreSQL 采用了极其宽松的 BSD 许可证。这意味着:
完全免费,没有任何使用限制
可以用于商业项目,无需担心授权费用
功能不会因为"社区版"而被阉割
PostgreSQL 技术详解
Why PostgreSQL Is the Bedrock for the Future of Data | TigerDataPostgreSQL 是什么?数据库介绍 | Google Cloud什么是 PostgreSQL?
PostgreSQL(常称 Postgres)是一款开源的对象-关系型数据库管理系统(ORDBMS),由 PostgreSQL Global Development Group 维护。它首次发布于 1996 年,具有事务(ACID)、外键约束、触发器、视图、物化视图、存储过程等完整功能,并在多个操作系统上稳定运行,如 Windows、Linux、macOS、FreeBSD 等。
PostgreSQL 被设计为高度可扩展且符合 SQL 标准,适用于从单机部署到数据仓库、大型并发 Web 服务等各种使用场景。
PostgreSQL 的主要功能与特色
1. 完整的事务与并发控制(MVCC)
PostgreSQL 内置支持 ACID 事务,采用多版本并发控制(MVCC)机制进行并发管理,避免读写锁冲突,即使在高并发写入场景下也能保持高一致性与稳定性。
2. 丰富的数据类型和扩展能力
PostgreSQL 原生支持多种高级数据类型,包括数组、枚举、XML、网络地址类型(IPv4/IPv6)、几何类型以及 JSON/JSONB(二进制 JSON)。同时支持用户自定义类型、函数以及运算符,可以扩展到几乎无限制的应用领域。借助 FDW(Foreign Data Wrapper),它还能查询外部数据库或服务。
3. 多样的索引机制
不仅支持常见的 B-tree 和哈希索引,还提供表达式索引、部分索引、GIN、GiST、SP‑GiST、BRIN 等高级索引结构。可以针对 JSONB、全文检索或地理空间数据进行高效查询。
4. 高度可扩展的插件生态
支持 PL/pgSQL、PL/Python、PL/Perl 等多种存储过程语言,用户可开发自定义插件或扩展(如 PostGIS、hstore、RLS 等),甚至可以实现自定义索引类型。
5. 强大的安全机制
具备完善的角色权限管理,可设置列级和行级访问控制(Row-Level Security)。支持多种外部认证方式(如 SSL、Kerberos、LDAP、PAM、证书等),并提供 Audit 插件扩展审计功能。
6. 支持事务性 DDL 与复制机制
支持将 ALTER、DROP、CREATE 等 DDL 操作纳入事务块,可在失败时回滚。内置 WAL(Write-Ahead Log)逻辑复制机制,支持同步或异步备节点,实现高可用读扩展。
PostgreSQL 相较 MySQL 的优势(关键对比)
• SQL 标准兼容性更强
PostgreSQL 支持完整的标准 SQL 特性,如窗口函数、CTE(WITH 子查询)、INTERSECT、FULL OUTER JOIN 等,而 MySQL 在某些特性上有限制或不支持。
• 数据完整性更严格
PostgreSQL 默认全局 ACID 支持,数据类型严格,有效防止异常数据写入。MySQL 的 ACID 支持依赖于 InnoDB 引擎。
• 更优的并发控制与性能表现
PostgreSQL 的 MVCC 实现无需读锁,读写分离效果更好,整体在写多读多场景下往往表现优异。MySQL 虽也支持 MVCC(主要在 InnoDB 上),但在超高并发写入时容易产生锁冲突。
• 更丰富的数据类型与功能扩展
PostgreSQL 在地理空间(PostGIS)、数组、JSONB、网络地址、枚举、自定义类型等方面提供更多功能,即使是复杂应用,数据建模也更加灵活。MySQL 虽支持 JSON,但功能和性能略逊一筹。
• 多种高级索引支持
PostgreSQL 支持表达式索引、部分索引、GIN、GiST、BRIN 等高级结构,更便于针对复杂查询进行性能优化;MySQL 主要依赖 B-tree 和 R-tree。
• 可扩展性与生态活跃
PostgreSQL 社区非常活跃,不断推出新的扩展和插件(如 PostGIS、Citus、pgvector 等)。其扩展系统允许创建自定义函数、操作符、数据类型和索引类型。
• 更严格与灵活的安全控制
PostgreSQL 提供更全面的行级安全、角色管理、外部认证方式以及审计扩展,适合对安全要求严格的场景。
PostgreSQL 常见基础用法示例
下面示例基于 PostgreSQL 15 或更高版本编写,适合同入门和基本开发。
1. 安装与连接
sudo apt install postgresql
sudo systemctl start postgresql
sudo -u postgres psql
2. 用户与数据库管理
-- 创建用户
CREATE ROLE demo_user WITH LOGIN PASSWORD 'secret';
-- 创建数据库,并指定所有者为 demo_user
CREATE DATABASE demo_db OWNER demo_user;
3. 表结构设计与数据插入
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
extra JSONB,
created_at TIMESTAMPTZ DEFAULT now()
);
INSERT INTO users (name, extra)
VALUES ('Alice', '{"age":30}'), ('Bob', '{"age":25}');
4. 查询示例:JSONB、窗口函数与 CTE
-- JSONB 查询
SELECT name FROM users WHERE extra ->> 'age' = '30';
-- 使用 CTE 与窗口函数查询排名
WITH ranked AS (
SELECT name, created_at,
ROW_NUMBER() OVER (ORDER BY created_at) AS rn
FROM users
)
SELECT * FROM ranked WHERE rn <= 10;
5. 创建高级索引
-- 表达式索引
CREATE INDEX idx_lower_name ON users ((lower(name)));
-- GIN 索引提升 JSONB 查询性能
CREATE INDEX idx_users_jsonb ON users USING GIN (extra);
6. 存储过程示例(PL/pgSQL)
CREATE FUNCTION add_user(n TEXT, a JSONB) RETURNS VOID AS $$
BEGIN
INSERT INTO users (name, extra) VALUES (n, a);
END;
$$ LANGUAGE plpgsql;
7. 使用外部数据封装器(FDW)查询远程数据源
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
CREATE SERVER remote_srv FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'remote.host', dbname 'otherdb', port '5432');
CREATE USER MAPPING FOR CURRENT_USER SERVER remote_srv
OPTIONS (user 'remote_user', password 'chooseStrong');
IMPORT FOREIGN SCHEMA public FROM SERVER remote_srv INTO local_schema;
SELECT * FROM local_schema.remote_table;
func main() {
db, err := sql.Open("pgx","postgres://localhost:5432/postgres")
if err != nil {
log.Fatal(err)
}
defer db.Close()
}
总结建议
PostgreSQL 是一款功能完备、性能可靠、扩展性强的开源数据库,特别适合需要复杂查询、严格事务一致性和灵活数据建模的场景。而 MySQL 则在轻量级 Web 应用、读密集型场景、入门学习和资源受限条件下表现更优。
如果你准备在项目中实际使用 PostgreSQL,或想深入了解性能调优、备份恢复、高可用方案以及大型集群部署,欢迎进一步提问。
该文章在 2025/8/6 16:39:39 编辑过