PostgreSQL

自由且開放原始碼的關聯式資料庫管理系統

PostgreSQL是一個開源的物件-關聯式資料庫管理系統,在類似BSD特許MIT特許的PostgreSQL特許下發行。[5]

PostgreSQL
開發者PostgreSQL Global Development Group
首次釋出1996年7月8日,​27年前​(1996-07-08[1]
目前版本
  • 16 release candidate 1 (2023年8月31日;測試版本)[2]
  • 16.2 (2024年2月8日;穩定版本)[3]
編輯維基數據連結
原始碼庫 編輯維基數據連結
程式語言C語言
作業系統Linux, Windows, FreeBSD, OpenBSD, NetBSD, macOS, AIX, HP/UX, Solaris[4]
平台x86, x86_64, IA64, PowerPC, PowerPC 64, S/390, S/390x, Sparc, Sparc 64, ARM, MIPS, MIPSEL, PA-RISC[4]
語言英語
類型關聯式資料庫
特許條款PostgreSQL特許[5]
網站www.postgresql.org 編輯維基數據

PostgreSQL這個單字的拼法讓有些人覺得很難讀,特別是那些把SQL讀作"sequel"的人。PostgreSQL開發者把它讀作"post-gress-Q-L"。(Audio sample[6],5.6k MP3)。它也經常被簡稱為"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[7]宣佈了對PostgreSQL的商業支援和社區參與。

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

2001年,Command Prompt, Inc.釋出了Mammoth PostgreSQL,這是最老牌的PostgreSQL商業軟件。他們通過對開發者的贊助,和開發PL/PerlPL/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世界的資訊到物件導向程式設計世界體現得很困難,因為兩者有非常不同的數據組織的模型。工業界把這個問題稱為對象關係不匹配英語Object-relational_impedance_mismatch:從一個模型對映到另一個要花費專案開發者40%的時間。一些對映解決方案,典型的稱為對象關係對映,致力於這個問題,但是它們花費很多並有自身的問題,導致糟糕的效能或強制所有的數據訪問通過對映所支援的一種語言來進行。

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

PostgreSQL還允許類型包括繼承,這是在物件導向程式設計中的主要概念。例如,你可以定義post_code類型,並接着基於它建立us_zip_codecanadian_postal_code。在資料庫中的address就可以採用us_address或者canadian_address形式,而特定的規則可以在各自情況下驗證數據。在PostgreSQL的早期版本中,實現新類型需要寫C擴充並把它們編譯到資料庫伺服器中;在版本7.4中,通過CREATE DOMAIN建立和使用客製化類型變得很容易了。

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

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

  • 類似於Oracle的過程語言PL/SQL的叫做PgSQL[8]的內建語言,在處理查詢密集的過程時提供了獨特的優勢。
  • 流行手稿語言比如PerlPythonTclRuby的包裝器,允許利用它們在字串處理和連接到廣闊的外部函數庫的力量。
  • 需要把複雜邏輯編譯到機械碼所能提供的高效能的過程可以利用CC++
  • 在更加深奧的方面,R統計語言的處理器允許資料庫查詢利用它的一組豐富的統計函數。

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

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

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

特徵 編輯

函數 編輯

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

  • 一個內建的名為pgSQL[9]的過程語言,類似於Oracle的PL/SQL
  • 包括PL/Perl[10],PL/PHP[11],PL/Python[12],PL/Ruby[13],PL/sh[14],PL/Tcl[15]與PL/Scheme[16]在內的手稿語言;
  • 編譯語言:CC++,或Java(通過PL/Java[17])。
  • R統計語言PL/R[18]

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

索引 編輯

在PostgreSQL中,用戶可以自訂索引方法,或使用內建的B樹雜湊表GiST索引。PostgreSQL的索引功能同時也具有以下功能:

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

觸發器 編輯

觸發器是由SQL陳述式查詢所觸發的事件。如:一個INSERT陳述式可能觸發一個檢查數據完整性的觸發器。觸發器通常由INSERT或UPDATE陳述式觸發。

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

多版本並行控制 編輯

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

規則 編輯

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

資料類型 編輯

PostgreSQL內建豐富的資料類型,包括:

此外,用戶可以建立自訂資料類型,通常通過PostgreSQL的GiST機制,它們也能被很好得索引,比如PostGIS地理資訊系統的資料類型。

用戶定義對象 編輯

用戶可以為資料庫內幾乎所有的對象定義新的類型,包括:

繼承 編輯

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

其他功能 編輯

資料庫管理及開發工具 編輯

  • phpPgAdmin[24]基於php語言寫的用於管理PostgreSQL資料庫的程式
  • PgAdmin[25]另外一個用於管理PostgreSQL資料庫的軟件

擴充 編輯

  • 地理數據對象:PostGIS GPL
  • 全文檢索:通過Tsearch2[26]GPL或OpenFTS,將在8.3版本中內嵌Tsearch2
  • 多種非同步主/從複製方案,包括Slony-I[27](BSD授權),Mammoth Replicator[28]
  • XML/XSLT支援contrib軟件套件中的XPath擴充[29]GPL
  • 機器學習:MADlib[30]ASF,由Apache基金會的支援的頂級開源專案;整合大量傳統數學分析統計、圖計算以及一些常見的機器學習的演算法

知名客戶 編輯

版本 編輯

PostgreSQL - Red Hat Edition[35]是由Red Hat製作之分支版本,又稱Red Hat Database。

參考文獻 編輯

  1. ^ HAPPY BIRTHDAY, POSTGRESQL!. PostgreSQL Website. [2018-09-19]. (原始內容存檔於2018-07-30). 
  2. ^ 2.0 2.1 https://www.postgresql.org/about/news/postgresql-16-rc1-released-2702/; 出版日期: 2023年8月31日.
  3. ^ PostgreSQL 16.2, 15.6, 14.11, 13.14, and 12.18 Released!. 2024年2月8日. 
  4. ^ 4.0 4.1 The PostgreSQL Global Development Group. Supported Platforms. PostgreSQL Documentation. [2018-09-19]. (原始內容存檔於2018-10-12). 
  5. ^ 5.0 5.1 License. [2019-10-01]. (原始內容存檔於2019-09-05) (英語). 
  6. ^ Audio sample頁面存檔備份,存於互聯網檔案館
  7. ^ [1]頁面存檔備份,存於互聯網檔案館
  8. ^ PL/PgSQL頁面存檔備份,存於互聯網檔案館
  9. ^ PL/pgSQL頁面存檔備份,存於互聯網檔案館
  10. ^ PL/Perl頁面存檔備份,存於互聯網檔案館
  11. ^ PL/PHP
  12. ^ PL/Python頁面存檔備份,存於互聯網檔案館
  13. ^ PL/Ruby
  14. ^ PL/sh
  15. ^ PL/Tcl頁面存檔備份,存於互聯網檔案館
  16. ^ PL/Scheme
  17. ^ PL/Java
  18. ^ PL/R
  19. ^ [2]頁面存檔備份,存於互聯網檔案館
  20. ^ 不支援部分頁面存檔備份,存於互聯網檔案館
  21. ^ 未來版本的支援情況頁面存檔備份,存於互聯網檔案館
  22. ^ 已有版本手冊頁面存檔備份,存於互聯網檔案館
  23. ^ [3]頁面存檔備份,存於互聯網檔案館
  24. ^ phpPgAdmin頁面存檔備份,存於互聯網檔案館
  25. ^ PgAdmin頁面存檔備份,存於互聯網檔案館
  26. ^ Tsearch2頁面存檔備份,存於互聯網檔案館
  27. ^ Slony-I頁面存檔備份,存於互聯網檔案館
  28. ^ Mammoth Replicator
  29. ^ contrib軟件套件中的XPath擴充
  30. ^ MADlib官网. [2023-11-13]. (原始內容存檔於2023-11-09). 
  31. ^ [4]頁面存檔備份,存於互聯網檔案館
  32. ^ [5]頁面存檔備份,存於互聯網檔案館
  33. ^ [6]頁面存檔備份,存於互聯網檔案館
  34. ^ [7]頁面存檔備份,存於互聯網檔案館
  35. ^ PostgreSQL - Red Hat Edition Project. [2010-06-24]. (原始內容存檔於2010-05-13). 

參閱 編輯

外部連結 編輯