PostgreSQL是世界上最好的數據庫

做者柯克·羅伊巴爾 Kirk Roybal是PostgreSQL的狂熱者,並按期爲2ndQuadrant博客作貢獻。python

前言
首先聲明,我不是標題黨,刻意誘惑點擊或誇大描述。我打算證實,不管有沒有金錢方面的考慮,經過設計和實現,PostgreSQL均可以客觀,可衡量地比當前可用的數據庫更好。
究竟我怎樣才能證實這樣一種崇高的說法是正確的呢?
繼續閱讀,可愛的讀者。我保證不會浪費您的時間。程序員

安全透明
PostgreSQL有一個安全郵件列表。PostgreSQL項目組與其餘全部人在同時學習入侵向量。沒有什麼是隱藏的,任何發現的東西都以使商業供應商頭暈目眩的速度進行工做。供應商提供了正在審查的軟件,他們所提供的的缺陷列表會更簡短。
這意味着全部已知的攻擊載體一旦公開就會被處理。這種安全響應能力在商業領域甚至是不可估量的。對於商業供應商來講,在問題獲得解決以前保密對補救相當重要。PostgreSQL卻沒有這樣的限制,這是否是很棒呢!算法

多版本併發控制對您有好處
PostgreSQL選擇了一種併發控制方法,該方法最適合高INSERT和SELECT工做負載。
PostgreSQL的設計很是簡單,只需記住更新和刪除的跟蹤開銷。重要的是,若是您尊重數據,則應該嘗試擁抱PostgreSQL爲您提供的數據安全性。
PostgreSQL中DDL也能參與事務。徹底遷移或徹底無效(最糟糕的一種無效方法是近乎立刻完成的廢棄)。測試用例也能夠重建。須要重置測試工具嗎?答案是隻需回滾事務。
PostgreSQL支持符合標準的事務隔離形式,包括序列化,已提交讀和可重複讀。這些方法徹底符合ACID標準。sql

PostgreSQL幾乎能作全部事情
那麼,您想使用NoSQL、Riak、REACT、Redis、Mongo等的功能嗎?PostgreSQL都具有這種能力。不能否認,不能包括原始產品的全部細節。例如,PostgreSQL不會爲您建立新的分片,那仍然是一個手動過程。但總有辦法,譬如pg_partman。
您想要列數據存儲嗎?hstore可供選擇。
您不想再培訓員工嗎?使用您已選擇的語言繼續拓展業務。
您要部分複製嗎?流式邏輯複製適合您。
您要從其餘系統提取數據嗎?PostgreSQL具備全部數據庫中最活躍的聯邦對象集合-外部數據包裝器(FDW),您能夠用膠帶和拉鍊將PostgreSQL掛接鱷魚身上。能夠對他像對待您本身的數據同樣。
很難想到一個PostgreSQL不具有的功能,或者沒有PostgreSQL擴展所能提供的功能。數據庫

擴展地圖功能
能夠說PostGIS社區可能比PostgreSQL社區自己更大。PostgreSQL的映射功能將其放在了一個類中,即便與很是昂貴的替代品相比也是如此。
PostGIS項目之因此選擇PostgreSQL做爲平臺,是由於其易擴展性和豐富的數據功能。這些功能能夠直接公開給其餘任何項目使用。任何其餘供應商,不管是商業的仍是開源的,都沒法回答這些問題。編程

PostgreSQL在開源領域正在引領發展
PostgreSQL項目是開源軟件中最引人注目的組織之一。隨着社區龐大的力量和巨大的增加,如今能夠說它所存在的任何不足都會在其餘供應商意想不到的時間內被解決。
幾乎天天都有新的企業級功能特性發布,維護這些特性的員工是從每家公司都但願聘用的天才中挑選出來的,只是人手遠遠不夠。後端

PostgreSQL創建了長期穩定的解決方案
PostgreSQL在內核中內置了邏輯複製。這容許跨版本遷移。您沒有被鎖定到特定的硬件或軟件版本。該解決方案能夠無限升級。
此外,許多平臺都支持PostgreSQL,包括Linux的超穩定版本。你是否須要一個比典型的3~5年投資回報率還長的解決方案?即便你歷來沒有升級過硬件,PostgreSQL也會永遠支持你。費用很容易計算,0美圓。緩存

