作者:柯克·羅伊巴爾 Kirk Roybal是PostgreSQL的狂熱者,并定期為2ndQuadrant博客做貢獻。
前言
首先聲明,我不是標題黨,刻意誘惑點擊或夸大描述。我打算證明,無論有沒有金錢方面的考慮,通過設計和實現,PostgreSQL都可以客觀,可衡量地比當前可用的數據庫更好。
究竟我怎樣才能證明這樣一種崇高的說法是正確的呢?
繼續閱讀,可愛的讀者。我保證不會浪費您的時間。
安全透明
PostgreSQL有一個安全郵件列表。PostgreSQL項目組與其他所有人在同時學習入侵向量。沒有什么是隱藏的,任何發現的東西都以使商業供應商頭暈目眩的速度進行工作。供應商提供了正在審查的軟件,他們所提供的的缺陷列表會更簡短。
這意味著所有已知的攻擊載體一旦公開就會被處理。這種安全響應能力在商業領域甚至是不可估量的。對于商業供應商來說,在問題得到解決之前保密對補救至關重要。PostgreSQL卻沒有這樣的限制,這是不是很棒呢!
多版本并發控制對您有好處
PostgreSQL選擇了一種并發控制方法,該方法最適合高INSERT和SELECT工作負載。
PostgreSQL的設計非常簡單,只需記住更新和刪除的跟蹤開銷。重要的是,如果您尊重數據,則應該嘗試擁抱PostgreSQL為您提供的數據安全性。
PostgreSQL中DDL也能參與事務。完全遷移或完全無效(最糟糕的一種無效方法是近乎馬上完成的廢棄)。測試用例也可以重建。需要重置測試工具嗎?答案是只需回滾事務。
PostgreSQL支持符合標準的事務隔離形式,包括序列化,已提交讀和可重復讀。這些方法完全符合ACID標準。
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頻道、有解決方案的網站、博客文章和導師的奇妙社區。對于數據庫是跨平臺、跨體系結構和跨文化的,我可以從哲學的角度進行闡述。有無數個小時的演講、視頻和講座。
或者,您可以直接下載它,看看它是否超出您的想象。我想您會感到非常驚喜。
PG考試相關詳情:http://www.pgccc.com.cn/
責任編輯:Rex_08