關鍵詞:互聯網、關係型資料庫 強調互聯網,這是因為本文所討論的前提是互聯網應用。與“傳統”應用不同,互聯網中的應用每天面臨的是海量的數據、大量的請求以及對系統可靠性和響應速度有著更高的要求。“傳統”應用,我姑且淺顯地認為是,數據量不大,面對的用戶群範圍相對較小,自然大量的高併發請求場景幾乎不存在。 ...
關鍵詞:互聯網、關係型資料庫
強調互聯網,這是因為本文所討論的前提是互聯網應用。與“傳統”應用不同,互聯網中的應用每天面臨的是海量的數據、大量的請求以及對系統可靠性和響應速度有著更高的要求。“傳統”應用,我姑且淺顯地認為是,數據量不大,面對的用戶群範圍相對較小,自然大量的高併發請求場景幾乎不存在。
在上文對互聯網應用和傳統應用有了一個大概的認識後,接下來我們來談一談,本文的主題關係型資料庫在兩種類型應用的不同使用方式,以及關係型數據在如今的互聯網應用中是否不再是關註的焦點。
首先,海量的數據。百萬級甚至千萬級億級的數據已不可能存儲在單一的數據表中,甚至不可能存儲在一個資料庫中。試想如果將所有的數據存儲在單庫單表中,一旦發生全表掃描,這對於系統響應速度來講將是一個災難。然而在傳統應用中,可能單庫單表已經足以適用。
第二,由於產生了海量數據,進而數據在磁碟上的存儲被設計成了“分庫分表”的模式,利用某種特定的“路由”演算法,定位一個數據所處的位置。正是因為“分庫分表”的設計,使得關係型數據中的“聯表查詢”場景失效,所以在互聯網應用中,一張表的設計已經幾乎不再有“外鍵”,也就是聯表查詢幾乎已消失。
第三,大量的請求。這在互聯網應用中比較常見,一起突發事件,一個明星的突發新聞,都會造成大量的請求瞬時到達。資料庫的承載能力是有限的,一旦所有的訪問量在某一時刻同時涌入,這直接會造成資料庫宕機,整個系統甚至會因為資料庫的原因造成服務不可用。所以在如今的互聯網應用中,對數據的讀取寫入幾乎已經不再直接操作資料庫,而是在資料庫前加入了一道“安全”屏障——緩存。
第四,服務的可靠性。服務的可靠性,即使系統出現問題,也要保證部分可用,讀寫分離是一個很好的解決方案,讀取和寫入操作不再同一個資料庫中進行,而是將他們分開。如果此時有大量寫操作,要儘量不影響讀操作,或者如果如果在寫入資料庫時造成資料庫宕機,此時要儘量不能影響資料庫的讀操作。此時在互聯網應用中通常就會部署一套“主從”資料庫,主庫寫,從庫讀,這就會衍生出數據同步的問題,或者歸納為數據一致性問題。
可以看到,互聯網應用與傳統應用的異同點在於,互聯網應用對於資料庫的著重點在於從整體上進行把握,對數據的操作相對來說比較“粗糙”。而傳統應用由於其自身原因,只需要考慮更為“精細化”的操作,例如連表查詢,表與表的關係,關係表還是實體表等等。
這是否意味著,在互聯網中關係型資料庫已經不再那麼重要了呢?那些課本上的第一範式、第二範式已經過時了呢?
如果認為互聯網中關係型資料庫不再強調“精細化”的操作,就是已經過時了,這是一葉障目不見泰山。再總結一下,在互聯網中,對於關係型資料庫,我們需要設計分庫分表、主從庫、讀寫分離、熱點數據緩存等等。在傳統應用中,對於關係型資料庫,我們需要設計出E-R圖,需要設計主鍵、外鍵,需要寫聯表查詢的SQL語句等等。
再回顧一下,我們在大學的資料庫課程中,在學習資料庫時,是否是從第一範式、第二範式開始的?再逐步練習“一個學生學習了哪幾門課程”、“一個學生每個課程的分數”、“某門課程按80分、90分以上分類”這類的SQL語句,因為這是基礎,這是原理。
那麼回到本文的主題“在互聯網中關係型資料庫是否不再那麼重要”,筆者的觀點是,側重點不同,互聯網應用的很大,有的很大很大,有時需要你放棄遵循某些範式,從其他方面去彌補,而從整體上去思考如何進行數據建模,互聯網應用更加考驗的是“能力”,對數據建模的能力,如何構建更高的可靠性應用。傳統應用,更加考驗的是一切按照規矩來,“精細化”的操作,對SQL語句的熟悉程度就意味著對資料庫的熟悉程度。
但就算是互聯網中,SQL語句並非是不重要的,不要因為自己處在互聯網,不熟悉SQL語句當做是一種“炫耀”,這是扎馬步式的基本功。最簡單的例子,如果不重要,像阿裡一樣的互聯網公司,照樣在研究關係型資料庫(參見:阿裡巴巴資料庫內核月報: http://mysql.taobao.org/monthly/)。
最後,《三體》一書中,智子鎖死了人類的基礎物理學,導致人類在科技面前完全停滯。
這是一個能給程式員加buff的公眾號