自從可以利用計算機做事以來,我們一直在收集的數(shù)據(jù)以指數(shù)級的速度在增長,因此對于數(shù)據(jù)存儲、處理和分析技術(shù)的要求也越來越高。在過去的十年里,由于 SQL 無法滿足這些要求,軟件開發(fā)人員就拋棄了它,NoSQL 也就因此而漸漸發(fā)展起來:MapReduce,Bigtable,Cassandra,MongoDB 等等。
然而,如今 SQL 正在重新復(fù)出。云端的主要供應(yīng)商們現(xiàn)在都提供了廣受大眾歡迎的托管關(guān)系型數(shù)據(jù)庫服務(wù):例如 Amazon RDS,谷歌 Cloud SQL,Azure 的 PostgreSQL 數(shù)據(jù)庫 (Azure 將于今年發(fā)布)。用亞馬遜自己的話來說就是 Aurora 數(shù)據(jù)庫結(jié)合了 PostgreSQL 和 mysql 數(shù)據(jù)庫,因此該產(chǎn)品一直是 “AWS 歷史上增長最快的服務(wù)”。在 Hadoop 和 Spark 之上的 SQL 接口繼續(xù)蓬勃發(fā)展。就在上個月,Kafka 推出了 SQL 支持。
在這篇文章中,我們將研究 SQL 現(xiàn)在復(fù)出的原因,以及這對未來的數(shù)據(jù)社區(qū)工程和分析意味著什么。
第一章:新希望
為了理解為什么 SQL 會卷土重來,讓我們先了解一下最初設(shè)計它的原因。

好的故事都是起源于 20 世紀(jì) 70 年代
我們的故事始于 20 世紀(jì) 70 年代早期的 IBM 研究,那時關(guān)系型數(shù)據(jù)庫就誕生了。當(dāng)時的查詢語言依賴于復(fù)雜的數(shù)學(xué)邏輯和符號。Donald Chamberlin 和 Raymond Boyce 兩個人剛剛完成哲學(xué)博士學(xué)位,對關(guān)系型數(shù)據(jù)模型印象深刻,但是發(fā)現(xiàn)查詢語言將成為其發(fā)展的一個主要瓶頸。于是他們便開始設(shè)計一種新的查詢語言 (用他們自己的話說):“讓那些沒有接受過數(shù)學(xué)和計算機編程方面正規(guī)訓(xùn)練的用戶更容易使用”。

兩個查詢語言的比較
仔細(xì)想想這件事。在互聯(lián)網(wǎng)出現(xiàn)之前,在個人電腦出現(xiàn)之前,當(dāng)編程語言 C 首次被引入世界時,兩位年輕的計算機科學(xué)家意識到,“計算機行業(yè)的成功很大程度上依賴于培養(yǎng)一種除了訓(xùn)練有素的計算機專家以外的用戶。” 他們想要的是一種像英語一樣易于閱讀的查詢語言,這也將包括數(shù)據(jù)庫管理和操作。
其結(jié)果就是在 1974 年首次將 SQL 引入世界。在接下來的幾十年里,SQL 將被證明是非常受歡迎的。隨著諸如 System R、Ingres、DB2、Oracle、SQL Server、PostgreSQL、MySQL(等等) 關(guān)系型數(shù)據(jù)庫接管了軟件行業(yè),SQL 也成為了與數(shù)據(jù)庫交互的卓越語言,成為了一個日益擁擠、競爭激烈的生態(tài)系統(tǒng)的通用語言。
(遺憾的是,Raymond Boyce 從來沒有機會見證 SQL 的成功。1 個月后他便死于腦動脈瘤,只做了一個最早的 SQL 演講,當(dāng)時他只有 26 歲,留下了一個妻子和一個年輕的女兒。)
有一段時間,似乎 SQL 成功地完成了它的任務(wù)。但后來互聯(lián)網(wǎng)誕生了。
第二章:NoSQL 的反擊
在 Chamberlin 和 Boyce 都在開發(fā) SQL 的同時,令他們沒有想到的是在加州的第二組工程師正在研究另一個正在萌芽的項目,該項目后來會廣泛擴散并威脅到 SQL 的存在。這個項目就是阿帕網(wǎng),1969 年 10 月 29 日,它誕生了。

