PostgreSQL

PostgreSQL（ ）是一款功能全面且開源的關係型資料庫管理系統，憑藉其卓越的擴充套件能力和對 SQL 標準的嚴格遵循而廣受讚譽。作為一款成熟的資料庫系統，它不僅支援符合 ACID 特性的事務處理，還集成了自動更新的檢視、物化檢視、觸發器、外部索引鍵約束以及儲存過程等一系列強大功能。

PostgreSQL 能夠在 Windows、Linux、macOS 等主流作業系統上流暢執行，其應用範圍極為廣泛，無論是單機應用、大規模資料倉庫，還是資料湖、高併發 Web 服務等場景，都能應對自如。

PostgreSQL 的核心開發工作由全球開發組（PostgreSQL Global Development Group）負責，他們專注於資料庫引擎及其核心元件的研發與最佳化。在這個核心團隊之外，還活躍著一個生機勃勃的開發者社群和生態系統，他們為 PostgreSQL 提供了眾多增強功能，填補了通常由商業資料庫供應商所提供的功能空缺。這些擴充套件涵蓋了地理空間資料處理、時序資料庫支援等特殊領域，以及模擬其他資料庫產品的相容層。

同時，第三方開發者也貢獻了各種使用者和機器介面功能，包括圖形使用者介面、負載均衡和高可用性工具集等。

儘管這個龐大的支援網路（涵蓋個人、企業、產品和專案）並非 PostgreSQL 開發組的一部分，但它們共同促進了 PostgreSQL 生態系統的繁榮發展，對資料庫的推廣與應用起到了至關重要的作用。

這款資料庫系統最初名為 POSTGRES，以彰顯其作為加州大學柏克萊分校 Ingres 資料庫系統繼承者的身份。 1996 年，為了體現其對 SQL 的支援，專案更名為 PostgreSQL。經過 2007 年的一次評審，開發團隊決定保留 PostgreSQL 這個名稱和 Postgres 這個簡稱。

歷史

PostgreSQL 經歷了長時間的演變。該專案最初開始於在加利福尼亞大學伯克利分校的 Ingres 計劃。這個計劃的領導者邁克爾・斯通布雷克在 1982 年離開加利福尼亞大學伯克利分校去推進 Ingres 的商業化，但最後還是返回了學術界。在 1985 年返回伯克利之後，斯通布雷克開始了 post-Ingres 計劃，致力於解決在 1980 年代早期所出現一些資料庫系統存在的問題。Postgres 和 Ingres 的程式碼庫開始（並保持）完全分離。

新專案 Postgres 的目的是透過增加最少的功能來完全支援所需要的型別。這些功能包括型別定義和完整描述資料關係的能力。完整描述資料關係的能力之前雖廣為使用但卻需要由使用者來維護。Postgres 的資料庫能夠 "理解" 關係，並可以使用一定的規則以自然方式在相關的表中檢索資訊。

從 1986 年開始，該專案組發表了一些描述這一系統基本原理的論文，並在 1988 年實現並運行了一個 Demo 版本。專案組在 1989 年六月向少數使用者發行了版本 1.0，隨後在 1990 年 6 月發行了帶有全新規則系統的版本 2.0。1991 年的版本 3.0 再次重寫了規則系統，並增加了對多個儲存管理器的支援與改進的查詢引擎。Postgres 在 1993 年開始擁有大量使用者，這些使用者提供了大量的功能與最佳化建議。但是在發行了作為細節修正的版本 4.0 之後，Postgres 計劃就終止了。

儘管 Postgres 計劃正式的終止了，BSD 許可證（Postgres 遵守 BSD 許可證發行）卻使開發者們得以獲取原始碼並進一步開發系統。1994 年，兩個加利福尼亞大學伯克利分校的研究生 Andrew Yu 和 Jolly Chen 增加了一個 SQL 語言直譯器來替代早先的基於 Ingres 的 QUEL 系統，建立了 Postgres95。程式碼隨後被髮布到網際網路上供全世界使用。Postgres95 在 1996 年被重新命名為 PostgreSQL 以便突出該資料庫全新的 SQL 查詢語言。

PostgreSQL 首次發行即選擇 6.0 作為其版本號，由來自世界各地的資料庫開發者和志願者們，透過網際網路進行軟體的維護。在 2005 年 1 月 19 日，PostgreSQL 發行了版本 8.0。自版本 8.0 之後，PostgreSQL 得以藉助原生方式運行於 Windows 系統之下。

