您好,登錄后才能下訂單哦!
編譯 | 佑銘
參考-https://arcentry.com/blog/postgres-might-just-be-the-most-advanced-database-ever/(文-Wolfram Hempel)
轉(zhuǎn)自 | 優(yōu)達(dá)學(xué)城
作為一個(gè)技術(shù)人,我參與過(guò)的很多爭(zhēng)論歸根到底無(wú)非就是一個(gè)問(wèn)題:嘗試新技術(shù)還是堅(jiān)持老技術(shù)?盡管這個(gè)問(wèn)題總是爭(zhēng)論不休,但對(duì)于少數(shù)技術(shù)來(lái)說(shuō),答案是簡(jiǎn)單的:兩個(gè)都要!
Postgres 就是這樣一項(xiàng)技術(shù)。1982 年開始開發(fā)、1996 年發(fā)布,至今已經(jīng) 22 歲了。然而從很多方面來(lái)說(shuō),它仍是很現(xiàn)代的數(shù)據(jù)庫(kù)管理系統(tǒng)。它不僅具有簡(jiǎn)直是令人難以置信的功能集,而且超越了單純的數(shù)據(jù)庫(kù),演變成一個(gè)完全可編程的集成數(shù)據(jù)環(huán)境,并配有自己的編程語(yǔ)言 PL/pgSQL。
Postgres 有無(wú)數(shù)神奇之處,但在這篇文章中,我只會(huì)闡明使它成為 Arcentry 后端選擇的 5 個(gè)卓越特性:
Pub/Sub 消息
Postgres 可以用作可群集的消息代理。 當(dāng)然,它不像 RabbitMQ 或 Kafka 提供專用解決方案的功能集,但將基于事件的消息傳遞集成到更廣泛的數(shù)據(jù)上下文中使 Postgres 極具價(jià)值。 例如,Arcentry 的內(nèi)部部署版本使用了這種模式。 我們使用 Postgres-Messaging 作為橫向可擴(kuò)展部署的主干:
每當(dāng)用戶對(duì)任何圖表進(jìn)行更改時(shí),Arcentry 都會(huì)向服務(wù)器發(fā)出請(qǐng)求,該請(qǐng)求會(huì)將更新合并到Postgres 中存儲(chǔ)的二進(jìn)制 JSON 文檔中。 一旦確認(rèn)寫入,觸發(fā)器就會(huì)觸發(fā)一個(gè)所有其它已連接的服務(wù)器訂閱的事件,并依次將更新轉(zhuǎn)發(fā)給其活動(dòng)用戶。
這為我們提供了一種簡(jiǎn)單的方法來(lái)提供具有強(qiáng)一致性的水平可擴(kuò)展實(shí)時(shí)更新 —— 所有這些都來(lái)自單個(gè)外部依賴。
觸發(fā)器
觸發(fā)器是在操作數(shù)據(jù)之前或之后運(yùn)行的函數(shù)。 使用觸發(fā)器是在數(shù)據(jù)庫(kù)直接構(gòu)建驗(yàn)證、轉(zhuǎn)換和派生邏輯的絕佳方式。
觸發(fā)器還提供了一種擴(kuò)展現(xiàn)有數(shù)據(jù)庫(kù)功能的簡(jiǎn)單方法。 例如,能夠?qū)崿F(xiàn)客戶對(duì) Arcentry 帳戶表進(jìn)行更改的不可變審計(jì)日志。
我們沒有寫一個(gè)額外的查詢或服務(wù)接口,而是直接在 Postgres 寫了一個(gè)觸發(fā)器,一旦賬號(hào)表中的一行有改動(dòng)就運(yùn)行,在一個(gè)單獨(dú)的審計(jì)表中寫入當(dāng)前行的副本并加上時(shí)間戳和發(fā)起改動(dòng)的 userID。
外部數(shù)據(jù)封裝器
有時(shí)候,無(wú)論是查詢用戶賬號(hào)還是將文檔數(shù)據(jù)存儲(chǔ)在已建立的結(jié)構(gòu),將用戶現(xiàn)有的數(shù)據(jù)庫(kù)集成到 Arcentry 中不失為一個(gè)好操作。 當(dāng)然有很多方法可以實(shí)現(xiàn)這一目標(biāo),但一個(gè)特別方便的方法是用 Postgres 的[外部數(shù)據(jù)封裝器 Foreign Data Wrappers](https://wiki.postgresql.org/wiki/Foreigndatawrappers)。
外部數(shù)據(jù)封裝器是將 Postgres 連接到任意數(shù)量的其他數(shù)據(jù)源如 MongoDB,Redis,MySQL 甚至 CSV 或 JSON 文件的接口。 這樣一來(lái),對(duì)于查詢語(yǔ)句來(lái)說(shuō),這些數(shù)據(jù)源就變成普通的 Postgres 表,可以連結(jié)、搜索、引用并成為數(shù)據(jù)庫(kù)的有機(jī)組成部分 —— 讓 Postgres 成為強(qiáng)大的集成工具和數(shù)據(jù)湖設(shè)置的潛在訪問(wèn)點(diǎn)。
JSONB
許多數(shù)據(jù)庫(kù)采用 JSON 格式或其二進(jìn)制表示,JSONB 存儲(chǔ) ——嗯,確實(shí)沒什么新意。 但Postgres的操作功能使 JSON 成為基于表的關(guān)系數(shù)據(jù)庫(kù)中的一等公民。 無(wú)論是輸出查詢結(jié)果是嵌套的 JSON 結(jié)構(gòu)還是動(dòng)態(tài)解析 JSON,Postgres 都可以優(yōu)雅地處理。
插件
總有 PL/pgSQL 和觸發(fā)器都不能滿足需求的時(shí)候。對(duì)很多別的數(shù)據(jù)庫(kù)來(lái)說(shuō),可能就這樣了。但 Postgres 擴(kuò)展性極強(qiáng)。寫 Postgres 插件確實(shí)不容易( 相信我,我試過(guò)),但萬(wàn)幸的是,很多厲害的工程師已經(jīng)為我們做好了開發(fā)工作,構(gòu)建了很多讓 Postgres 大變身的插件。
比如把 Postgres 服務(wù)器變成一個(gè)完全成熟的地理信息系統(tǒng)(GIS)空間數(shù)據(jù)庫(kù)的 PostGIS 。
或者 PostlineDB 將 Postgres 變成時(shí)間序列存儲(chǔ)/流處理器。
還有超多插件、工具和圖形界面,戳 https://github.com/dhamaniasad/awesome-postgres 可以一覽無(wú)余。
寶刀未老
讓這一切真正不同凡響的是 Postgres 設(shè)立的典范:對(duì)于任何軟件來(lái)說(shuō),22 年屹立不倒幾乎是不可能的 —— 但保持不懈專注并投入數(shù)十年來(lái)完善、改進(jìn)和優(yōu)化已經(jīng)很強(qiáng)大的核心足以打造一項(xiàng) 不管是現(xiàn)在還是 90 年代都舉足輕重的技術(shù)。
— 完 —
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。