身為開發者,工作內容不只是寫程式碼,而是產出結果;SQL 正是達成這件事的重要工具之一。PostgreSQL 負責集中管理資料,SQL 則用來從應用程式碼中取得「恰好需要的」結果集(result set),再填入記憶體中的資料結構供程式處理。作者以 Rob Pike 的話為全書開場:

Data dominates. 如果你選對了資料結構、把事情組織好,演算法幾乎總是不言自明。程式設計的核心是資料結構,而非演算法。—— Rob Pike

關於本書#

  • 本書寫給「應用程式會用到資料庫伺服器」的開發者,並專門針對 PostgreSQL——如官網標語所說,它是世界上最先進的開源資料庫。
  • 作者迪米崔・馮丹(Dimitri Fontaine)在與許多客戶合作後發現:多數開發者只用到 SQL 與 PostgreSQL 能力的一小部分,不知道 SQL 能做到什麼;即使被展示過「一小段高效 SQL 可以取代數百行應用程式碼」,也常不知道如何把原生 SQL 查詢整合進自己的程式庫。
  • 把 SQL 當成程式碼看待,意味著套用與其他語言相同的進階工具鏈:版本控制、自動化測試、程式碼審查、部署。這其實更關乎開發者的工作流程,而非 SQL 本身。
  • 透過書中大量範例,你會看到多用 SQL 的理由——首要就是寫更少的程式碼

如同戴克斯特拉(Edsger W. Dijkstra)所言,程式碼行數應該視為「花費的行數」(lines spent)而非「產出的行數」。學會善用 SQL,就能用更少的花費寫出同樣的應用程式。

延伸:Dijkstra 原文出處

引文出自 Dijkstra 的 On the cruelty of really teaching computing science(EWD1036):業界慣於把「每月產出的程式碼行數」當作程式設計師生產力的度量,這種單位代價高昂,因為它鼓勵寫出乏味臃腫的程式碼;若真要計算行數,應把它記在帳本的「支出」欄,而非「產出」欄。

關於作者#

  • Dimitri Fontaine 是 PostgreSQL 主要貢獻者(Major Contributor),投入開源軟體的使用與貢獻已近二十年。
  • 他是資料載入工具 pgloader 的作者,支援從 MySQL、SQLite、MS SQL 等資料庫全自動遷移到 PostgreSQL。
  • 職涯中歷任開發者、維護者、打包者、發布經理、軟體架構師、資料庫架構師與 DBA,也創辦過數家以開源為商業模式的公司,並在大型企業擔任過管理職與高階主管。
  • 他在 http://tapoueh.org 經營部落格,發表 SQL 與 PostgreSQL 進階用法的深度文章。

致謝#

作者感謝所有為本書貢獻的人,特別是擔任導師角色的好友朱利安・丹裘(Julien Danjou),他最受用的建議是:「寫那本你自己想讀的書。」也感謝接受訪談的各位(依出場順序):Yohann Gabory、Markus Winand、Grégoire Hubert、Álvaro Hernández Tortosa、Kris Jenkins、Craig Kerstiens——來自不同背景的 SQL 使用者觀點,正是本書「拓展讀者視野」目標的重要助力。最後感謝 PostgreSQL 社群:一群聰明又友善、致力解決真實使用者問題的人,難怪 PostgreSQL 是如此出色的產品。

本書的組織方式#

  • 每一部(part)都可以獨立閱讀,但各部的先後順序經過精心安排,從頭到尾線性閱讀是最佳體驗
  • 技能進展並非線性:每次引入新的 SQL 概念,都先用夠簡單的查詢讓你專注在新觀念上,再逐步推進到更有趣的業務問題;新章節開始時複雜度會重設。這種安排也讓你更容易跳著讀特定章節。

各部內容速覽:

  • 第 1 部(前言):本書介紹與閱讀期待,就是你正在讀的這一篇。
  • 第 2 部(導論):以一份簡單資料集與簡單查詢對比等價的 Python 程式碼,說服開發者「SQL 能做的比你想的多」,再延伸到一個鮮為人知的重要技巧及其進階變形。
  • 第 3 部(撰寫 SQL 查詢):從應用開發者角度回答——為何用 SQL 而非慣用語言?如何把 SQL 整合進原始碼?如何使用 psql REPL?索引策略是什麼?並特別著墨「何時用 SQL 實作業務邏輯」。收尾訪談:Yohann Gabory。
  • 第 4 部(SQL 工具箱):應用開發者需要掌握的多數 SQL 概念,從基礎打底,進階概念皆配合易懂的資料模型與業務情境。涵蓋 ORDER BY 與 k-NN 排序、GROUP BY/HAVING/GROUPING SETS、經典與進階聚合、視窗函數(window functions)、惡名昭彰的 NULL,以及關聯(relation)與連接(join)。收尾訪談:Markus Winand。
  • 第 5 部(資料型別):PostgreSQL 是物件導向關聯式資料庫(ORDBMS),型別遠不只數字、日期、文字,本部涵蓋大量可善用的主要資料型別。收尾訪談:Grégoire Hubert。
  • 第 6 部(資料建模):關聯式資料建模是應用開發者最重要的技能——模型好,查詢就好寫、邏輯清晰、資料乾淨。本部刻意放在後段:不先懂進階 SQL,就難以判斷模型是否好用,開發者因而傾向過早最佳化,反而傷害 SQL 的效益。收尾訪談:Álvaro Hernández Tortosa。
  • 第 7 部(資料操作與並行控制):DML(INSERT/UPDATE/DELETE)與並行存取——RDBMS 的核心能力,涵蓋隔離與鎖定、以 SQL 計算與快取(含快取失效技巧)等。收尾訪談:Kris Jenkins。
  • 第 8 部(PostgreSQL 擴充套件):精選實用擴充:以 hstore 稽核變更、以 pg_trgm 實作自動建議與自動修正、使用者自訂標籤的高效搜尋、以 ip4r 做地理定位功能、以 hyperloglog 解決高基數估算問題。收尾訪談:Craig Kerstiens。

各章引入新概念時複雜度會「歸零重來」,所以即使跳章閱讀,也能從簡單查詢快速進入狀況。