SQL四部曲: SQL的未來在何方?

Gordon Lau

Gordon Lau

2019-10-25

先前三篇關於SQL的文章,分別講述了SQL的歷史、功能、誤解,這一篇筆者將會大膽預測,預測SQL的未來發展的可能方向。到底SQL在未來會是比現在更廣泛使用,成為每一個數據分析師的必備工具?還是被另外一種語言所取代?還是關聯式資料庫不會再受歡迎呢?

SQL_Futures.png

關聯式資料庫不會被取代

筆者認為關聯式資料庫(Relational Database)會繼續廣泛使用,世界上大多數資料本質上都有關聯性質,一個教師要教多個學生,一個學生由多個教師身上學習,學生跟教師就成為了一個多對多關係(Many-to-Many Relation); 一夫一妻制,在資料庫表示就是一對一關係(One-to-One Relation)。關聯式資料基本上無處不在,這亦是為何關聯式資料庫出現了四十年還是歷久不衰的主要原因。

SQL會支援愈來愈多非傳統RDBMS的功能

現今SQL已經支援了不少原本NoSQL才支援的功能。今年九月,國際制定數據庫語言標準的組織正為圖資料庫(Graph Database) 設計一種名為GQL的語言,全名為(Graph Query Language)。GQL的語法的靈感從何而來呢?

只要看看一段PGQL(一種GQL考慮整合的圖資料庫查詢語言)的例子就可以知道。

gql.png

Source

很明顯的是,GQL看起來很像SQL,其實就是由SQL的語法出發,加上本身不是RDBMS的功能,去表達與關聯式資料庫迥異的概念。

SQL在大數據世界會成為數據查詢語言之標準

在現今大數據時代之前,SQL一直都是數據查詢語言的標準,因為絕大多數數據本身都是儲存在SQL資料庫之內; 及至大數據時代,大數據工具諸如Apache Hadoop、Apache Spark亦開始有廣泛使用。當這些工具廣泛使用後,就出現了一個實在的問題,不同工具的查詢方法截然不同,令開發者相當不方便。Spark SQL正好於這樣的情況下開發,令開發者只需撰寫SQL,就可以查詢儲存之數據。

Google cloud spanner是另一個例子,一開始Cloud Spanner亦不支援SQL,但Google的工程師很快發現沒有熟悉的SQL,查詢數據不太方便,因此後來又加上了Cloud Spanner SQL 去統一資料查詢的方法。

SELECT l.LOCATION[offset(0)].*
FROM (SELECT ARRAY<STRUCT<city STRING, state STRING>>[
                         ("Seattle", "Washington"),
                         ("Phoenix", "Arizona")] AS location) AS l;

+---------+------------+
| city    | state      |
+---------+------------+
| Seattle | Washington |
+---------+------------+

Source

Query Builder的程式庫將慢慢取代ORM成為框架的基本部件

上一篇提過ORM的一些問題,亦由於SQL的功能日漸方便完善,開發者不再需要如以前般需要使用ORM. 因此筆者預計 愈來愈多網站框架(Web Frameworks)會開始將Query Builder作為基本部件。 更甚者,可以像.NET平台的LINQ一樣,像SQL放在代碼之中,令SQL與代碼完全整合。

// Query #1.
List<int> numbers = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

// The query variable can also be implicitly typed by using var
IEnumerable<int> filteringQuery =
    from num in numbers
    where num < 3 || num > 7
    select num;

// Query #2.
IEnumerable<int> orderingQuery =
    from num in numbers
    where num < 3 || num > 7
    orderby num ascending
    select num;

// Query #3.
string[] groupingQuery = { "carrots", "cabbage", "broccoli", "beans", "barley" };
IEnumerable<IGrouping<char, string>> queryFoodGroups =
    from item in groupingQuery
    group item by item[0];

Source

由Microsoft的例子可見,LINQ與C#融合得非常好。可以看成是未來其他語言內嵌SQL的發展方向。

總結

綜合上面所有預測,相信大家都知道筆者對SQL的前景相當樂觀,其實不只筆者,還有不少其他作者都抱持類似看法,因此想開學習的朋友,就不用再猶豫了!

Comments

Read More

SQL二部曲:五件事,你不知道SQL勝任有餘

SQL三部曲:你不需要ORM

SQL首部曲:NoSQL? No! SQL!