Skip to main content

SQL首部曲:NoSQL? No! SQL!

· 6 min read
戈頓
Developer & Co-founder of Tecky Academy

由本篇開始,接連四篇都是與SQL有關的文章,會想寫SQL的原因,是因為SQL在現今軟件開發及數據科學佔有舉足輕重之地位,卻總是在背後默默無名,從未見得到像其他新興技術之關注,有見及此,筆者決定介紹SQL之特點,順便破除一些對使用SQL上常有的誤解。

-- 一條SQL綜合本文目的!
SELECT * FROM sql_knowledge AS knowledge

INNER JOIN public_understanding AS understanding
ON knowledge.id = understanding.sql_knowledge_id

INNER JOIN my_understanding as my_understanding
ON knowledge.id = my_understanding.knowledge_id

WHERE knowledge.concept != understanding.concept
AND knowledge.concept = my_understanding.concept

ORDER BY understanding.created_at;

SQL是一個簡稱,讀音是Sequel或是S-Q-L(逐字母讀出),全名是Structured Query Language,中文是結構化查詢語言,最早出現時間非常早,時年為1974年,比大家熟知的元祖級程式語言C只是僅僅遲了兩年。假如你由上世紀七十年代開始,只會寫C及SQL,直至今時今日也沒有失業危機哦。而與C有所不同的是,SQL最開始時是基於一個稱為關聯模型的數學理論所開發,專為資料存取所發明,並非如C一樣設計作廣泛編程需要。

Relational Model

Source

SQL本質上與其他程式語言不同,並非逐步指示電腦如何做(How to do),而是直接提出問題(Query),也就是直接向電腦提出要做甚麼(What to do)。由電腦自行決定如何在不同的Relation中,以最有效率,及準確之方法讀取答案(Output)。

用上面一句SQL作例,可見我無須表明如何讀取my_understandingpublic_understanding,只須寫出

SELECT * FROM sql_knowledge AS knowledge

INNER JOIN public_understanding AS understanding
ON knowledge.id = understanding.sql_knowledge_id

INNER JOIN my_understanding as my_understanding
ON knowledge.id = my_understanding.knowledge_id

就將現有的sql_knowledge、我的個人理解my_understanding、大眾理解public_understanding連接(Join)在一起。 下面的WHERE語句,就特定選擇了有誤解概念,再根據創建時間created_at排序。

正因SQL的本質不是為了向電腦提供逐行命令,因此SQL可歸類為宣告式語言(Declarative Language)的一種,而較常用作編程的程式語言,例如CJavaScript等語言則應歸類為指令式語言(Imperative Language)

SQL之發展

SQL出現後,很快就成為了查詢數據庫的標準語言,大家熟知的甲骨文公司(Oracle Corporation),正是在1977年開發Oracle SQL資料庫開始的。到了1986年,SQL作為一種數據查詢語言,國際標準化組織(ISO)將SQL標準化,以後SQL在語法上不斷改良,也不斷有新的版本推出,最新的SQL推出時間為2016年。

NoSQL現身

也許正是因為SQL與平常使用之編程語言本質上不同,筆者認識不少軟件工程師,都對SQL避之則吉,編寫SQL可免則免。後來出現的MongoDB更令這種「SQL避免症」變本加厲。 MongoDB 在2009年出現,在之後幾年更帶起了NoSQL的風潮。而又由於MongoDB是一個文件導向資料庫(Document Oriented Database),可以直接儲存JSON作儲存格式,對使用JavaScript的開發者非常方便,因此旋即出現了MEAN(MongoDB-Express-AngularJS-Node.js)的技術棧,由於容易上手,理解容易,成為不少網上教學首選之技術。上Youtube搜尋一圈,不難發現大量Mean Stack的教學影片,原因正是如此。

Mean Stack

Source

SQL因此退出歷史舞台了嗎?當然沒有,結果MongoDB的好處,慢慢在大量使用下變成了壞處: MongoDB無需定義Table Structure,令資料愈趨無結構,變得難以管理; MongoDB原生不支援JOIN的概念,也難以表達關聯性資料; MongoDB支援Database Transaction方面,也無法比上傳統SQL數據庫。不少軟件工程師在大量使用後,也得出類似的結論。當不同的SQL實作,例如PostgreSQL開始支援直接存取JSON、MySQL 容許將JSON字串儲存成BSON數據。MongoDB之優勢就大為減少。 因此網上出現了以下趣圖。

NoSQL? No! SQL ! Source

由七十年代的沒有SQL,到千禧年間NoSQL,再返回現在發覺SQL之可貴,就正是SQL四十多年發展之寫照了。