# 关于 PostgreSQL

> PostgreSQL 的历史、许可、可靠性、SQL 支持、可扩展性，以及数据库背后的社区。

---

LLMS 索引： [llms.txt](/llms.txt)

---

<span id="intro-chapter-1" class="pdf-anchor"></span><span id="intro-page-4" class="pdf-anchor"></span>

PostgreSQL 是功能最丰富的自由开源数据库系统。它最初诞生于学术环境，多年来成功凝聚了庞大的开发者社区。如今，PostgreSQL 已具备大多数用户所需的全部功能，世界各地都在广泛使用它构建高负载、业务关键型系统。

## 历史回顾 {#intro-section-1-1}

今天的 PostgreSQL 源自 POSTGRES 项目，项目由加州大学伯克利分校教授 Michael Stonebraker 主持。在此之前，Michael Stonebraker 曾主持开发 INGRES，它是最早的关系数据库系统之一。POSTGRES 旨在重新思考之前的工作，解决 INGRES 僵化的类型系统所带来的局限。

项目始于 1985 年。到 1988 年，已有多篇学术论文发表，介绍其数据模型、POSTQUEL 查询语言（当时 SQL 尚未成为公认的标准）以及数据存储结构。

<span id="intro-page-5" class="pdf-anchor"></span>

POSTGRES 有时被视为所谓的后关系数据库系统。关系模型长期以来因其局限而受到批评，但这些局限是换取严谨与简洁不可避免的代价。随着计算机技术渗透到生活的各个领域，新型应用程序不断涌现，数据库也需要支持自定义数据类型，以及继承、创建和管理复杂对象等特性。

这个数据库系统的第一个版本于 1989 年问世。此后几年，系统不断改进和增强，但在 1993 年发布 4.2 版本后，项目便终止了。然而，尽管项目已正式取消，加州大学伯克利分校校友 Andrew Yu 和 Jolly Chen 仍利用其宽松的 BSD 许可证和开放的源代码，在 1994 年重启了项目并继续开发。他们用当时已成为公认标准的 SQL 替换了 POSTQUEL 查询语言，项目也更名为 Postgres95。

到了 1996 年，Postgres95 这个名字显然难以长久使用，于是项目选用了新名字：PostgreSQL。这个名字既体现了它与原始 POSTGRES 项目的联系，也体现了对 SQL 的采用。这个名字可能不太好念，但我们仍应将它读作“Post-Gres-Q-L”，或者简称“postgres”，而不是“postgre”。

PostgreSQL 的首个发行版沿用原来的编号体系，版本号为 6.0。随着项目发展，一小群活跃用户和开发者开始接手管理工作，这个群体被称为 PostgreSQL Global Development Group（PostgreSQL 全球开发组）。

<span id="intro-page-6" class="pdf-anchor"></span>

## 开发 {#intro-section-1-2}

关于 PostgreSQL 新版本开发与发布的所有重大决策，都由核心团队（Core team）作出。该团队目前由七人组成。

