PostgresQL是 對象關系型數據庫管理系統(ORDBMS)。
PostgreSQL支持大部分SQL標准並且提供了許多其他現代特性:復雜查詢、外鍵、觸發器、視圖、事務完整性、MVCC。
同樣,PostgreSQL 可以用許多方法擴展,比如, 通過增加新的數據類型、函數、操作符、聚集函數、索引。
免費使用、修改、和分發 PostgreSQL,不管是私用、商用、還是學術研究使用。
主要特點
PostgreSQL 是一個自由的對象-關系數據庫服務器(數據庫管理系統),它在靈活的 BSD-風格許可證下發行。
它提供了相對其他開放源代碼數據庫系統(比如 MySQL 和 Firebird),
和專有系統(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一種選擇。
PostgreSQL 開發者把它拼讀為 "post-gress-Q-L"。它也經常被簡略念為 "postgres"。
優點
事實上, PostgreSQL 的特性覆蓋了 SQL-2/SQL-92 和 SQL-3/SQL-99,
首先,它包括了可以說是目前世界上最豐富的數據類型的支持,其中有些數據類型可以說連商業數據庫都不具備,
比如 IP 類型和幾何類型等;其次,PostgreSQL 是全功能的自由軟件數據庫,很長時間以來,
PostgreSQL 是唯一支持事務、子查詢、多版本並行控制系統(MVCC)、數據完整性檢查等特性的唯一的一種自由軟件的數據庫管理系統。 Inprise 的 InterBase 以及SAP等廠商將其原先專有軟件開放為自由軟件之后才打破了這個唯一。
從技術角度來講,PostgreSQL 采用的是比較經典的C/S(client/server)結構,
也就是一個客戶端對應一個服務器端守護進程的模式,這個守護進程分析客戶端來的查詢請求,生成規划樹,
進行數據檢索並最終把結果格式化輸出后返回給客戶端。
為了便於客戶端的程序的編寫,由數據庫服務器提供了統一的客戶端 C 接口。
而不同的客戶端接口都是源自這個 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等,
同時也要指出的是,PostgreSQL 對接口的支持也是非常豐富的,幾乎支持所有類型的數據庫客戶端接口。
缺點
從 Postgres 開始,PostgreSQL 就經受了多次變化。
首先,早期的 PostgreSQL 繼承了幾乎所有 Ingres, Postgres, Postgres95 的問題:過於學院味,
因為首先它的目的是數據庫研究,因此不論在穩定性, 性能還是使用方方面面,長期以來一直沒有得到重視,
直到 PostgreSQL 項目開始以后,情況才越來越好,PostgreSQL 已經完全可以勝任任何中上規模范圍內的應用范圍的業務。
目前有報道的生產數據庫的大小已經有 TB 級的數據量,已經逼近 32 位計算的極限。
不過學院味也給 PostgreSQL 帶來一個意想不到的好處:大概因為各大學的軟硬件環境差異太大的緣故,
它是目前支持平台最多的數據庫管理系統的一種,所支持的平台多達十幾種,包括不同的系統,不同的硬件體系。
至今,它仍然保持着支持平台最多的數據庫管理系統的稱號。
其次,PostgreSQL 的確還欠缺一些比較高端的數據庫管理系統需要的特性,
比如數據庫集群,更優良的管理工具和更加自動化的系統優化功能 等提高數據庫性能的機制等。
架構
PostgreSQL強壯的一個原因源於它的架構。
和商業數據庫一樣,PostgreSQL可以用於C/S(客戶/服務器)環境。這對於用戶和開發人員有很多好處。
PostgreSQL安裝核心是數據庫服務端進程。它允許在一個獨立服務器上。
需要訪問存儲在數據庫中的數據的應用程序必須通過數據庫進程。
這些客戶端程序無法直接訪問數據,即使它們和服務程序在同一台機器上。
查詢語言
原來的查詢語言 PostQUEL 被 SQL 取代(在 server 端實現)。在 PostgreSQL 之前還不支持子查詢)(但這個功能可以在 Postgres95 里面由用戶定義的 SQL 函數實現)。重新實現了聚集。同時還增加了對 GROUP BY 查詢子句的支持。 C 程序仍可以調用 libpq接口函數。
新增加了利用 GNU Readline 進行交互 SQL 查詢(psql)。 這個程序很大程度上取代了老的 monitor 程序。
前端庫
增加了新的前端庫,libpgtcl,用以支持以 Tcl為基礎的客戶端。
一個樣本 shell, pgtclsh,提供了新的 Tcl 命令用於 Tcl 程序和 Postgres95 后端之間的交互。
徹底重寫了大對象的接口。 保留了將大對象倒轉(Inversion )作為存儲大對象的唯一機制。
(去掉了倒轉(Inversion )文件系統。)
去掉了記錄級(instance-level )的規則系統。
但我們仍然可以通過重寫規則使用規則。
軟件特征
函數
通過函數,可以在數據庫服務器端執行指令程序。
盡管這樣的指令程序可以使用基本的SQL語句寫成,但是由於其缺乏流程控制等功能,
所以在PostgreSQL中引入了使用其它程序語言編寫函數的能力,包括:
一個內置的名為PL/pgSQL的過程語言,類似於Oracle的PL/SQL;
包括PL/Perl,plPHP,PL/Python,PL/Ruby,PL/sh,PL/Tcl與PL/Scheme在內的腳本語言;
編譯語言:C,C++,或Java(通過PL/Java)。
R統計語言(PL/R)。
以上部分的語言,甚至可以在觸發器內執行。
PostgreSQL支持行返回函數:它們的輸出是一系列行類型數據的集合,可以在查詢中當作表來使用。
函數也可以被定義成以創建者或者調用者的身份運行。
在某些場合,或者其他的數據庫產品中,函數也會被稱為“存儲過程”,但技術上這兩者並未有太大分別。
索引
在PostgreSQL中,用戶可以自定義索引方法,或使用內置的B-tree,哈希表與GiST索引。
PosrgreSQL的索引功能同時也具有以下功能:
反向索引檢索:無須額外的索引就能實現類似ORDER BYfieldDESC的操作。
表達式索引:可以建立基於表達式值而非數值或列的索引。
部分索引:僅索引表的部分,可以通過在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)允許一個查詢能被重寫,通常被用作實現可更新的視圖。
數據類型
PostgreSQL內置豐富的數據類型,包括:
任意精度的數值
無限制長度文本
幾何圖元
IP地址與IPv6地址
無類域間路由地址塊,MAC地址
數組
此外,用戶可以創建自定義數據類型,通常通過PostgreSQL的GiST機制,它們也能被很好得索引,比如PostGIS地理信息系統的數據類型。
定義對象
用戶可以為數據庫內幾乎所有的對象定義新的類型,包括:
索引
操作符(可重載現有操作符。)
聚合函數
數據域
數據類型轉換
會話(編碼轉換)
繼承
數據表的結構及屬性可從一個“父”表中繼承,數據將在兩者間共享。
對子表中數據的插入或者刪除也將在父表中體現,同樣,對父表作出的修改,比如添加列等操作也會導致子表產生相應改動。
該功能尚未完全實現,實際上,表的約束尚不能繼承。
比如,在一張外聯參考了父表id字段的表中,插入一條具有子表中某條記錄id數據的記錄會導致失敗,
因為PostgreSQL在對父表的外鍵約束檢查中不會檢查子表的內容。
擴展
地理數據對象:PostGISGPL
全文檢索:通過Tsearch2或OpenFTS, 將在8.3版本中內嵌Tsearch2。GPL
多種異步主/從復制方案,包括Slony-I(BSD授權),Mammoth Replicator
XML/XSLT支持contrib軟件包中的XPath擴展GPL
備注:隨筆中內容來源於網上資料整理,僅供參考。