PostgreSQL 的藝術 封面

PostgreSQL 的藝術

👨‍💼: Dimitri Fontaine
📅: October 14, 2019
Buy Now
📖:
寫給應用程式開發者的 SQL 進階指南:把 SQL 當成一門完整的程式語言,用一段高效查詢取代數百行應用程式碼,並將它納入版本控制、測試與部署的工作流程。
📘 深度概覽

作者背景#

迪米崔・馮丹(Dimitri Fontaine)是 PostgreSQL 專案的主要貢獻者(Major Contributor),投入開源軟體近二十年。他在 PostgreSQL 核心中實作了擴充套件管理機制(CREATE EXTENSION,9.1 版)與事件觸發器(event triggers,9.3 版),這兩項功能正好對應本書後半強調的「可擴充性」主軸。他也是資料遷移工具 pgloader 的作者,支援從 MySQL、SQLite、MS SQL 全自動遷移至 PostgreSQL。

職涯上,他歷任開發者、套件維護者、發布經理、軟體架構師、資料庫架構師與 DBA,創辦過數家以開源為商業模式的公司,並在大型企業擔任管理與高階主管職務。這種「同時站在應用開發端與資料庫端」的雙重經驗,決定了本書的視角:它不是 DBA 寫給 DBA 的調校手冊,而是一位長期替客戶收拾爛攤子的顧問,寫給那些「有在用資料庫、卻只用到 SQL 一小部分能力」的應用程式開發者。他長期在 tapoueh.org 發表 SQL 與 PostgreSQL 的深度文章。

完整摘要#

本書要解決的問題是一種普遍的能力落差:多數開發者只使用 SQL'89 程度的 select … from … where …,而現行標準已推進到 SQL:2016,其間累積的大量資料處理能力被完全閒置。結果是業務邏輯被搬回應用層,用數百行迴圈與中介資料結構,重做資料庫本來一句話就能完成的事。

作者提出的核心主張是 「SQL 就是程式碼」(SQL is code),並由此推出兩條互相支撐的論證路線。第一條是工作流程:既然 SQL 是程式碼,它就該享有與其他語言相同的待遇——縮排排版、註解、版本控制、單元測試、code review 與部署流程;查詢必須能被快速定位、重播、修改後放回程式庫,正式環境才有除錯的可能。索引策略因此也不是 DBA 的事,而是應用程式開發者份內的工作。第二條是能力擴張:全書以大量可在本機重現的真實資料集,系統性地展開 SQL 的表達力——ORDER BY 與 k-NN 排序、GROUP BYHAVINGGROUPING SETS、經典與進階聚合、視窗函數(window functions)、NULL 的語意陷阱,以及關聯與各式 join(含 lateral join)。

進入後半,論證從「語言」轉向「模型」。作者刻意把資料型別與資料建模安排在進階 SQL 之後,理由是:檢驗一個綱要(schema)好不好,唯一的方法是在 psql 提示符下針對真實業務情境把查詢寫出來;不先掌握進階 SQL,開發者會因為「這查詢寫不出來」而過早最佳化模型,反而毀掉 SQL 的效益。接著處理 DML 與並行控制——ACID 保證下的隔離與鎖定、批次處理、以 SQL 計算與快取失效——最後展示 PostgreSQL 獨有的可擴充性根基(源自 Stonebraker 與 Rowe 的《The Design of Postgres》設計目標),以 hstore 稽核變更、pg_trgm 做自動修正、ip4r 做地理定位、hyperloglog 估算高基數。

全書的結論回到座右銘 「一個結果集,一條查詢」(one resultset, one query),以及作者的雙關語 PostgreSQL is YeSQL:與其繞開 SQL,不如把它學到足以成為最大優勢。呼應戴克斯特拉(Edsger W. Dijkstra)的觀點,程式碼行數應記在帳本的「支出」欄——善用 SQL,就是用更少的花費寫出同樣的應用程式。

本書的貢獻與定位#

在 PostgreSQL 書市中,本書填補的是「參考手冊」與「效能調校指南」之間的空缺。它既不像官方文件那樣按功能窮舉,也不像 DBA 取向書籍那樣圍繞 vacuum、複製與監控打轉,而是把整本書組織在一個開發者關心的問題上:同樣的功能,怎樣寫最少的程式碼? 與 Markus Winand 的《SQL Performance Explained》相比,後者專注在索引與執行計畫這一個縱深,本書則橫向鋪開整個 SQL 語言表面,並額外處理「如何把原生 SQL 整合進程式庫」這個 ORM 世代開發者真正卡住的地方。

它挑戰的既有觀點有二:一是「業務邏輯不該寫在資料庫裡」這條被泛用化的教條,作者主張要分辨的是「資料處理邏輯」與「業務規則」;二是「用 ORM 就不必懂 SQL」的假設。書中六篇與不同背景實務者的訪談(Yohann Gabory、Markus Winand、Grégoire Hubert、Álvaro Hernández Tortosa、Kris Jenkins、Craig Kerstiens)強化了這個立場的多樣性。主要受眾是已在專案中使用 PostgreSQL、但停留在 ORM 產生查詢層次的中階開發者;不適合完全零 SQL 基礎者,也不適合尋找叢集架構與運維方案的讀者。