高級觀點
對於那些不知道的人來說,PostgreSQL是一個關系數據庫並類似於其他數據庫,它被用來快速存儲信息、 正確的檢索。數據庫提供組織數據存儲、創建和檢索的能力。一些數據庫提供比其他數據庫更多的靈活性,隨著被存儲數據的規模和重要性不斷增加,這些問題變得很重要。
這篇文章是為一個至少得益於一個或多個數據庫產品並且想要知道在他/她當前選擇的數據庫中錯過了什麼功能的人而寫的。
小歷史……
在開放源代碼在媒體火爆前很長時間,回到Unix-on-PC的先驅還是Minix 時代,開始了一個工程以便試驗關系數據庫的可行性。隨著在Unix上的數據庫的市場不斷壯大,PostgreSQL (隨後稱為Postgres和以後的 Postgres 95 )默默地緩慢向前,在它感興趣的領域為其核心用戶- 研究生擴展功能集合。這在市場上危害了Postgres (如果“市場”這樣一個術語可被用於自由產品),在那裡有更世俗的功能的其他數據庫產品占據了中心。
隨著最近Linux 和開放源代碼的流行熱浪,Postgres吸引了大量對更多主流功能的渴望的新開發者和用戶加入。發展步伐加快了。我想在幾個月前做這個評論,但是很多Postgres支持者主張我等到6.5版發行之後。他們是正確的;它值得等。
許可證
Postgres 是開放源代碼的一種形式,但並非是GPL。相反,它基於一個UC-Berkley 許可證,它依然如開放軟件所得到的那樣開放。
支持
技術支持通過第三方組織得到。就象大多數開放源代碼工程,一般用戶能通過Usenet或各種各樣的聊天室得到足夠的技術支持。
平台
服務者可在Linux、FreeBSD和大多數主要的Unix 變種上得到。在Windows 95/98/NT 上有客戶庫,服務器平台也是一樣(有庫戶庫)。
軟件包
主要有3個-RPM、Debian和 .tgz 可得到。Postgres隨幾個Linux 分發來發布,包括紅帽子。然而,我的紅帽子的版本不包括最新的PostgreSQL 版本,所以我在做評論前升級到了最新的穩定版本。
安裝
即使有RPM,安裝也不是自動的,然而,它相比較於一個主要的商業RDBMS來說是相當簡單的。數據庫需要一個特殊的用戶(名為postgres)初始化數據庫並隨後啟動postgres 服務/守護進程。這個特殊用戶的使用消除了讓根用戶運行服務的需要,這樣防止一大堆安全問題。
資源使用
Postgres 守護進程(稱為postmaster) 在一個i386 Linux機器大約消耗1100K內存, 其絕大多數在共享庫之中。通過比較,單個bash 外殼用戶使用960K。這個很小的足跡(footprint)允許在非專用機器上隨便使用Postgres。更大的數據庫產品將在數據庫表和索引緩沖上消耗幾兆字節,但是這種選擇在PosgreSQL上是沒有的。
數據類型
數據庫程序員不能得到足夠的數據類型。保存一兩個字節的機會似乎不是那麼重要,但是當一張數據庫表有幾百萬行在其中時,它們能獲得顯著的規模和速度差別。Postgres有一個豐富的字段數據類型選擇供它的任意支配。它有標准的SQL數據類型-一個定長整數、多種浮點和定點十進制小數點數(又名DECIMAL)和定長於變長字符串。很多在功能更豐富的RDBMS中的類型也存在,包括布爾、時間間隔和autonumber(自動數)。Postgres確實在深奧的數據類型中顯示出它的學術傳統,這些包括多維數組類型(而非依靠子表),兩維幾何形狀如多邊形和圓,以及也許最不常見得的IP地址和CIDR的數據塊。也有大對象(BLOB)支持,但是文檔承認,其實現是有點慢。一開始我以為對多邊形數據類型唯一的用途是作為到CAD系統(Computer Aided Draft-計算機輔助繪圖)的後端,然而, 一個朋友馬上建議我存儲GPS數據和范圍,它使我相信了這些額外的數據類型確實遲早能派上用場。
有一堆怪異的數據存儲類型是一個問題,但是Postgres實際上有處理這些數據類型的SQL函數和算符,讓他們感到象INT和VARCHAR一樣自然是數據庫的一部分,並有助於產品的整體平滑性。一個更面向商業化的產品將省掉這些,而讓客戶方程序員做這些工作。擁有一個非商業性的背景有一些優勢。
SQL 相容性
PostgreSQL最近接受了SQL92作為其SQL語言句法的規范,並且他們相當接近了。來自一個Oracle背景的查詢編寫者將有回家的感覺,而且Sybase/SQL Server或Informix的用戶也將不會有許多麻煩。
也支持更復雜的查詢構造,例如subselect。一旦允許subselect,則實現對視圖就變得容易(並且有理由希望。
安全
Postgres有標准SQL的grant/revoke命令,同時也有該模型所有的強項和不足。另外,Postgres兼顧有點 Unix文件許可相似的語法。
事務、備份和恢復
Postgres支持事務的提交(commit)和回卷(rollback)。相反,在大多數其他輕量級數據庫產品上缺乏這個特征。目前不支持嵌套的事務,這不奇怪,因為許多主要的商業數據庫也不支持他們。
值得注意的省略
最值得注意的一個省略是缺乏外部關鍵字約束。該省略在非商業性且輕量級數據庫中是普遍的,DBASE/ Paradox/FoXPro等同類的商業的數據庫也是一樣。在獲知真正指向被參照的數據庫表的一個真實行的參考字段仍然有一個方便的因素,並且這種方便在PostgreSQL是沒有的。對有效地通過觸發器的使用強制外部鍵值通常是被廣泛接受的慣例,我將下次討論它。
存儲過程和觸發器
對Postgres有一個非常類似Oracle的存儲過程語言,允許創建函數、操作符和普通的老式過程。它有Oracle PL/SQL同樣多的特征並明顯超過Sybase的T/SQL。
一件相當奇怪的事情是觸發器獨立於存儲過程而存在。觸發器能調用存儲過程,但是不必非要這樣,相反可以調用一個更簡單的SQL查詢。這種奇特是由在Postgres早期存儲過程語言的觸發器功能的事實造成的。事實上,存儲過程語言只是另一種模塊,復雜語句功能可以通過用其他語言(C、TCL)編寫的模塊提供,並且這些模塊能在運行時刻被連接進數據庫。這種模塊化帶來一些真正的動力和靈活性,在存儲過程語言的費用方面似乎有點脫節,它其實以低價支付。
備份、恢復、導出和導入工具
備份和恢復工具是可以得到的,但是有點原始。有導出工具(拷貝數據庫表數據到一個文本文件),但是它們在功能上缺乏。沒有導入工具,然而,因為數據庫表作為常規文件系統的文件被存儲,他們可以經由 PSQL命令行和cat命令被導入。我仍然不會介意看見多幾個字節的磁盤空間花在一個外殼腳本上避免這個細節。當給出一個pg_dump實用程序,期望一個相應的pg_load似乎是合理的。
連接性
對於調用Postgres的API有幾種語言,C、C++、Perl、Python、PHP、TCL等等。有ODBC和JDBC驅動程序, 連接到Postgres基本上像你希望的那樣靈活。第三方支持工具落後於mysql,但是,在最近的幾個月裡,Postgres在這個領域已經打下了扎實的基礎。
總結
PostgreSQL已經是不利新聞的一個犧牲品,被列為一個學術的玩物,為真實世界使用太復雜。在過去這可能是對的,然而不再是。它有一個遠遠超過其他進展緩慢的數據庫甚至一些企業數據庫的功能集,然而, 它缺乏用來衡量達到高價產品的很多管理特征和調節能力,這些特征是數據庫決不會一般水平的數據庫所要求的,並且甚至他們不會注意到這很少的缺點。PostgreSQL在Unix數據庫競技場成為了一個真正的競爭者。
PostgreSQL
花費:可免費
支持平台:大多數 Unix:服務器和客戶
Windows:僅客戶
花費:可免費
支持平台:大多數 Unix:服務器和客戶
Windows:僅客戶