PostgreSQL 教程

PostgreSQL 简介

PostgreSQL 是一款强大且多功能的开源关系型数据库管理系统 (RDBMS),在现代数据管理中发挥着举足轻重的作用。

1. PostgreSQL 简史

PostgreSQL 的旅程始于 1986 年的加州大学伯克利分校 (UC Berkeley),在 Michael Stonebraker 教授的指导下进行。该项目最初被命名为 Ingres(交互式图形与检索系统 Interactive Graphics and Retrieval System),旨在解决当时现有数据库系统的各种局限性。

1.1 Ingres 及其继任者

Ingres 对数据库技术做出了重大贡献。然而,Stonebraker 和他的团队希望能突破其原有的限制,这促成了 1986 年 Postgres 的诞生。Postgres 引入了几个关键的创新:

  • 规则系统 (Rule system): 允许进行复杂的数据操作并强制执行数据完整性。
  • 对象-关系特性 (Object-relational features): 将面向对象的概念引入并扩展了传统的关系模型。
  • 可扩展性 (Extensibility): 允许用户定义自己的数据类型和函数。

1.2 PostgreSQL:开源演进

1996 年,Postgres 被重新命名为 PostgreSQL,以反映其不断扩展的功能以及对 SQL 标准的采用。该项目转型为开源模式,这培育了一个充满活力的开发者和用户社区。这种开源性质对于 PostgreSQL 的持续演进和广泛采用起到了至关重要的作用。

1.3 关键里程碑

  • 21世纪初: 作为一个可靠且功能丰富的数据库解决方案,开始获得广泛关注。
  • 持续开发: 在开源社区的推动下,在性能、可扩展性和特性方面不断进步。
  • 现代: PostgreSQL 现在是领先的 RDBMS 之一,被企业和初创公司广泛使用。

2. PostgreSQL 的核心特性

PostgreSQL 拥有一系列丰富的功能,使其成为一个强大且多功能的数据库系统。让我们来看看其中最重要的一些特性。

2.1 SQL 兼容性与扩展

PostgreSQL 紧密遵循 SQL 标准,同时还提供了超越标准的丰富扩展。

  • 完全的 SQL 兼容性: 支持广泛的 SQL 特性,包括复杂查询、事务和数据完整性约束。
  • 扩展插件 (Extensions): 提供了一个丰富的扩展生态系统,可以增加诸多功能,例如:
    • PostGIS: 用于地理空间数据管理。
    • JSON 支持: 用于处理半结构化数据。
    • 全文搜索 (Full-text search): 提供高级的文本搜索能力。

2.2 数据完整性与可靠性

PostgreSQL 非常重视数据的完整性和可靠性。

  • ACID 兼容性: 保证事务的原子性 (Atomicity)、一致性 (Consistency)、隔离性 (Isolation) 和持久性 (Durability),确保数据的准确性和一致性。
  • 并发控制: 使用多版本并发控制 (MVCC) 允许大量用户同时访问和修改数据,而不会相互干扰。
  • 预写式日志 (Write-Ahead Logging, WAL): 确保在将更改应用到数据库之前,先将其写入日志。这为系统故障提供了强大的恢复能力。

2.3 可扩展性与自定义

PostgreSQL 被设计成高度可扩展的,允许用户根据具体需求对其进行量身定制。

  • 用户定义类型 (User-Defined Types): 允许用户定义自己的数据类型,扩大了可以存储和操作的数据范围。
  • 用户定义函数 (User-Defined Functions): 允许用户使用各种语言(例如 SQL、Python、C 语言)创建自定义函数来执行特定操作。
  • 运算符 (Operators): 支持创建自定义运算符,以便对数据执行专门的操作。

2.4 高级数据类型

PostgreSQL 支持广泛的内置数据类型,并允许创建自定义类型。我们将在模块 5 中深入探讨这些数据类型。

  • 基础类型: 包括整数 (integers)、浮点数 (floating-point numbers)、字符串 (strings)、日期 (dates) 和布尔值 (booleans)。
  • 高级类型: 支持数组 (arrays)、JSON、hstore(键值对)以及几何数据类型。

