PostgreSQL/扩展
PostgreSQL 提供了一个可扩展架构,并在其之上实现了其内部数据类型、运算符、函数、索引等。这种架构对每个人都是开放的,可以用来实现并添加自己的功能到 PostgreSQL 系统中。您可以根据用例的需要定义新的数据类型,无论是否需要特殊的运算符和函数。添加它们之后,您就可以同时拥有两个世界的优势:您创建的特殊功能以及数据库系统提供的标准功能,例如 ACID、SQL、安全性、标准数据类型、WAL、客户端 API 等。有关可扩展性的介绍,请参阅 PostgreSQL 文档。
随着时间的推移,社区开发了一套对自身需求和大量应用程序都有用的扩展 - 有时甚至用于标准化组织提供的需求和定义。以下是一些流行的示例
- 用于处理 **空间数据** 的数据类型、运算符和函数,例如点、折线、overlaps() 等,如 OSGeo 和 SQL 多媒体和应用程序包 第 3 部分:空间 中定义。
- 用于 **全文** 搜索的功能,如 SQL 多媒体和应用程序包 第 2 部分:全文 中定义。
- 访问 **外部数据** 的功能(其他 PostgreSQL 实例、其他 SQL、NoSQL 或大数据数据库系统、LDAP、扁平文件,例如 csv、json、xml),如 SQL 第 9 部分:外部数据管理 中定义。
这种扩展的生命周期始于一群人或一家公司实现其功能。发布后,该扩展可以被社区中的其他人或公司使用和进一步扩展。有时,这些扩展与 PostgreSQL 系统保持独立,例如:PostGIS,在其他情况下,它们与标准下载一起提供,并在文档中明确列出为 附加提供的模块,其中包含有关如何安装它们的提示。在极少数情况下,扩展会被合并到核心系统中,从而成为 PostgreSQL 的原生部分。
要激活和使用扩展,您必须下载并安装必要的文件(如果未与标准下载一起提供),并在 SQL 客户端(如 `psql`)中发出命令 `CREATE EXTENSION <extension_name>;`。要控制哪些扩展已安装,请在 `psql` 中使用:`\dx`。
PostGIS 是一个项目,它通过丰富的 2D 和 3D 空间数据类型以及相关的函数、运算符和索引类型扩展了 PostgreSQL,这些数据类型和函数如 OSGeo 和 SQL 多媒体和应用程序包 第 3 部分:空间 中定义。通常数据类型是 *多边形* 或 *多点*,典型函数是 *st_length()* 或 *st_contains()*。空间对象的适当索引类型是 GiST 索引。
PostGIS 项目有自己的 网络表示,其中描述了其所有方面,特别是下载过程和扩展本身的激活。
外部数据包装器 (FDW) 是 PostgreSQL 扩展,可提供对实际数据库和实例外部数据的访问。有不同类型的数据包装器
- 一个包装器到其他 PostgreSQL 实例:*postgres_fdw*
- 许多包装器到其他关系型数据库系统,如 Oracle、MySQL、MS SQL Server 等。
- 许多包装器到 NoSQL 数据库系统:CouchDB、MongoDB、Cassandra 等。
- 到 ODBC 和 JDBC 的通用包装器
- 许多包装器到不同格式的文件:csv、xml、json、tar、zip 等 (file_fdw)
- LDAP 包装器
- ...等等。
一个全面的 列表 给出了概述。
FDW 的技术在 SQL 标准 第 9 部分:外部数据管理 中定义。
以下是如何通过 FDW 访问另一个 PostgreSQL 实例的示例。
-- Install the extension to other PostgreSQL instances CREATE EXTENSION postgres_fdw; -- Define the connection to a database/instance at a different server CREATE SERVER remote_geo_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '10.10.10.10', port '5432', dbname 'geo_data'); -- Define a user for the connection (The remote user must have access rights at the remote database) CREATE USER MAPPING FOR CURRENT_USER SERVER remote_geo_server OPTIONS (user 'geo_data_user', password 'xxx'); -- Define two foreign tables via an IMPORT command ... IMPORT FOREIGN SCHEMA geo_schema LIMIT TO (city, point_of_interest) FROM SERVER remote_geo_server INTO my_schema; -- .. and another foreign table via an explicit definition CREATE FOREIGN TABLE remote_person ( id SERIAL, person_name TEXT NOT NULL, city_id INT4 NOT NULL ) SERVER remote_geo_server OPTIONS(schema_name 'geo_schema', table_name 'person');
在执行上述语句后,您可以使用通常的 DML 命令 SELECT、UPDATE、COMMIT 等访问 city、point_of_interest 和 remote_person 这三个表。但是,数据仍然保留在“远程”服务器 (10.10.10.10) 上,查询在该服务器上执行,只有查询结果通过网络传输到实际实例和您的客户端应用程序。
SELECT count(*) FROM city; -- table 'city' resides on a different server
BDR 是一个扩展,它允许在参与的(主)节点之间以双向方式复制,同时并行执行其客户端应用程序的常规读写活动。因此,它实现了多主复制。实际上,该项目是一个 独立项目。但是,BDR 开发中出现的多种技术已经成为核心 PostgreSQL 的组成部分,例如 事件触发器、逻辑解码、复制槽、后台工作者 等等。