ARPANET 的一些創(chuàng)造者,最終演變成今天的互聯(lián)網(wǎng)
SQL 一直發(fā)展的都很好,但是直到 1989 年,另一個工程師出現(xiàn)并發(fā)明了萬維網(wǎng)。

發(fā)明網(wǎng)絡(luò)的物理學(xué)家
像那些茂密的野草一樣,互聯(lián)網(wǎng)和網(wǎng)絡(luò)蓬勃發(fā)展,極大地擾亂了我們的世界,但對于數(shù)據(jù)社區(qū)來說,它還造成了一個特別的麻煩: 跟以前相比,新的數(shù)據(jù)源以更高的數(shù)量和速度生成數(shù)據(jù)。
隨著互聯(lián)網(wǎng)的不斷發(fā)展,軟件社區(qū)發(fā)現(xiàn),當(dāng)時的關(guān)系型數(shù)據(jù)庫無法處理這一新的負(fù)載。因此出現(xiàn)了一陣騷動的力量,就好像一百萬個數(shù)據(jù)庫突然過載了。
然后,兩個新的互聯(lián)網(wǎng)巨人取得了突破,并開發(fā)了他們自己的非關(guān)系型分布式系統(tǒng)來幫助解決這一新的數(shù)據(jù)沖擊:由谷歌發(fā)布的 MapReduce(2004 年出版) 和 Bigtable(2006 年出版),以及亞馬遜 (Amazon) 發(fā)布的 Dynamo (2007 出版)。這些開創(chuàng)性的論文導(dǎo)致出現(xiàn)了更多的非關(guān)系數(shù)據(jù)庫,包括 Hadoop(基于 MapReduce 文件,2006),Cassandra(受 Bigtable 和 Dynamo 文件的啟發(fā),2008 年) 和 MongoDB(2009)。因為這些新系統(tǒng)基本上都是從零開始編寫的,所以它們也沒有使用 SQL,導(dǎo)致了 NoSQL 運動的興起。
開發(fā)者社區(qū)的軟件工程師們也接受了 NoSQL,而且跟 SQL 當(dāng)時的出現(xiàn)相比,接受的群眾范圍更廣了。這個原因很容易理解:NoSQL 是現(xiàn)在流行的;它承諾了規(guī)模和權(quán)力;這似乎是項目通往成功的捷徑。但后來出現(xiàn)了問題。

