第 25 章:常用扩展 (Extensions) 🧩 – PostgreSQL入门

PostgreSQL 的核心本身已经超级强劲,但它最伟大的设计思想之一就是其高度的可扩展性。PostgreSQL 允许任何人编写“扩展包”,来为数据库增加全新的功能、数据类型、索引方法,甚至是过程语言。

第 25 章:常用扩展 (Extensions) 🧩 - PostgreSQL入门

这使得 PostgreSQL 不仅仅是一个数据库,更像是一个“数据平台”。你需要地理空间数据处理能力?装 PostGIS。你需要模糊字符串匹配?装 pg_trgm。你需要处理时间序列数据?装 TimescaleDB

这个充满活力的扩展生态系统,是 PostgreSQL 如此受欢迎的关键缘由之一。

扩展 (Extension) 是一个封装好的、包含了一系列 SQL 对象(如函数、数据类型、操作符、索引类型等)的软件包。安装和管理扩展超级简单,只需要几个简单的 SQL 命令。


如何管理扩展?

  • 查看当前数据库已安装的扩展:
    psql 中,使用 dx 命令。
  • dx
  • 查看所有可用的扩展:
    每个 PostgreSQL 发行版都自带了一些超级有用的“官方”扩展。你可以查询 pg_available_extensions 视图来看到它们。
  • SELECT name, default_version, comment FROM pg_available_extensions;
  • 安装一个扩展:
    使用 CREATE EXTENSION 命令。你必须是超级用户才能安装扩展。
  • CREATE EXTENSION extension_name;
  • 这个命令会运行该扩展的安装脚本,创建所有必需的函数、类型等。
  • 卸载一个扩展:
    使用 DROP EXTENSION 命令。
  • DROP EXTENSION extension_name;

下面,我们就来介绍几个在实际工作中超级常用、能极大提升开发效率的官方扩展。


25.1uuid-ossp(生成 UUID)

我们在第 16 章已经和它打过交道了。这个扩展提供了生成通用唯一标识符 (UUID) 的函数,对于需要分布式生成唯一 ID 的系统至关重大。

安装:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
  • IF NOT EXISTS 是一个好习惯,避免在扩展已安装时报错。

使用:
最常用的函数是
uuid_generate_v4(),它生成一个基于随机数的 UUID。

CREATE TABLE my_distributed_table (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    data TEXT
);

INSERT INTO my_distributed_table (data) VALUES ('some data');
SELECT * FROM my_distributed_table;

25.2pg_trgm(模糊字符串匹配)

你是否遇到过这样的需求:“用户搜索时输错了几个字母,我们能帮他找到最类似的结果吗?”

LIKE '%keyword%' 无法解决这个问题,而且性能很差。pg_trgm 扩展就是为此而生的。它基于 Trigram (三元模型) 算法,通过将字符串拆分成一个个三个字符的组合,来计算字符串之间的“类似度”。

安装:

CREATE EXTENSION IF NOT EXISTS "pg_trgm";

核心功能:

  1. similarity(text1, text2) 函数: 返回两个字符串的类似度(0 到 1 之间)。
  2. % 操作符: 判断两个字符串的类似度是否超过某个阈值(默认为 0.3)。
  3. 支持 GiST 或 GIN 索引,可以极大地加速类似度查询。

场景:在 users 表中,根据一个可能拼写错误的词,查找最类似的用户名。

第一步:创建索引
为了让查询飞起来,我们必须创建一个 GIN 或 GiST 索引。

CREATE INDEX idx_users_username_trgm ON users USING GIN (username gin_trgm_ops);

第二步:查询
假设用户想找
zhangsan,但不小心输成了 zhangsn

-- 先看看类似度是多少
SELECT similarity('zhangsan', 'zhangsn');
--  similarity
-- ------------
--    0.727273

-- 设置一个类似度阈值,并进行查询
-- 这个阈值可以随时调整
SET pg_trgm.similarity_threshold = 0.6;

-- 使用 % 操作符进行查询,它会自动利用上面的索引
SELECT username FROM users WHERE username % 'zhangsn';
--  username
-- ----------
--  zhangsan

pg_trgm 对于实现搜索框的“您是不是要找…”功能超级有用。


25.3 PostGIS 简介 (地理空间数据处理)

PostGIS 可能是 PostgreSQL 最著名、最强劲的扩展,它将 PostgreSQL 变成了一个功能完备的、世界顶级的地理信息系统 (GIS) 数据库。

PostGIS 增加了一系列地理空间数据类型和函数,让你可以在数据库中存储、查询和分析地理位置数据。

核心能力:

  • geometry 数据类型: 用于存储点、线、多边形等地理形状。
  • 空间函数:ST_Distance(): 计算两个地理对象之间的距离。ST_DWithin(): 判断一个对象是否在另一个对象的特定距离范围内(这是实现“附近的人”功能的核心)。ST_Contains(): 判断一个形状是否包含另一个形状。ST_Area(): 计算多边形的面积。
  • 空间索引: 使用 GiST 索引来极速查询海量的地理数据。

场景: 找出一个点附近 10 公里内的所有商店。

-- 假设有一个 stores 表,包含一个名为 geom 的 geometry(Point, 4326) 列
SELECT name, address
FROM stores
WHERE ST_DWithin(
    geom,
    'SRID=4326;POINT(116.39 39.9)', -- 北京市中心的经纬度
    10000 -- 距离,单位是米
);

如果你需要处理任何与地理位置相关的数据,PostGIS 是不二之选。


本章小结

你已经领略到了 PostgreSQL 开放生态的强劲魅力。

  • 我们理解了扩展是什么,以及如何使用 dx, CREATE EXTENSION, DROP EXTENSION 来管理它们。
  • 认识了 uuid-ossp,解决了分布式唯一 ID 的问题。
  • 掌握了 pg_trgm,为应用增加了模糊搜索和拼写纠错的能力。
  • 对强劲的 PostGIS 有了初步了解,知道了它是处理地理空间数据的利器。

PostgreSQL 的扩展远不止这些,还有用于全文搜索的 tsearch2、用于处理加密的 pgcrypto、用于连接其他数据库的 dblinkpostgres_fdw 等等。

善于利用扩展,可以让你站在巨人的肩膀上,快速地为你的数据库添加各种强劲的新功能。

到此,我们教程的第五部分也已完成。在最后的第六部分,我们将把前面学到的所有知识融会贯通,通过一个实战项目,来体验一次从零到一设计和实现一个真实数据库系统的过程。准备好迎接最终的挑战了吗?我们下一章见!

© 版权声明

相关文章

暂无评论

none
暂无评论...