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 的組成部分,例如 事件觸發器、邏輯解碼、複製槽、後臺工作者 等等。