跳轉至內容

PostgreSQL/擴充套件

來自 Wikibooks,開放世界中的開放書籍

PostgreSQL 提供了一個可擴充套件架構,並在其之上實現了其內部資料型別、運算子、函式、索引等。這種架構對每個人都是開放的,可以用來實現並新增自己的功能到 PostgreSQL 系統中。您可以根據用例的需要定義新的資料型別,無論是否需要特殊的運算子和函式。新增它們之後,您就可以同時擁有兩個世界的優勢:您建立的特殊功能以及資料庫系統提供的標準功能,例如 ACID、SQL、安全性、標準資料型別、WAL、客戶端 API 等。有關可擴充套件性的介紹,請參閱 PostgreSQL 文件

隨著時間的推移,社群開發了一套對自身需求和大量應用程式都有用的擴充套件 - 有時甚至用於標準化組織提供的需求和定義。以下是一些流行的示例

這種擴充套件的生命週期始於一群人或一家公司實現其功能。釋出後,該擴充套件可以被社群中的其他人或公司使用和進一步擴充套件。有時,這些擴充套件與 PostgreSQL 系統保持獨立,例如:PostGIS,在其他情況下,它們與標準下載一起提供,並在文件中明確列出為 附加提供的模組,其中包含有關如何安裝它們的提示。在極少數情況下,擴充套件會被合併到核心系統中,從而成為 PostgreSQL 的原生部分。

要啟用和使用擴充套件,您必須下載並安裝必要的檔案(如果未與標準下載一起提供),並在 SQL 客戶端(如 `psql`)中發出命令 `CREATE EXTENSION <extension_name>;`。要控制哪些擴充套件已安裝,請在 `psql` 中使用:`\dx`。

PostGIS 是一個專案,它透過豐富的 2D 和 3D 空間資料型別以及相關的函式、運算子和索引型別擴充套件了 PostgreSQL,這些資料型別和函式如 OSGeoSQL 多媒體和應用程式包 第 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 是一個擴充套件,它允許在參與的(主)節點之間以雙向方式複製,同時並行執行其客戶端應用程式的常規讀寫活動。因此,它實現了多主複製。實際上,該專案是一個 獨立專案。但是,BDR 開發中出現的多種技術已經成為核心 PostgreSQL 的組成部分,例如 事件觸發器邏輯解碼複製槽後臺工作者 等等。


華夏公益教科書