典型的被 NoSQL 誘惑的軟件開發(fā)人員。不要學(xué)這家伙。
開發(fā)人員很快發(fā)現(xiàn),沒有 SQL 實際上是非常受限的。每個 NoSQL 數(shù)據(jù)庫都提供了自己獨特的查詢語言,這意味著:學(xué)習(xí)更多的語言 (并在同事之間傳播知識); 增加了將數(shù)據(jù)庫連接到應(yīng)用程序的難度,導(dǎo)致代碼之間有很強的耦合性; 缺乏第三方生態(tài)系統(tǒng),需要公司開發(fā)自己的操作和可視化工具。
這些 NoSQL 語言是新的,但也沒有完全開發(fā)出來。例如,關(guān)系型數(shù)據(jù)庫已經(jīng)運行很多年了,像為 SQL 添加必要的特性 (例如 JOIN) 這些工作早都已經(jīng)完成了; NoSQL 語言的不成熟意味著在應(yīng)用程序級別就會有更多的復(fù)雜性。缺乏 JOIN 也導(dǎo)致了反規(guī)格化,從而又導(dǎo)致數(shù)據(jù)膨脹和僵化。
一些 NoSQL 數(shù)據(jù)庫添加了自己的 “類 sql” 查詢語言,比如 Cassandra 的 CQL。但這常常會使問題變得更糟。如果使用跟別的東西完全一樣的界面,如果越常見,實際上會導(dǎo)致心理產(chǎn)生更多的疑問:工程師壓根就不知道支持什么,不支持什么。
社區(qū)中的一些人在早期就看到了 NoSQL 的問題(例如德維特和斯通布雷克在 2008 年就發(fā)現(xiàn)了)。隨著時間的推移,通過使用過程中個人經(jīng)驗的辛苦積累,越來越多的軟件開發(fā)人員也同意了這一點。
第三章:SQL 的回歸
最初被黑暗勢力所誘惑的軟件社區(qū)開始看到了光明,SQL 也上演了英雄回歸的一幕。
首先是 Hadoop 上的 SQL 接口 (Spark 之后也是),導(dǎo)致該行業(yè)興起了 NoSQL,NoSQL 表示 “不只是 SQL”(Not Only SQL)。
緊接著 NewSQL 興起了:完全接納了 SQL 的新的可擴展數(shù)據(jù)庫。來自于麻省理工學(xué)院 (MIT) 和布朗大學(xué) (Brown) 研究人員的 H-Store(2008 年出版) 是最早的擴展 OLTP 數(shù)據(jù)庫之一。谷歌再次引領(lǐng)了風(fēng)向標(biāo),根據(jù)他們的 Spanner 論文(出版于 2012 年)(其作者包括原始的 MapReduce 作者)開創(chuàng)了地緣重復(fù)的 SQL 界面的數(shù)據(jù)庫,其次再是 CockroachDB(2014)這樣的其他先驅(qū)者。
與此同時,PostgreSQL 社區(qū)開始復(fù)蘇,添加了一些關(guān)鍵的改進(jìn),比如 JSON 數(shù)據(jù)類型 (2012),以及PostgreSQL 10 中的新特性的 potpourri:對分區(qū)和復(fù)制更好的本地支持,支持對 JSON 的全文搜索,以及其它更多的特性 (定于今年晚些時候發(fā)布的版本)。其他如 CitusDB(2016) 以及其他的公司 (今年發(fā)布的 TimescaleDB) 找到了新方法從而針對特定數(shù)據(jù)工作負(fù)載的擴展 PostgreSQL。

事實上,我們開發(fā) TimescaleDB 的過程與這個行業(yè)的發(fā)展軌跡是密切相關(guān)。早期的 TimescaleDB 內(nèi)部版本使用了我們自己的類 sql 查詢語言 “ioQL”。是的,我們也沒能抵擋住黑暗一面的誘惑: 我們感覺能夠構(gòu)建自己的查詢語言應(yīng)該會非常強大。然而,盡管這似乎是一條簡單的道路,但我們很快意識到其實需要做更多的工作。我們還發(fā)現(xiàn)自己需要不斷地去查找合適的語法,去查詢那些已經(jīng)可以用 SQL 進(jìn)行查詢的內(nèi)容。
有一天,我們意識到構(gòu)建自己的查詢語言毫無意義。最關(guān)鍵的還是要接受 SQL。這是我們做出的較好的設(shè)計決定之一。頓時,一個全新的世界出現(xiàn)了?,F(xiàn)在盡管我們的數(shù)據(jù)庫才問世 5 個月, 但是用戶卻可以在生產(chǎn)環(huán)境上使用我們的數(shù)據(jù)庫,還有很多其他的美好事物: 可視化工具 (Tableau), 與常見的 ORM 的連接器, 各種工具和備份選項, 豐富的在線教程和語法解釋等等。
信谷歌,得永生