儘管許可證允許 PostgreSQL 被用於商業用途，PostgreSQL 卻並沒有像 Ingres 那樣快速的被商業化。在 2005 年 1 月，PostgreSQL 才收到了它來自資料庫廠商的第一份援助。Pervasive Software 宣佈了對 PostgreSQL 的商業支援和社群參與。

但其實在此之前，就已經有一些公司開始對 PostgreSQL 伸出援手。2000 年，前 Red Hat 投資者籌組了一間名為 Great Bridge 的公司來商業化 PostgreSQL，與其他商用資料庫廠商展開競爭。Great Bridge 資助了好幾位 PostgreSQL 開發者，並且貢獻了許多資源給社群。然而到了 2001 年末，Great Bridge 卻終止了營運，一部分原因在於 PostgreSQL 在被商業化後，其市場狀況並不理想。

2001 年，Command Prompt, Inc. 釋出了 Mammoth PostgreSQL，這是最老牌的 PostgreSQL 商業軟體。他們透過對開發者的贊助，和開發 PL/Perl、PL/php 等 PostgreSQL 在各語言中的實現，以及維護 PostgreSQL Build Farm 等方式來支援 PostgreSQL 社群。

2005 年 1 月，PostgreSQL 接到了來自另一間資料庫廠商 Pervasive Software 的支援，該公司以常見於 Novell NetWare 平臺的 Btrieve 產品而聞名。他們宣佈了進行商業支援和對社群的參與。但在他們成功商業化 PostgreSQL 一段時間後的 2006 年 7 月，Pervasive Software 離開了 PostgreSQL 的支援市場。

在 2005 年中，兩間其他的公司宣佈商業化 PostgreSQL，分別進入不同的利基市場。EnterpriseDB 宣佈將專注於讓使用 Oracle 的應用程式能更容易的在 PostgreSQL 上執行。Greenplum 則專注貢獻在資料倉儲和商業智慧的應用程式，尤其以 BizGres 專案著稱。

2005 年 10 月，昇陽的軟體部門執行副總裁 John Loiacono 談論到："我們不會去 OEM 微軟的產品，我們正關注著 PostgreSQL"，儘管當時並沒有任何規格釋出。到了 2005 年 11 月，昇陽宣佈將支援 PostgreSQL。2006 年 6 月，Solaris 10 包含 PostgreSQL 一起釋出。

至於 PostgreSQL 專案本身，他繼續著每年一個主要版本釋出，以及次要的除錯版本釋出，這些釋出全都遵守 BSD 授權。

描述

如果很粗略地觀察 PostgreSQL，會覺得這個資料庫系統和其它資料庫很類似。因為 PostgreSQL 使用 SQL 語言來執行資料的查詢。這些資料透過外部索引鍵聯絡在一起，以一系列表格的形式存在。PostgreSQL 相對於競爭者的主要優勢為可程式設計性：對於使用資料庫資料的實際應用，PostgreSQL 讓開發與使用變得更簡單。

SQL 資料在 “平面表格” 中儲存簡單的資料型別，需要使用者使用查詢把有關的資訊收集在一起。這與應用和使用者利用資料自身的方式相對立：典型的使用帶有豐富資料型別的高階語言，在其中所有有關的資料作為它自己的一個完整單元來操作。典型的稱呼為記錄或物件（依據各自語言）。

轉換來自 SQL 世界的資訊到面向物件程式設計世界體現得很困難，因為兩者有非常不同的資料組織的模型。工業界把這個問題稱為：從一個模型對映到另一個要花費專案開發者 40% 的時間。一些對映解決方案，典型的稱為物件關係對映，致力於這個問題，但是它們花費很多並有自身的問題，導致糟糕的效能或強制所有的資料訪問透過對映所支援的一種語言來進行。

PostgreSQL 可以直接在資料庫中解決很多這類問題。PostgreSQL 允許使用者定義基於正規的 SQL 型別的新型別，允許資料庫自身理解複雜資料。例如，你可以定義一個 address 來組合一些事物如街道編號、城市和國度的字串。從這一點上你可以輕易地建立把儲存地址所需要的所有欄位包含在一個單一行列中的表。

PostgreSQL 還允許型別包括繼承，這是在面向物件程式設計中的主要概念。例如，你可以定義 postcode 型別，並接著基於它建立 uszipcode 和 canadianpostalcode。在資料庫中的 address 就可以採用 usaddress 或者 canadian_address 形式，而特定的規則可以在各自情況下驗證資料。在 PostgreSQL 的早期版本中，實現新型別需要寫 C 擴充套件並把它們編譯到資料庫伺服器中；在版本 7.4 中，透過 CREATE DOMAIN 建立和使用定製型別變得很容易了。

