22歲的Postgres可能是最先進的資料庫
作為一個技術人員,我參與的許多辯論可歸結為一個問題:我們應該選擇新的東西還是經過驗證的東西?儘管討論這個問題充滿熱情,但有一些技術的答案很簡單:為什麼不兩者兼而有之?
Postgres就是這樣一種技術。它最初於1996年釋出(自1982年以來有效開發),現在已有22年曆史 - 但在許多方面,它是最現代化的資料庫管理系統。它不僅具有簡單令人難以置信的功能集,而且還超越了純資料庫,並演變為完全可程式設計的整合資料環境,並配有自己的程式語言PL / pgSQL。
在這篇文章裡,我想闡明使它成為我們Arcentry公司的後端資料庫選擇的五個非凡功能:
釋出/訂閱訊息
Postgres可以用作可群集的訊息代理。當然,它沒有像RabbitMQ或Kafka這樣的專用解決方案提供的功能集,但它將基於事件的訊息傳遞整合到更廣泛的資料上下文中使其極具價值。例如,Arcentry的內部部署版本使用了這種模式。我們使用Postgres-Messaging作為橫向可擴充套件部署的主幹。
每當使用者對任何圖表進行更改時,Arcentry都會向伺服器發出請求,該請求會將更新合併到Postgres中儲存的二進位制JSON文件中。一旦確認寫入,觸發器就會發出一個事件,即所有其他連線的伺服器都已訂閱,然後將更新轉發給其活動使用者。
這為我們提供了一種簡單的方法來提供具有強一致性的水平可伸縮實時更新 - 所有這些都來自單個外部依賴。
觸發器
觸發器是在操作資料之前或之後執行的函式。它們是將驗證,轉換和派生邏輯直接構建到資料庫中的絕佳方式。
觸發器還提供了一種擴充套件現有資料庫功能的簡單方法。例如,提供對Arcentry帳戶表進行更改的不可變審計日誌。
我們只是將一個觸發器程式設計到Postgres中,而不僅僅是在帳戶表中的行被更改時執行,包括寫入當前行的副本也會觸發,將時間戳和啟動更改的userId儲存到單獨的審計表。
外國資料包裝
有時,將使用者現有的資料庫整合到Arcentry中是很好的 - 無論是查詢使用者帳戶還是將文件資料儲存在已建立的結構中。當然 - 有很多方法可以達到這個目的,但是Postgres的ofollow,noindex" target="_blank">外部資料包裝器 特別方便。
這些是將Postgres連線到任意數量的其他資料來源的端點,例如MongoDB,Redis,MySQL甚至CSV或JSON檔案。就查詢語句而言,這些源只是常規的Postgres表,可以加入,搜尋,引用併成為資料庫的有機組成部分 - 使Postgres成為強大的整合工具和資料湖設定的潛在訪問點。
JSONB
許多資料庫儲存JSON或其二進位制表現模型:JSONB - 我發現這不會引起太多的興奮。但Postgres的操作功能使JSON成為基於表的關係資料庫中的一等公民。無論是輸出查詢結果是巢狀的JSON結構還是動態解析JSON,Postgres都可以很好地處理它。
附加元件
然而,有時PL / pgSQL和觸發器都不足以實現所需的功能。對於許多其他資料庫,這只是它的限制之處 - 但Postgres令人印象深刻的可擴充套件性。編寫Postgres外掛並不是一件容易的事(相信我,我試過),但幸運的是,許多有才華的工程師為我完成了工作並構建了將Postgres變成完全不同的產品的擴充套件。
以PostGIS 為例,它將Postgres伺服器變成一個完全成熟的地理資訊系統(GIS)空間資料庫。
或者將Postgres變成時間序列儲存/流處理器的PipelineDB 怎麼樣?
有任意數量的Postgres擴充套件,工具和GUI,可在此處 找到概述
爺爺也很時髦