聲明式優於命令式
數據庫語言一般是聲明性的。也就是說,您使用本身選擇的內置語言編寫了一個查詢,描述了您但願看到的結果。該數據庫嘗試解碼您的意圖,並提供適當的結果。這是全部聲明式編程模型的基礎。在PostgreSQL中,這能夠歸結爲將函數映射到SQL語言中的關鍵字,有時還會有幾個算法選擇來精確地實現每一個聲明。
在關於命令式與聲明式編程模型的古老爭論中,我以爲聲明式編程只是一種假裝的命令式編程。數據庫查詢語言中的每一個聲明性令牌最終都映射到一種或幾種以命令式術語應用聲明的算法。所以,由Henrietta定義的阻抗失配最終是由開發人員決定的。也就是說,若是開發人員的思惟方式與數據庫函數程序員的思惟方式徹底一致,那麼就不會出現不匹配。
那麼,假設一個模型只是另外一個模型的調用特徵,那麼聲明式模型最終將比命令模型更好嗎?很高興您這麼問,由於這正是我要強調的一點。
PostgreSQL開發人員比較聰明。我不是開玩笑或忸怩做態。從字面上看,成千上萬的貢獻者爲PostgreSQL項目作出了數以百萬計的貢獻,其中許可能是對其餘貢獻者的改進。你頭腦中想到的任何狀況比起已經實現的功能更好的機會是很是低的。並且,即便你的想法更好,你也應該把它們貢獻給PostgreSQL項目,以造福全部人,從而提升其餘人的標準。
那麼,是什麼讓PostgreSQL那麼精彩呢?無需考慮公司利益便可在全球範圍內共享思想。成千上萬的開發人員正在花費數十萬小時來作出更好的算法選擇。所以,您的軟件在每一個版本中都會變得更好,一般不須要作任何特別的事情。
您說,這難道不是軟件的本質嗎?嗯,是的。但遠不及整個世界範圍的人才都參與到你的項目中來。PostgreSQL在開源社區中享有很是顯著的地位。商業供應商將永遠沒法跟上開源項目在這個層次上所能提供的變化速度。向開源(尤爲是PostgreSQL)的遷移就是證實。
商業供應商能夠指出的明顯優點已經所剩無幾了。其中包括SMP支持、雙向複製和外部工具。猜猜社區如今正在作什麼,極可能這些在將來幾年將得以發佈。安全

任意擴展PostgreSQL
PostgreSQL有一個充滿活力的編寫輔助軟件的技術社區。這包括插入您喜歡的任何語言,並使用它以有用的任何方式擴展PostgreSQL。您是否喜歡perl字符串處理?好的,可使用它。Python地圖支持怎麼樣?固然,只需插入python就能夠進城了。是否想使用PostgreSQL後端編寫Web服務?太棒了,PostgreSQL會幫上忙。JSON?好。XML?PostgreSQL對全部這些都有直接的支持,而且提供了無限的支持。若是您認爲可使用一種很好的語言,則將其插入PostgreSQL,而後將其放在服務器端便可。
您能夠建立本身的函數,數據類型,運算符,集合,窗口函數或幾乎其餘任何東西。沒有看到您喜歡的功能?從源代碼拷貝並自定義它。因爲許可證,您能夠自由地這樣作。
PostgreSQL還提供了一些鉤子函數,容許您擴展數據庫而沒必要進行極端的編程。
這種吸取任何其餘語言特性的能力是PostgreSQL所獨有的。您可使用現有的任何標準庫來提供任何特性。你能夠遵循標準,跟上變化,能夠在PostgreSQL尚在運行時對其進行更新,而且能夠免費完成全部操做。服務器

大而廣
PostgreSQL具備多種功能,能夠充分利用已提供的硬件平臺。分區,並行執行,部分索引,表空間,緩存和並行非阻塞維護例程(PostgreSQL中幾乎全部東西最近都在使用CONCURRENTLY關鍵字)
若是這還不足以知足您的需求,那麼物理流複製將以便宜的價格爲您提供您所需數量的可讀從節點。分片、內存緩存、隊列、負載平衡和鏈接池均可以在PostgreSQL中使用。還不夠嗎?邏輯流複製怎麼樣?您想對世界範圍的數據庫進行地理分區嗎?好了,歡迎使用雙向複製。
並且價格仍然是0美圓。

索引豐富
PostgreSQL支持如此多的索引列表,以致於令人難以肯定如何使用它們。GiST、spi - GiST、KNN GiST、GIN、BRIN和Btree都是可用的。還有不少其餘功能能夠經過擴展實現,例如Bloom過濾器等。
PostgreSQL能夠將它們與函數驅動的索引,部分索引,覆蓋索引和全文搜索一塊兒使用。這些擴展功能不是互斥的。您能夠同時使用它們。