資料庫自身的程式設計可以從使用函式上獲得巨大的利益。多數 SQL 系統允許使用者寫儲存過程，它是其他 SQL 語句可以呼叫的一塊 SQL 程式碼。但是 SQL 自身仍舊不適合作為程式語言，而且 SQL 使用者在構造複雜邏輯時要經歷巨大的困難。更糟糕的是，SQL 自身不支援很多的程式語言中最基本的操作，比如分支和迴圈。每個廠商都轉而寫它們自己對 SQL 語言的擴充套件來增加這些特徵，而這種擴充套件不是必須跨越資料庫平臺操作。

在 PostgreSQL 中程式設計師可以用一組可觀的支援語言中任何一種來寫這種邏輯。

類似於 Oracle 的過程語言 PL/SQL 的叫做 PgSQL 的內建語言，在處理查詢密集的過程時提供了獨特的優勢。
流行指令碼語言比如 Perl、Python、Tcl 和 Ruby 的包裝器，允許利用它們在字串處理和連線到廣闊的外部函式庫的力量。
需要把複雜邏輯編譯到機器程式碼所能提供的高效能的過程可以利用 C 或 C++。
在更加深奧的方面，R 統計語言的處理器允許資料庫查詢利用它的一組豐富的統計函式。

程式設計師可以把程式碼作為函式插入伺服器中，它是使程式碼類似於儲存過程的一個小包裝器。以這種方式 SQL 程式碼可以呼叫（比如）C 程式碼或反之。

效能增進，因為資料庫引擎在一個時間一個地方呼叫所有的邏輯，減少了在客戶和伺服器之間的來回往返的次數。
可靠性增進，因為資料驗證程式碼集中到一個地方，就在伺服器上，而不用依賴在多個客戶應用中的同步邏輯，它們甚至可能以多種程式語言寫成。
透過向伺服器增加有用的抽象，客戶程式碼可以變得更短小和簡單。

這些優勢合起來可以證實 PostgreSQL 從程式設計角度是最高階的資料庫系統。使用 PostgreSQL 可以顯著的減少很多專案的整體程式設計時間，這種優勢隨著專案複雜而增長。

特徵

3.1 函式

透過函式，可以在資料庫伺服器端執行指令程式。儘管這樣的指令程式可以使用基本的 SQL 語句寫成，但是由於其缺乏流程控制等功能，所以在 PostgreSQL 中引入了使用其它程式語言編寫函式的能力，包括：

一個內建的名為 pgSQL 的過程語言，類似於 Oracle 的 PL/SQL；
包括 PL/Perl，PL/PHP，PL/Python，PL/Ruby，PL/sh，PL/Tcl 與 PL/Scheme 在內的指令碼語言；
編譯語言：C，C++，或 Java（透過 PL/Java）。
R 統計語言 PL/R。

以上部分的語言，甚至可以在觸發器內執行。PostgreSQL 支援行返回函式：它們的輸出是一系列行型別資料的集合，可以在查詢中當作表來使用。函式也可以被定義成以建立者或者呼叫者的身份執行。在某些場合，或者其他的資料庫產品中，函式也會被稱為 “儲存過程”，但技術上這兩者並未有太大分別。

3.2 索引

在 PostgreSQL 中，使用者可以自定義索引方法，或使用內建的 B 樹，雜湊表與 GiST 索引。PostgreSQL 的索引功能同時也具有以下功能：

反向索引檢索：無須額外的索引就能實現類似 ORDER BY field DESC 的操作。
表示式索引：可以建立基於表示式值而非數值或列的索引。
部分索引：僅索引表的部分，可以透過在 CREATE INDEX 語句口新增 WHERE 從句以建立更小的索引。
點陣圖索引掃描：從 8.1 版開始支援此功能。該功能將讀取多個索引，生成表示它們之間符合查詢標準的多元組交集的點陣圖。這樣解決了混合索引的問題。在一個具有 20 列的表中，理論上能建立 20! 個索引，在實際應用中並不實用。使用點陣圖索引掃描後，在每次查詢時，它將能把約束條件中所涉及列各自的索引進行任意的排列組合。

3.3 觸發器

觸發器是由 SQL 語句查詢所觸發的事件。如：一個 INSERT 語句可能觸發一個檢查資料完整性的觸發器。觸發器通常由 INSERT 或 UPDATE 語句觸發。