除了偶尔参与的贡献者，还有一批持续为 PostgreSQL 作出重要贡献的核心开发者，他们被称为主要贡献者（major contributors）。另有一批提交者（committers），拥有源代码仓库的写入权限。随着新开发者加入社区、其他开发者离开，这些群体的成员也在不断变化。当前的开发者名单公布在 PostgreSQL 官方网站上：[postgresql.org/community/contributors](<https://postgresql.org/community/contributors>)。

俄罗斯开发者对 PostgreSQL 的贡献十分突出。在俄罗斯开发者如此广泛参与的全球开源项目中，它可以说是规模最大的一个。

来自克拉斯诺亚尔斯克的程序员 Vadim Mikheev 曾是核心团队成员，在 PostgreSQL 的演进与开发中发挥了重要作用。他创建了多版本并发控制（MVCC）、清理（vacuum）、预写式日志（WAL）、子查询、触发器等关键核心功能。如今，Vadim 已不再参与这个项目。

2015 年，莫斯科国立罗蒙诺索夫大学施滕贝格天文研究所的专业天文学家、研究员 Oleg Bartunov，与 Teodor Sigaev 和 Alexander Korotkov 共同创办了 Postgres Professional 公司。如今，该公司已成为俄罗斯数据库系统开发领域的主要人才培养基地。

他们的主要贡献领域包括 PostgreSQL 本地化（各国字符编码与 Unicode 支持）、全文<span id="intro-page-7" class="pdf-anchor"></span>检索、数组和半结构化数据（hstore、json、jsonb）的处理，以及新的索引方法（GiST、SP-GiST、GIN 和 RUM、Bloom）。他们还开发了许多广受欢迎的扩展。

PostgreSQL 的发布周期通常约为一年。在此期间，社区会收到来自全球贡献者的补丁，包括错误修复、更新和新特性。按照惯例，所有补丁都会在 pgsql-hackers 邮件列表中讨论。如果社区认为某个想法有用、实现正确，而且代码通过了规定的、由其他开发者进行的代码审查，这个补丁就会被纳入下一个发行版。

在某个时间点（通常是春季，距发布约半年），项目会宣布进入代码稳定阶段：所有新特性推迟到下一版本，只接受错误修复以及对已纳入补丁的改进。在发布周期内，还会推出测试版（beta）。临近周期结束时，会构建一个候选发布版（release candidate），随后不久便会发布 PostgreSQL 的新主版本。

过去，主版本号由两个数字组成。2017 年，项目决定改用单个数字，因此 9.6 之后的版本是 PostgreSQL 10。目前最新的版本是 2024 年 9 月发布的 PostgreSQL 17。

在准备新版本的过程中，开发者可能会发现并修复其中的错误。最关键的修复会被移植到先前的版本中。社区通常每季度发布一次更新，这些次版本汇集了相应的修复。例如，12.5 版本包含对 12.4 版本的错误修复，而 17.1 版本则提供对 PostgreSQL 17.0 的修复。

<span id="intro-page-8" class="pdf-anchor"></span>

## 支持 {#intro-section-1-3}

PostgreSQL 全球开发组为每个主版本提供五年的支持。支持与开发工作都通过邮件列表组织。一份按要求提交的错误报告很可能很快得到处理；错误修复最快可在 24 小时内发布。

除社区支持外，不同国家的多家公司也提供 7×24 小时的 PostgreSQL 商业支持，其中包括 Postgres Professional（[www.postgrespro.com](<https://www.postgrespro.com>)）。

## 现状 {#intro-section-1-4}

PostgreSQL 是最受欢迎的数据库之一。依托学术研究奠定的坚实基础，经过数十年的发展，它已成长为企业级产品，如今已成为商业数据库切实可行的替代选择。不妨看看目前最新发行版 PostgreSQL 17 的主要特性，你就能亲自感受到这一点。

### 可靠性与稳定性 {#intro-subsection-1-4-1}

对于处理业务关键数据的企业级应用程序，可靠性尤为重要。为此，PostgreSQL 支持热备服务器、时间点恢复，以及多种复制方式（同步、异步和级联复制）。

<span id="intro-page-9" class="pdf-anchor"></span>

### 安全性 {#intro-subsection-1-4-2}

PostgreSQL 支持安全的 SSL 连接，并提供多种身份验证方式，包括密码验证（含 SCRAM）、客户端证书，以及外部身份验证服务（LDAP、RADIUS、PAM、Kerberos）。

在用户管理和数据库访问控制方面，PostgreSQL 提供以下功能：

- 创建和管理新用户及组角色

- 基于角色和组控制对数据库对象的访问

- 行级与列级安全性

- 通过内置的 SE-PostgreSQL 功能支持 SELinux（强制访问控制）

Postgres Professional 发布的一个定制 PostgreSQL 版本已获得俄罗斯联邦技术与出口管制局认证，可用于处理个人数据和涉密信息的数据处理系统。

### SQL 标准符合性 {#intro-subsection-1-4-3}

随着 ANSI SQL 标准不断演进，PostgreSQL 也在持续增加对它的支持。从 SQL-92 到最新的 SQL:2023，各个版本的标准都是如此。例如，PostgreSQL 17 完整支持 SQL:2016 标准中描述的所有 JSON 操作。

总体而言，PostgreSQL 对 SQL 标准的符合程度很高，支持 177 项必选特性中的 170 项，以及许多可选特性。

<span id="intro-page-10" class="pdf-anchor"></span>

### 事务支持 {#intro-subsection-1-4-4}

PostgreSQL 完整支持 ACID 特性，并基于多版本并发控制（MVCC）实现高效的事务隔离。除不同进程并发更新同一行的情况外，这种方法在所有其他情况下都能避免加锁。读事务从不阻塞写事务，写事务也从不阻塞读事务。

即使在最严格的可串行化隔离级别下，情况也是如此。该级别采用创新的可串行化快照隔离（Serializable Snapshot Isolation）机制，确保不会出现串行化异常，并保证并发执行事务的结果与顺序执行相同。

### 面向应用程序开发者 {#intro-subsection-1-4-5}

应用程序开发者可以借助丰富的工具集创建各类应用程序：

- 支持多种服务器端编程语言：内置的 PL/pgSQL（与 SQL 紧密集成）、适合性能关键任务的 C，以及 Perl、Python、Tcl、JavaScript、Java 等。

- 提供数据库访问 API，让几乎任何语言编写的应用程序都能访问数据库，其中包括标准的 ODBC 和 JDBC API。

- 提供丰富的数据库对象，可以在服务器端高效实现任意复杂程度的逻辑：表和索引、序列、完整性约束、视图和物化视图、分区、子查询和 WITH 查询（包括递归查询）、聚合函数和窗口函数、存储函数、触发器等。

<span id="intro-page-11" class="pdf-anchor"></span>

- 灵活的全文检索系统，支持多种语言，并配有高效的索引访问方法。

- 支持 NoSQL 中常见的半结构化数据：hstore（存储键值对）、xml、json（以文本形式或更强健的 jsonb 二进制格式表示）。

- 外部数据包装器（Foreign Data Wrappers）。这项功能允许按照 SQL/MED 标准，以外部表的形式添加新的数据源。任何主流数据库都可以作为外部数据源。PostgreSQL 提供对外部数据的完整支持，包括写入访问和分布式查询执行。

### 可伸缩性与性能 {#intro-subsection-1-4-6}

PostgreSQL 能够利用现代多核 CPU 架构。随着核心数量增加，其性能几乎呈线性增长。

PostgreSQL 可以并行执行查询和某些命令（例如创建索引和清理）。在这种模式下，读取和连接由多个并发进程执行。查询的即时编译（JIT）可以更充分地利用硬件资源，从而加快操作。每个 PostgreSQL 版本都会增加新的并行处理特性。

水平伸缩既可以依靠物理复制，也可以依靠逻辑复制。借助这些机制，可以构建基于 PostgreSQL 的集群，实现高性能、容错和跨地域分布。这类系统的例子包括 Citus（Citusdata）、Postgres-BDR（2ndQuadrant）、Multimaster 和 BiHA（Postgres Professional），以及 Patroni（Zalando）。

<span id="intro-page-12" class="pdf-anchor"></span>

### 查询规划器 {#intro-subsection-1-4-7}

PostgreSQL 使用基于代价的查询规划器。规划器利用收集到的统计信息，在数学模型中同时考虑磁盘操作和 CPU 时间，即使是最复杂的查询也能进行优化。先进商业数据库系统所具备的各种访问路径和连接方法，它都可以使用。

### 索引 {#intro-subsection-1-4-8}

PostgreSQL 提供多种类型的索引。除了传统的 B-树（B-tree），还可以使用许多其他访问方法。

- Hash：基于哈希的索引。与 B-树不同，这类索引只能用于等值检查，但在某些情况下可能更加高效、紧凑。

- GiST：一种通用的平衡搜索树。这种访问方法用于无法排序的数据。例如，R-树可以为平面上的点建立索引，支持快速的 k 近邻（k-NN）搜索，也可以为相互重叠的区间建立索引。

- SP-GiST：一种通用的非平衡树，将搜索空间划分为互不相交的嵌套分区。例如，用于空间数据的四叉树，以及用于文本字符串的基数树。

- GIN：一种通用倒排索引，用于包含多个元素的复合值。它主要用于全文检索，<span id="intro-page-13" class="pdf-anchor"></span>查找包含搜索查询中所用词语的文档。另一个例子是在数据数组中搜索元素。

- RUM：对 GIN 方法的增强，用于全文检索。这种索引以扩展形式提供，可以加速短语搜索，并按相关性顺序返回结果，无需额外计算。

- BRIN：一种紧凑的数据结构，在索引大小和搜索效率之间作出取舍。这种索引适用于规模庞大的聚簇表。

- Bloom：基于布隆过滤器的索引。它采用紧凑的表示方式，可以快速过滤掉不匹配的元组，但对剩余元组还需要再次检查。

许多索引类型既可以建立在单列上，也可以建立在多列上。无论哪种类型，索引不仅可以建立在列上，还可以建立在任意表达式上。也可以针对特定的行集合创建部分索引。覆盖索引能够加速查询，因为所需的全部数据都可以直接从索引中获取，无需访问堆。

规划器可以使用位图扫描，将多个索引组合起来，加快数据访问。

### 跨平台支持 {#intro-subsection-1-4-9}

PostgreSQL 既可以运行在 Unix 操作系统上（包括服务器和客户端 Linux 发行版、FreeBSD、Solaris 和 macOS），也可以运行在 Windows 系统上。

<span id="intro-page-14" class="pdf-anchor"></span>

其可移植的开源 C 代码使 PostgreSQL 能够在多种平台上构建，即使社区没有为这些平台提供软件包也不例外。

### 可扩展性 {#intro-subsection-1-4-10}

PostgreSQL 架构的一大优势是可扩展性。无需修改系统核心代码，用户就可以添加各种功能，例如：

- 数据类型

- 支持新数据类型的函数和操作符

- 索引访问方法和表访问方法

- 服务器端编程语言

- 外部数据包装器

- 可加载的扩展

完善的扩展支持使开发者能够实现任意复杂程度的新功能，按需安装，而无需修改 PostgreSQL 核心。例如，下列复杂系统都以扩展形式实现：

- CitusDB：实现大规模并行查询执行，以及不同 PostgreSQL 实例之间的数据分布（分片）。

- PostGIS：最流行、最强大的地理信息数据处理系统之一。

<span id="intro-page-15" class="pdf-anchor"></span>

- TimescaleDB：提供时间序列数据支持，包括专门的分区和分片功能。

仅 PostgreSQL 17 的标准发行版就包含约五十个经实践证明实用而可靠的扩展。

### 易于获取和使用 {#intro-subsection-1-4-11}

宽松的 PostgreSQL 许可证与 BSD、MIT 许可证类似，允许不受限制地使用 PostgreSQL；你也可以不受限制地修改 PostgreSQL 代码，并将其集成到其他产品中，包括商业软件和闭源软件。

### 独立性 {#intro-subsection-1-4-12}

PostgreSQL 不属于任何一家公司，而是由汇聚了世界各地开发者的国际社区共同开发。这意味着，使用 PostgreSQL 的系统不依赖某个特定供应商，因此能够在任何情况下保护已有投资。
