1. 程式人生 > 其它 >為何PostgreSQL是世界上最好的資料庫?

為何PostgreSQL是世界上最好的資料庫?

作者:柯克·羅伊巴爾 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/