在 PostgreSQL 中，可在資料表上設定觸發器，但無法在檢視中設定 (對檢視的 UPDATE 或者 INSERT 操作可以使用規則（RULE）定義）。多個觸發器可依據字母順序依次執行。此外，除了使用內嵌的 PL/PgSQL 語言之外，觸發器的函式也可以用 PL/Perl，PL/Python 等語言編寫。

3.4 多版本併發控制

PostgreSQL 使用多版本併發控制（MVCC，Multiversion concurrency control）系統進行併發控制，該系統向每個使用者提供了一個數據庫的 “快照”，使用者在事務內所作的每個修改，對於其他的使用者都不可見，直到該事務成功提交。這從很大程度上減少了對讀取鎖的依賴，同時保證了資料庫高效地符合 ACID 原則。

3.5 規則

規則（RULE）允許一個查詢能被重寫，通常用來實現對檢視（VIEW）的操作，如插入（INSERT）、更新（UPDATE）、刪除（DELETE）。

3.6 資料型別

PostgreSQL 內建豐富的資料型別，包括：

任意精度的數值
無限制長度文字
幾何圖元
IP 地址與 IPv6 地址
無類域間路由地址塊，MAC 地址
陣列
JSON 資料
列舉型別
XML 資料 (需要在 PostgreSQL 原始碼編譯時指定 "--with-libxml" 選項)

此外，使用者可以建立自定義資料型別，通常透過 PostgreSQL 的 GiST 機制，它們也能被很好得索引，比如 PostGIS 地理資訊系統的資料型別。

3.7 使用者定義物件

使用者可以為資料庫內幾乎所有的物件定義新的型別，包括：

索引
運算子（可過載現有運算子。）
聚合函式
資料域
資料型別轉換
會話（編碼轉換）

3.8 繼承

資料表的結構及屬性可從一個 “父” 表中繼承，資料將在兩者間共享。對子表中資料的插入或者刪除也將在父表中體現，同樣，對父表作出的修改，比如新增列等操作也會導致子表產生相應的改動。該功能尚未完全實現，實際上，表的約束尚不能繼承。比如，在一張外聯參考了父表 id 欄位的表中，插入一條具有子表中某條記錄 id 資料的記錄會導致失敗，因為 PostgreSQL 在對父表的外部索引鍵約束檢查中不會檢查子表的內容。

3.9 其他功能

關係完整性約束：包括外部索引鍵，列約束與行檢查
檢視
內、外（全、左、右）連線
子查詢
事務處理
支援大部分 SQL:2003 標準的主要特徵。不支援部分特徵，和將來支援的特徵，可至已有版本手冊中查詢。
SSL 加密連線
二進位制／文字大物件的儲存
線上備份
資料域
表分割槽
表空間
儲存點
時刻點恢復
二階段提交
TOAST（The Oversized-Attribute Storage Technique，超大屬性儲存技術）用以透明地將超大表屬性（如大 MIME 附件或 XML 訊息）壓縮後儲存至獨立的區域
正則表示式

3.10 資料庫管理及開發工具

phpPgAdmin 基於 php 語言寫的用於管理 PostgreSQL 資料庫的程式
PgAdmin 另外一個用於管理 PostgreSQL 資料庫的軟體

3.11 擴充套件

地理資料物件：PostGIS GPL
全文檢索：透過 Tsearch2GPL 或 OpenFTS，將在 8.3 版本中內嵌 Tsearch2
多種非同步主／從複製方案，包括 Slony-I（BSD 授權），Mammoth Replicator
XML/XSLT 支援 contrib 軟體包中的 XPath 擴充套件 GPL
機器學習：MADlibASF，由 Apache 基金會的支援的頂級開源專案；整合大量傳統數學分析統計、圖計算以及一些常見的機器學習的演算法

知名客戶

.org 域名庫
The American Chemical Society
Chicagocrime.org
Skype
Penny Arcade
IMDB
Sony Online
美國勞工部
Wisconsin Circuit Court Access with 6 * 180GB DBs replicated in real time
OpenACS and .LRN
Evergreen－一個開放原始碼（GNU 通用公共許可證）的整合圖書館系統
GNU Health

版本

PostgreSQL - Red Hat Edition 是由 Red Hat 製作的分支版本，又稱 Red Hat Database。

參閱

關係資料庫管理系統
關係型資料庫管理系統列表
關係型資料庫管理系統對比
物件資料庫管理系統
物件資料庫管理系統列表
物件資料庫管理系統對比