2.5 并发控制

PostgreSQL 的 MVCC (多版本并发控制) 是一个关键特性,它能在不产生读/写冲突的情况下实现高并发。

  • MVCC 的工作原理: 每个事务都会看到数据库在特定时间点的一个“快照”。当一行数据被更新时,系统会创建该行的一个新版本,同时保留旧版本供其他需要的事务使用。这消除了对“读锁”的需求,允许读取者和写入者同时操作。
  • 隔离级别: PostgreSQL 支持不同的事务隔离级别,允许你控制事务之间的隔离程度。这些级别将在模块 7 中详细介绍。

3. 代码示例:自定义数据类型

想象一下,你正在构建一个电子商务平台,并且需要存储产品的物理尺寸(长度、宽度、高度)。你可以创建一个名为 dimension(尺寸)的自定义数据类型来表示它:

-- 创建一个名为 dimension 的自定义数据类型
-- 包含 length (长度), width (宽度) 和 height (高度) 三个数值字段
CREATE TYPE dimension AS (
    length NUMERIC,
    width NUMERIC,
    height NUMERIC
);

然后,在创建数据表时,你就可以直接使用这个新定义的数据类型:

-- 创建 products (产品) 表
CREATE TABLE products (
    id SERIAL PRIMARY KEY,    -- 自动递增的主键 ID
    name VARCHAR(255),        -- 产品名称,最大长度 255 的字符串
    dimensions dimension      -- 使用我们刚刚创建的 dimension 自定义数据类型
);

这让你能够以结构化和高效的方式存储及查询产品尺寸。

4. 使用 PostgreSQL 的优势

PostgreSQL 提供了许多优势,使其成为各种应用的热门选择。

4.1 开源与社区驱动

  • 无许可费用: 作为开源软件,PostgreSQL 免去了昂贵的授权费用,降低了总体拥有成本 (TCO)。
  • 活跃的社区: 庞大且活跃的社区提供技术支持、贡献代码开发并创建扩展插件,确保 PostgreSQL 始终保持最新和良好的维护状态。

4.2 可扩展性与性能

  • 可扩展性 (Scalability): PostgreSQL 能够扩展以处理海量数据集和高事务量,非常适合要求苛刻的应用程序。
  • 性能 (Performance): 高效的查询处理、索引以及并发控制机制促成了其卓越的性能表现。

4.3 标准兼容性

  • SQL 标准: PostgreSQL 紧密遵循 SQL 标准,确保了与其他数据库系统的兼容性,并使得应用程序的迁移变得更加容易。
  • ACID 兼容性: 保证了数据的完整性和可靠性,非常适合需要极高数据准确性的应用程序。

4.4 灵活性与可扩展能力

  • 定制化: 可以通过用户定义的类型、函数和运算符,对 PostgreSQL 进行定制以满足特定需求。
  • 扩展插件: 丰富的扩展生态系统提供了额外的功能,例如地理空间数据管理、JSON 支持和全文搜索。

5. 应用案例

  • 金融服务: 许多金融机构依赖 PostgreSQL 的 ACID 兼容性和数据完整性特性。比如一个股票交易平台需要精确且可靠的交易处理,PostgreSQL 的事务能力可确保所有交易正确执行,即使在系统故障时也能保持数据一致。
  • 地理空间应用: PostgreSQL 结合 PostGIS 扩展,被广泛用于地图映射、基于位置的服务 (LBS) 以及地理信息系统 (GIS) 中。例如,一个网约车应用可能会使用 PostGIS 高效地查询和分析位置数据,以寻找离乘客最近的可用司机。
  • 内容管理系统 (CMS): 像 Drupal 和 Joomla 这样的平台都支持 PostgreSQL 作为其后端数据库。它的可靠性、可扩展性和丰富的功能集使其非常适合管理大量内容和用户数据。