許清琦
1971年3月,英特爾公司推出了世界上第一個通用微處理器,即英特爾4004,它有2 300個晶體管,售價60美元。時間快進50年左右,最新的蘋果手機有將近120億個晶體管。
直至90年代,許多我們目前使用的編程語言才被引入(Java是1996年引入的)。然而,有一種編程語言50年前就被引入,但熱度仍然不減當年,那就是SQL。
早期數據庫管理史———IDS和CODASYL
1962年,查爾斯·W·巴赫曼是通用電氣公司一個小團隊的成員。一年后,巴赫曼的團隊推出了集成數據儲存系統(IDS),該系統后來被公認為是首個數據庫管理系統。
10年后,巴赫曼獲得了眾人向往不已的圖靈獎,也稱為計算機科學領域的諾貝爾獎,以此表彰他對IDS計算的貢獻。
IDS
20世紀60年代初,計算機科學才剛剛開始成為一個學術領域,在這樣的大背景下,美國信息交換標準代碼(ASCII)直到1963年才被引入。要想理解IDS,得先了解促進其發展的2個主要動力:磁盤存儲器的引入和向高水平編程的轉變。
磁盤存儲器
1956年,IBM推出了第一個商用硬盤驅動器RAMAC 305,磁盤驅動器的引入,使程序員能直接跳轉到磁盤的某個位置來檢索和更新數據。相比它的前身磁帶驅動器,這是一個巨大的進步,后者需要在磁帶中按序移動來檢索一個特定片段的數據。
但開發者必須找出磁盤上存儲記錄的位置。由于早期操作系統中的文件管理系統具有局限性,這是一項只有經驗豐富的程序員才能完成的高級任務。開發者需要一個解決方案,以簡化磁盤驅動器的運作。
高水平編程
與此同時,在采用曲線上,計算機科學開始從創新者向早期采用者轉變。像Assembly這樣的低級編程語言在早期學術領域內很流行,但普通程序員會轉而使用更高級的編程語言,如COBOL,因為其更易使用。
IDS解決了磁盤存儲和高級編程問題,允許開發者使用COBOL之類的高級編程語言,以此來構建應用程序,從磁盤存儲中輸入檢索數據。由于這個功能,IDS成為了第一個數據庫管理系統。
CODASYL———數據庫管理的新標準
1969年,數據系統語言委員會(CODASYL)發布了一份報告,提出了一個數據庫管理的標準。巴赫曼是該委員會的一員,且該報告大量引用了IDS。
CODASYL數據模型引入了許多如今數據庫管理系統的核心特性包括:模式數據定義語言(DDL)和數據操作語言(DML)。
最重要的是IDS和CODASYL引入了一種新的數據建模方法,這種方法影響了SQL的最終開發,即網絡數據模型。
網絡數據模型
數據模型是用于描述(模擬)世界(數據)的標準方法。從前的分層數據模型使用樹狀結構來描述數據,但其僅限于一對多的關系。新的網絡模型允許子記錄有多個父記錄,從而創建一個圖形結構。通過允許多個父記錄,網絡模型能對多對一和多對多的關系進行建模。
在網絡模型中,表之間的關系存儲于集合中。每個集合都有一個所有者(即教師)和一個或多個成員(即班級和學生)。
網絡模型的一個關鍵優勢是,集合中的相關記錄是通過指針直接連接的,集合是通過next,prior,owner指針實現的,能像鏈表一樣方便查看。
網絡數據模型的底層特性提供了性能上的好處,但這是有代價的。網絡數據模型增加了存儲成本,因為每條記錄都必須存儲額外指針,這些指針指向先前的記錄和父記錄。
關系模型的來臨
1970年,在IDS之后的8年,埃德加·F·科德在他的開創性論文《大型共享數據庫的數據關系模型》中引入了關系模型,這篇論文也讓他和巴赫曼一樣,成為了圖靈獎得主。科德表明,數據庫里所有的數據都能用元組(SQL中的行)表示,這些元組被分組為關系(SQL中的表)。為了描述數據庫查詢,他發明了一階謂語邏輯的形式,叫作元組關系演算。
元組關系演算引入了一種用于查詢數據的聲明式語言。聲明式編程語言使程序員可以在不描述“如何做”的情況下,直接說出他們“想做什么”。
這種新的聲明式語言對開發者來說更容易使用。關系模型公開展示了所有數據,開發者能從表中檢索所有數據,或在單個命令中讀取單個行(多虧查詢優化器)。跟著指針迷宮尋找數據的日子已經一去不復返了。
關系數據模型vs.網絡數據模型
通過規范數據,關系數據庫能降低網絡數據庫的高存儲成本。規范化是一個分解表,以消除冗余的過程,從而減少數據占用的磁盤空間。然而,關系數據庫增加了CPU成本,為了運行規范化數據,關系數據庫必須將表加載到內存中,并使用計算能力將表連接在一起。讓我們可以通過一個關系模型來完成為某個特定教師找到所有班級和學生這一過程。
數據庫系統首先會執行一個操作來檢索所有相關的班級,接著就是檢索學生數據。所有的數據都會被存儲到內存中,在返還結果前,它會進行第三步操作來合并數據。
在使用真實數據的性能案例研究中,雷瑪數據管理公司發現,網絡數據庫模型的插入性能優于實際數據23倍,且查詢數據的速度比實際數據快123倍。
所以,為什么關系數據庫會成為領先的數據庫解決方案?
易用性
關系模型能更加靈活地應對變化,它的聲明句法簡化了程序員的工作,摩爾定律在其背后發揮著神奇的作用,計算成本持續降低。最終,關系模型中增加的計算成本與生產力提高所帶來的收益相抵消,如今數據中心最昂貴的資源就是CPU。
SQL時代的崛起
在科德的文章發表4年后,唐納德·張伯倫和雷蒙德·博伊斯發表了《SEQUEL:結構化英語查詢語言》。他們將SEQUEL描述為“一組在一階謂語演算冪上的…關于表格結構的簡單操作”。IBM發現了這種潛力,并在20世紀70年代初迅速開發了第一版SEQUEL,作為其System R項目的一部分。
后來之所以更名為SQL,是因為與英國供應商霍克西德利飛機公司(Hawker Siddeley)存在商標糾紛。SQL的下一次飛躍是在近10年后了。1986年,美國國家標準協會(ANSI)和國際標準化組織(ISO)發布了第一個官方的SQL標準:SQL-86。該標準將SQL分割成以下幾個部分:數據定義語言(DDL):用于定義和修改模式以及關系的命令;數據操作語言(DML):用于從數據庫中查詢、插入和刪除信息的命令;事務控制:指定事務時間的命令;完整性:在數據庫信息中設置約束的命令;視圖:用于定義視圖的命令;權限:指定用戶訪問的命令;嵌入式SQL:指定如何在其他語言中嵌入SQL的命令。
1974年至今,無數競爭者試圖從占統治地位的查詢語言SQL手中奪取市場份額,這些新的句法通常針對特定的新技術。但是35年之后,SQL仍然在數據庫中無所不在。
SQL統治50年的秘訣
從巴赫曼引入第一個數據庫管理系統IDS講起,討論了從磁盤存儲向高級編程轉變,催生了對處理數據新方法的需求,接著迎來了CODASYL和標準化數據庫管理,IDS和CODASYL引入了新的網絡數據模型,最終科德放棄了關系模型,這一切發展用了超過8年的時間。
SQL是如何成功在后來的50年間保持流行的?有4個主要原因:
建立在基本原則之上
基本原則是一個基本命題,不能從其他任何命題或假設中推導出來。例如,將碳氫化合物和氧氣結合,產生化學反應,這仍然是驅動每輛汽車內燃機的原理。
1970年,科德創造了新的數據庫基本原則:元組關系演算。這個新邏輯的創建產生了關系模型,之后引出了SQL。元組關系演算就是化學反應,關系模型就是內燃機,而SQL就是汽車。
布什內爾定理
僅僅建立在基本原則的基礎上不能保證成功。Assembly是程序員能做出的最接近1和0的程序,但仍然被COBOL(以及后來的C)所取代,其中缺失的成分就是易用性。
無獨有偶,在從網絡模型到關系模型的轉變中,網絡模型性能更好,但如今每家公司都在使用關系數據庫,因為它更容易上手。
Assembly不僅精通難,入門也很難。SQL在二者之間達到了完美的平衡。通過10個左右的SQL命令,任何人都能學會20 %,然后進階到80 %,但要想成為一名大師,需要經過長期的索引、視圖和優化過程。
傾聽和適應
查詢語言不是永恒的單一語言,而是一組與時俱進的適應性標準,SQL標準一直在隨時間進行調整,并吸收來自用戶的反饋。從最初的概念以來已經有了10種不同的SQL標準,每種都做出了重要的改變。以下是其中的三大更新:
1. SQL:1999添加了正則表達式匹配、遞歸查詢(如傳遞閉包)、觸發器、對過程語句和流控制語句的支持、非標量類型(數組)和一些面向對象特性(如結構化類型),支持在Java中嵌入SQL(SQL/OLB),反之亦然(SQL/JRT)。
2. SQL:2003引入了與XML相關的特性(SQL/XML)、窗口函數、標準化序列和自動生成值的列(包括標識列)。
3. SQL:2016增加行模式匹配、多態表函數和JSON。
SQL還展示了創造軌道的能力,且其他產品都建立在該軌道之上。SQL沒有需要強制執行的語法,而是為每個數據庫提供一個標準,讓其完成自我實現。
API的采用
SQL成功的最后一個秘訣,是應用程序編程接口(API)的興起。API通過抽象底層操作簡化了編程,只公開開發人員需要的對象或操作。API讓SQL可以使用特定句法來持續適應新科技。
2006年,Hadoop引入了分布式文件系統(HDFS),起初SQL句法無法訪問該系統。然而到了2013年,Apache創建了Apache Impala,使開發者可以使用SQL來查詢HDFS數據庫。SQL是如今最普遍使用的編程語言之一,我們不該忘記它悠久的歷史,它的旅程始于現代計算的黎明,在2位圖靈獎得主的努力下煥發生機。