谷歌已經(jīng)在數(shù)據(jù)工程和基礎(chǔ)架構(gòu)領(lǐng)域領(lǐng)先了十多年了。我們應(yīng)該密切關(guān)注他們正在做的事情。
看看谷歌的第二大 Spanner 論文,就在四個月前發(fā)布的 (Spanner: 成為一個 SQL 系統(tǒng),2017 年 5 月),你會發(fā)現(xiàn)它支持我們的發(fā)現(xiàn)成果。
例如,谷歌開始的時候是在 Bigtable 上面構(gòu)建,但后來發(fā)現(xiàn)不用 SQL 會造成很多問題 (強調(diào)了我們下面的所有引用):
雖然這些系統(tǒng)提供了數(shù)據(jù)庫系統(tǒng)的某些優(yōu)點,但它們?nèi)鄙僭S多應(yīng)用程序開發(fā)人員經(jīng)常依賴的傳統(tǒng)數(shù)據(jù)庫特性。舉一個關(guān)鍵的例子就是一個健壯的查詢語言,這意味著開發(fā)人員必須編寫復(fù)雜的代碼來處理和聚合應(yīng)用程序中的數(shù)據(jù)。因此,我們決定將 Spanner 變成一個完整的 SQL 系統(tǒng),查詢執(zhí)行與 Spanner 的其他架構(gòu)特性緊密集成 (例如強一致性和全局復(fù)制)。
在論文的后面,他們進(jìn)一步抓住了從 NoSQL 過渡到 SQL 的基本原理:
Spanner 的原始 API 提供了對單個和交叉表的點查找和范圍掃描的 NoSQL 方法。雖然 NoSQL 方法提供了一個簡單的啟動扳手的方法,并且在簡單的檢索場景中繼續(xù)有用,但是 SQL 在表達(dá)更復(fù)雜的數(shù)據(jù)訪問模式和將計算推到數(shù)據(jù)上提供了重要的附加價值。
本文還描述了 SQL 的采用是如何在扳手上不停止的,但實際上擴展到了谷歌的其余部分,這里的多個系統(tǒng)現(xiàn)在共享一個通用的 SQL 方言:
扳手的 SQL 引擎共享一個共同的 SQL 方言, 稱為 “標(biāo)準(zhǔn) SQL”, 與其他幾個系統(tǒng)在谷歌上鉆包括內(nèi)部系統(tǒng)如 F1 和小孔 (等) 和外部系統(tǒng)如 BigQuery…
對于谷歌的用戶來說,這降低了跨系統(tǒng)工作的障礙。一個開發(fā)人員或數(shù)據(jù)分析人員編寫了針對 Spanner 數(shù)據(jù)庫的 SQL,可以將他們對該語言的理解轉(zhuǎn)移到 Dremel,而不必?fù)?dān)心語法、空處理等細(xì)微的差異。
這種方法的成功不言自明。Spanner 已經(jīng)成為主要谷歌系統(tǒng)的 “真相之源”,包括 AdWords 和谷歌游戲,而 “潛在的云客戶對使用 SQL 非常感興趣”。
考慮到谷歌首先幫助發(fā)起了 NoSQL 運動,很值得注意的是,它現(xiàn)在正在接受 SQL。(導(dǎo)致一些人最近想:“谷歌在 10 年的假時間里發(fā)送了大數(shù)據(jù)產(chǎn)業(yè)嗎?”)
這對數(shù)據(jù)的未來意味著什么: SQL 將變成細(xì)腰
在計算機網(wǎng)絡(luò)中,有一個概念叫做 “細(xì)腰結(jié)構(gòu)”。
這個想法的出現(xiàn)解決了一個關(guān)鍵問題: 在任何給定的網(wǎng)絡(luò)設(shè)備上,想象一個堆棧,底層的硬件層和頂部的軟件層。中間可能會存在各種網(wǎng)絡(luò)硬件; 同樣,也存在存在各種各樣的軟件和應(yīng)用程序。需要某種可以確保無論硬件發(fā)生了什么情況,軟件仍然可以連接到網(wǎng)絡(luò)的方法; 同樣的也能確保無論軟件發(fā)生什么,網(wǎng)絡(luò)硬件都知道如何處理網(wǎng)絡(luò)請求。

