PostgreSQL
PostgreSQL 是一个开源的对象关系型数据库管理系统(ORDBMS),由美国加州大学伯克利分校的 POSTGRES 研究项目衍生而来。它以支持事务、外键、触发器、自定义数据类型与函数等特性著称,使用者可在自由许可证下免费使用、修改和分发。经过三十余年开发,它被广泛应用于网站、地理信息与科学数据管理等场景,2025 年 9 月的最新版本为 PostgreSQL 18。
定义
PostgreSQL 是一种对象关系型数据库管理系统,源自美国加州大学伯克利分校计算机科学系编写的 POSTGRES 第 4.2 版,并在此基础上以开源方式继续演进[1]。它支持 SQL 标准的很大一部分,除表、行等关系模型要素外,还允许存储自定义类型、函数和复杂数据结构,因此被归入对象关系型而非纯粹关系型数据库[1]。系统自 2001 年起符合 ACID 特性,可在所有主流操作系统上运行[2]。
在数据结构上,PostgreSQL 内建整数、数值、字符串、布尔值、日期时间、数组、范围、UUID、JSON 与 JSONB、XML、几何类型等多种类型,使用者还可自行定义复合类型[2]。数据库对象按“模式”这一命名空间组织,属于同一数据库下的表、索引等可分组存放于不同模式中。访问控制通过角色与权限体系实现,支持列级与行级安全策略[2]。
原理
PostgreSQL 内部依靠多版本并发控制(MVCC)维持数据一致性,这与传统数据库依靠锁控制并发的做法不同。每个事务读取的是数据在某一时点的快照,从而不会看到其他并发事务尚未提交的修改,会话由此获得事务隔离。其直接效果是读写互不阻塞:为查询取得的锁与为写入取得的锁并不冲突,读操作不会挡住写操作,写操作也不会挡住读操作。
在隔离级别上,SQL 标准规定的 4 个级别都可以指定,但内部实际实现为读已提交与可串行化两种,选择读未提交时会按读已提交处理,选择可重复读时会得到可串行化的强度,实际隔离可能严于所要求的级别。读已提交是默认级别,一条查询只能看到其开始之前已提交的数据,同一事务内先后两条查询也可能读到不同的结果。可串行化级别保证每个事务看到完全一致的数据库视图,但遇到并发更新时需要应用重试事务[3]。
存储与恢复方面,系统借助写前日志(WAL)记录变更,支持异步、同步与逻辑复制,以及时间点恢复和活动备用能力[2]。索引层面提供 B 树、哈希,以及 GiST、GIN、SP-GiST、BRIN 等访问方法,并支持表达式索引、部分索引、仅索引扫描与 K 近邻检索[4]。查询优化器会综合使用多个索引,通过内存中的位图操作完成复杂查询[4]。
PostgreSQL 18 引入了新的异步 I/O 子系统,允许数据库并发发出多个读取请求而不再逐个等待,覆盖顺序扫描、位图堆扫描和清理等操作,基准测试中部分场景的读取性能提升可达 3 倍[5]。新参数 io_method 可在 worker、io_uring 等方法之间切换,也可选用 sync 保持原有行为[5]。
发展历程
系统的前身是伯克利分校的 POSTGRES 项目,由 Michael Stonebraker 教授领导,受美国国防高级研究计划局、陆军研究办公室、国家科学基金会及 ESL 公司资助,实现工作始于 1986 年[6]。第一个演示系统在 1987 年投入运行,1988 年在 ACM-SIGMOD 会议上展示,1.0 版于 1989 年 6 月提供给少量外部用户[6]。2.0 版在 1990 年 6 月发布并采用重新设计的规则系统,3.0 版于 1991 年出现,增加了对多种存储管理器的支持[6]。
1993 年外部用户规模几乎翻倍,维护原型代码的负担挤占了研究时间,伯克利项目以 4.2 版正式结束[6]。1994 年,Andrew Yu 与 Jolly Chen 为其加入 SQL 语言解释器,随后以 Postgres95 之名在互联网上发布,代码全部使用 ANSI C 编写,体积缩减约 25%[6]。1996 年名称改为 PostgreSQL,以体现与最初 POSTGRES 的渊源和 SQL 能力,版本号也回到 6.0 以接续伯克利时期的序列[7]。
许可证问题在 2009 年引发讨论,当时有发行版将其归为 MIT 许可证,而其条款并不完全一致;为解决这一分歧,项目向开源促进会申请将 PostgreSQL License 认定为独立许可证,并于 2010 年 2 月获得认可[8]。此后版本持续迭代,9.4 版引入 JSONB 类型,18 版于 2025 年 9 月 25 日由 PostgreSQL 全球开发组发布[9]。截至 2025 年 9 月发布的 18 版,系统已符合 SQL:2023 核心标准 177 项强制性功能中的至少 170 项[2]。
应用
PostgreSQL 运行于所有主流操作系统,从 Linux、Windows、FreeBSD、OpenBSD、NetBSD、macOS 到 AIX、Solaris 等平台均有支持[10]。客户端接口覆盖 C、C++、Java、JavaScript、ODBC、Perl、PHP、Python、Ruby 等多种语言,便于与既有应用集成[10]。
地理空间数据是典型用途之一,流行的 PostGIS 扩展在 PostgreSQL 之上提供空间数据的存储与查询能力[2]。天文等科学领域也使用它管理大规模观测数据,其自定义函数可返回整张表,配合式索引、部分索引和表分区处理巨型数据表[10]。在伯克利时期,POSTGRES 就曾用于财务数据分析、喷气发动机性能监控、小行星跟踪、医疗信息与多个地理信息系统[6]。
由于 PostgreSQL License 允许免费使用、修改与分发,商业软件也可将其嵌入产品之中而不受限制[1]。高可用部署可借助核心的流复制与逻辑复制,也可使用 repmgr、Slony-I、Bucardo 等外部工具管理复制集群[4]。
局限
PostgreSQL 核心不包含同步多主复制,需要这类能力的场景要依赖 Postgres-XC、Postgres-XL、Postgres-R 等基于其代码的分支项目[4]。异步触发器复制方案在核心复制能力扩展后仍然存在,用于不适合整簇二进制复制的场合[4]。
MVCC 也带来使用上的约束:由于读操作不加锁,一行数据被查询返回并不意味着它此刻仍然存在,在返回之后、事务提交之前都可能被其他已提交事务修改或删除,需要锁定该行时必须显式使用 SELECT FOR UPDATE 之类的语句[3]。读已提交模式下,更新语句可能看到影响目标行的并发修改,却看不到这些事务对其他行的改动,因而并不适合涉及复杂检索条件的语句。
标准符合性亦非完全一致:项目以不与既有特性冲突、不导致糟糕架构决策为前提追求符合 SQL 标准,部分功能在语法或函数上存在差异,目前也没有关系数据库完全符合 SQL:2023 核心标准[2]。此外,自定义索引方法虽然可行,但创建过程较为复杂[4]。
参见
参考资料
- intro-whatis [引用日期2026-10-29]
- PostgreSQL:关于 [引用日期2026-10-29]
- git.postgresql.org Git - postgresql-pgindent.git/blame [引用日期2026-10-29]
- PostgreSQL [引用日期2026-10-29]
- PostgreSQL: PostgreSQL 18 Press Kit [引用日期2026-10-29]
- A Brief History of PostgreSQL [引用日期2026-10-29]
- PostgreSQL:文档:18:2. PostgreSQL 简史 [引用日期2026-10-29]
- PostgreSQL License [引用日期2026-10-29]
- 市场领先者MySQL的挑战者:PostgreSQL的崛起 [引用日期2026-10-29]
- – PostgreSQLは最初期のRDBMSとして知られるIngresに端を発し ている [引用日期2026-10-29]