數據「推手」
已經提到的幾種技術使PostgreSQL成爲了出色的數據集成和分發平臺。多種形式的複製與聯合爲幾乎任何類型的數據系統提供了推、拉技術。
它們能夠無限配置、組合在一塊兒,以橋接數據庫存儲解決方案。全部這些都不須要任何ETL/ELT處理程序包。PostgreSQL就是這樣作的。這個地球上最快的單一事實來源數據庫是經過徹底不將數據從源系統移出來實現的。這意味着數據始終是最新的,而且能夠管理響應時間。
若是您沒法忍受源系統的不可靠性,或者但願在查詢端得到更好的性能,您還可使用物化視圖按期緩存數據,這些視圖能夠在查詢時進行更新。
譯者注:推手是太極術語,本地引入目的是描述數據的推送和拉取。

許可證是開放的
PostgreSQL有本身的許可證,主要基於BSD許可證。這容許更大的使用和分發自由。
該許可證適用於主要項目的全部代碼,主要貢獻擴展,客戶端庫,鏈接管理器以及大多數相關工具。
它是高度寬容的,原文許可描述中,並不涉及可供購買。

很棒的文檔
PostgreSQL項目要求任何提交代碼的開發人員都要提供建議描述文檔。該建議用於建立功能的說明,建議文檔以多種格式提供。此文檔還用於評估功能模塊自己,並做爲將來開發功能模塊的參考。
總之,這意味着PostgreSQL依賴於文檔。有不少PostgreSQL的開發人員已經學會了用C語言編碼,數據庫是如何工做的,以及如何管理PostgreSQL項目。這份文件是數一數二的。

測試驅動開發
PostgreSQL通過了普遍、詳盡的測試。每一個錯誤都會經過測試來驗證其存在,並編寫代碼來知足該測試。首先經過建立測試(和文檔)來編寫新功能,而後對其進行編碼,直到實現該功能爲止。
這些測試已集成到組建場中進行迴歸,所以bug不會(從新)出如今PostgreSQL的將來版本中。這意味着在每一個構建週期中,將爲每一個版本的PostgreSQL運行每一個測試(當前測試)。這是大量的測試,它確保PostgreSQL仍然是可用的最穩定的數據庫。
PostgreSQL僅在全部迴歸測試經過後才發佈。這提供了「 0個已知錯誤」版本。

國際化和本地化
PostgreSQL的開發人員來自世界各地。自PostgreSQL成爲大學畢業生項目以來,他們就一直在使用多種本地語言工做。國際化和本地化已經成爲PostgreSQL的標準作法,而PostgreSQL再也不是吸引全球商業市場的一個螺釘。
儘管PostgreSQL出於兼容性緣由將某些國際化委託給操做系統,但許多翻譯都嵌入到系統中,從而提供了無縫的語言過渡體驗。

雲端做業
PostgreSQL在雲架構中使用ansible、kubernetes和來自多個雲供應商的專有工具。有幾種本地雲實現可供選擇,以匹配您的架構。
若是您想像牛而不是寵物那樣對待服務器,PostgreSQL也爲您提供了雲服務。

符合標準
PostgreSQL在項目的整個生命週期內一直是標準的。因爲PostgreSQL起源於大學的研究生課程,所以它已被用做許多SQL標準的參考實現。
PostgreSQL實現了SQL/Med和ANSI SQL。
根據出色的文檔描述,「 PostgreSQL支持SQL:2016的大部分主要功能。完整的核心一致性須要179個強制性的特性,PostgreSQL至少符合160個。這幾乎超過了任何其餘數據庫引擎。

語言功能
PostgreSQL實現了公共表表達式(CTE)、語言控制結構(if、for、case等)、結構化錯誤處理,以及您指望從成熟過程語言中得到的全部好處。

您信服了嗎?
我仍然能夠談論用戶組、IRC頻道、有解決方案的網站、博客文章和導師的奇妙社區。對於數據庫是跨平臺、跨體系結構和跨文化的,我能夠從哲學的角度進行闡述。有無數個小時的演講、視頻和講座。
或者,您能夠直接下載它,看看它是否超出您的想象。我想您會感到很是驚喜。

更多精彩內容,請關注如下平臺、網站:

中國Postgre SQL分會官方公衆號(技術文章、技術活動):
開源軟件聯盟PostgreSQL分會

中國Postgre SQL分會技術問答社區:
www.pgfans.cn

中國Postgre SQL分會官方網站:
www.postgresqlchina.com

相關文章
相關標籤/搜索