Remove ads
自由且開放原始碼的關聯式資料庫管理系統 来自维基百科,自由的百科全书
PostgreSQL(/ˌpoʊstɡrɛskjuˈɛl/ POHST-gres-kew-EL)[5][6]是一款功能全面且開源的關係型資料庫管理系統,憑藉其卓越的擴充能力和對SQL標準的嚴格遵循而廣受讚譽。作為一款成熟的資料庫系統,它不僅支援符合ACID特性的事務處理,還整合了自動更新的視圖、物化視圖、觸發器、外來鍵約束以及儲存程序等一系列強大功能。[7] PostgreSQL能夠在Windows、Linux、macOS等主流作業系統上流暢執行,其應用範圍極為廣泛,無論是單機應用、大規模資料倉儲,還是資料湖[8]、高並行Web服務等場景,都能應對自如。
開發者 | PostgreSQL Global Development Group |
---|---|
首次釋出 | 1996年7月8日[1] |
目前版本 | 17.2[2](2024年11月21日,22天前) |
原始碼庫 | |
程式語言 | C語言 |
作業系統 | Linux, Windows, FreeBSD, OpenBSD, NetBSD, macOS, AIX, HP/UX, Solaris 等[3] |
平台 | x86, x86_64, IA64, PowerPC, PowerPC 64, S/390, S/390x, Sparc, Sparc 64, ARM, MIPS, MIPSEL, PA-RISC 等[3] |
語言 | 英語 |
類型 | 關聯式資料庫 |
授權條款 | PostgreSQL授權[4] |
網站 | www |
PostgreSQL的核心開發工作由全球開發組(英語:PostgreSQL Global Development Group)負責,他們專注於資料庫引擎及其核心組件的研發與最佳化。在這個核心團隊之外,還活躍著一個生機勃勃的開發者社群和生態系統,他們為PostgreSQL提供了眾多增強功能,填補了通常由商業資料庫供應商所提供的功能空缺。這些擴充涵蓋了地理空間資料處理[9]、時序資料庫[10]支援等特殊領域,以及類比其他資料庫產品的相容層。[11][12][13][14] 同時,第三方開發者也貢獻了各種使用者和機器介面功能,包括圖形化使用者介面[15][16][17]、負載均衡和高可用性工具集等。[18] 儘管這個龐大的支援網路(涵蓋個人、企業、產品和專案)並非PostgreSQL開發組的一部分,但它們共同促進了PostgreSQL生態系統的繁榮發展,對資料庫的推廣與應用起到了至關重要的作用。[19]
這款資料庫系統最初名為POSTGRES,以彰顯其作為加州大學柏克萊分校Ingres資料庫系統繼承者的身分。[20][21] 1996年,為了體現其對SQL的支援,專案更名為PostgreSQL
。經過2007年的一次評審,開發團隊決定保留PostgreSQL這個名稱和Postgres這個簡稱。[22]
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[23]宣布了對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還允許類型包括繼承,這是在物件導向程式設計中的主要概念。例如,你可以定義post_code
類型,並接著基於它建立us_zip_code
和canadian_postal_code
。在資料庫中的address就可以採用us_address
或者canadian_address
形式,而特定的規則可以在各自情況下驗證資料。在PostgreSQL的早期版本中,實現新類型需要寫C擴充並把它們編譯到資料庫伺服器中;在版本7.4中,通過CREATE DOMAIN
建立和使用客製化類型變得很容易了。
資料庫自身的編程可以從使用函式上獲得巨大的利益。多數SQL系統允許使用者寫儲存程序,它是其他SQL語句可以呼叫的一塊SQL代碼。但是SQL自身仍舊不適合作為程式語言,而且SQL使用者在構造複雜邏輯時要經歷巨大的困難。更糟糕的是,SQL自身不支援很多的程式語言中最基本的操作,比如分支和迴圈。每個廠商都轉而寫它們自己對SQL語言的擴充來增加這些特徵,而這種擴充不是必須跨越資料庫平台操作。
在PostgreSQL中程式設計師可以用一組可觀的支援語言中任何一種來寫這種邏輯。
程式設計師可以把代碼作為函式插入伺服器中,它是使代碼類似於儲存程序的一個小包裝器。以這種方式SQL代碼可以呼叫(比如)C代碼或反之。
這些優勢合起來可以證實PostgreSQL從編程角度是最進階的資料庫系統。使用PostgreSQL可以顯著的減少很多專案的整體編程時間,這種優勢隨著專案複雜而增長。
通過函式,可以在資料庫伺服器端執行指令程式。儘管這樣的指令程式可以使用基本的SQL語句寫成,但是由於其缺乏流程控制等功能,所以在PostgreSQL中引入了使用其它程式語言編寫函式的能力,包括:
以上部分的語言,甚至可以在觸發器內執行。PostgreSQL支援行返回函式:它們的輸出是一系列行類型資料的集合,可以在查詢中當作表來使用。函式也可以被定義成以建立者或者呼叫者的身分執行。在某些場合,或者其他的資料庫產品中,函式也會被稱為「儲存程序」,但技術上這兩者並未有太大分別。
在PostgreSQL中,使用者可以自訂索引方法,或使用內建的B樹,雜湊表與GiST索引。PostgreSQL的索引功能同時也具有以下功能:
觸發器是由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在對父表的外來鍵約束檢查中不會檢查子表的內容。
PostgreSQL - Red Hat Edition[51]是由Red Hat製作之分支版本,又稱Red Hat Database。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.