在網(wǎng)絡(luò)中,細(xì)腰的角色由互聯(lián)網(wǎng)協(xié)議 (IP) 扮演,它是為局域網(wǎng)設(shè)計的底層聯(lián)網(wǎng)協(xié)議和更高級別的應(yīng)用程序和傳輸協(xié)議的公共接口。(這是一個很好的解釋。) 而且 (在一個廣泛的簡化中),這個公共接口成為了計算機的通用語言,使網(wǎng)絡(luò)能夠相互連接,設(shè)備可以通信,而這種 “網(wǎng)絡(luò)網(wǎng)絡(luò)” 可以發(fā)展成為今天豐富多樣的互聯(lián)網(wǎng)。
我們認(rèn)為 SQL 已經(jīng)成為數(shù)據(jù)分析的細(xì)腰。
我們生活的時代,數(shù)據(jù)正在成為 “世界上最有價值的資源”(《經(jīng)濟(jì)學(xué)人》,2017 年 5 月)。因此, 我們看到了專業(yè)數(shù)據(jù)庫 (OLAP、時間序列、文檔、圖表等),數(shù)據(jù)處理工具 (Hadoop,Spark,Flink), 數(shù)據(jù)總線 (Kafka,RabbitMQ) 等呈現(xiàn)出了寒武紀(jì)大爆發(fā)式的情形。我們也有了更多需要依靠這些數(shù)據(jù)基礎(chǔ)設(shè)施的應(yīng)用程序, 無論是第三方數(shù)據(jù)可視化工具 (Tableau,Grafana PowerBI,Superset),web 框架 (Rails,Django) 或定制的數(shù)據(jù)驅(qū)動的應(yīng)用程序。

像網(wǎng)絡(luò)一樣,我們也有一個復(fù)雜的堆棧,底層的基礎(chǔ)設(shè)施和頂部的應(yīng)用程序。通常,我們最終會編寫大量的膠水代碼來完成這個堆棧工作。但是膠水代碼可能很脆弱: 需要精心的運維。
我們需要的是一個公共接口,允許堆棧的各個部分彼此通信。理想情況下,這個行業(yè)已經(jīng)標(biāo)準(zhǔn)化了。它能讓不同層之間的通信阻礙能夠降到最小。
這就是 SQL 的力量。和 IP 一樣,SQL 也是一個公共接口。
但 SQL 實際上比 IP 復(fù)雜得多。因為數(shù)據(jù)還需要支持人類分析。而且,SQL 創(chuàng)建者最初給它設(shè)定的目標(biāo)之一就是可讀性要高。
SQL 是完美的嗎? 不,但社區(qū)中的大多數(shù)人都已經(jīng)了解了這門語言。雖然已經(jīng)有工程師在開發(fā)更自然的語言界面,但是這些系統(tǒng)最終會連接到哪里? 還是 SQL。
所以在堆棧的頂部還有一層。那一層就是我們?nèi)祟悺?/p>
SQL 回歸
SQL 回來了。不只是因為在組裝 NoSQL 工具時編寫膠水代碼的做法十分令人反感。不僅僅是因為學(xué)習(xí)各種各樣的新語言是困難的。也不只是因為標(biāo)準(zhǔn)會帶來各種優(yōu)點。
也因為這個世界充滿了數(shù)據(jù)。它包圍著我們,束縛著我們。起初,我們依靠人類的感覺神經(jīng)系統(tǒng)來處理它?,F(xiàn)在,軟件和硬件系統(tǒng)也變得足夠智能,可以幫助我們。隨著收集的數(shù)據(jù)越來越多,我們也可以更好地認(rèn)識這個世界,系統(tǒng)的復(fù)雜性、存儲、處理、分析以及對這些數(shù)據(jù)可視化的需求只會繼續(xù)增長。

數(shù)據(jù)科學(xué)家尤達(dá)大師
我們可以生活在滿大街的系統(tǒng)都是如紙一般脆弱,接口量達(dá)到數(shù)百萬個的世界里。 或者我們可以再次選擇 SQL,這樣我們生活的世界也可能會變得越來越強大。
文章來源:CSDN
《深入淺出Oracle》課程圍繞Oracle數(shù)據(jù)庫的內(nèi)部核心原理,通過實戰(zhàn)操作深入淺出每個核心知識點。主要通過實戰(zhàn)操作來驗證Oracle的內(nèi)部原理,反之通過內(nèi)部原理來指導(dǎo)實戰(zhàn)操作。