強調互聯網,因為本文討論的前提是互聯網應用。與“傳統”應用不同,互聯網中的應用每天都面臨著海量的數據和請求,對系統的可靠性和響應速度有著更高的要求。對於“傳統”的應用,我覺得簡單來說就是數據量不大,用戶範圍比較小,自然大量的高並發請求場景幾乎不存在。
在對互聯網應用和傳統應用有了大致的了解之後,我們再來談談主題關系數據庫在這兩類應用中的不同使用方式,以及關系數據是否已經不再是當今互聯網應用中關註的焦點。
海量數據。數百萬甚至數千萬億的數據不能再存儲在壹個數據表中,甚至不能存儲在壹個數據庫中。試想壹下,如果所有的數據都存儲在單個數據庫和單個表中,壹旦掃描了整個表,對於系統的響應速度來說將是壹場災難。但是,在傳統的應用程序中,可能單個庫和單個表就足夠了。
第二,由於數據量大,數據在磁盤上的存儲被設計成“子數據庫、子表”的模式,並使用特定的“路由”算法來定位壹個數據的位置。正是因為“子數據庫、子表”的設計,關系數據中“聯表查詢”的場景失效,所以在互聯網應用中,壹個表的設計幾乎沒有“外鍵”,也就是聯表查詢幾乎已經消失。
第三,大量請求。這在互聯網應用中很常見。壹個突發事件,壹個明星的爆料,都會造成大量請求瞬間到達。數據庫的承載能力是有限的。壹旦某個時刻所有的訪問同時湧入,會直接導致數據庫宕機,整個系統甚至會因為數據庫而導致服務不可用。因此,在今天的互聯網應用中,讀寫數據幾乎不再直接操作數據庫,而是在數據庫前增加了壹道“安全”屏障——緩存。
第四,服務的可靠性。服務的可靠性,即使系統出現問題,也要保證部分可用。讀寫分離是壹個很好的解決辦法。讀寫操作不再在同壹個數據庫中進行,而是分開進行。如果此時有大量的寫操作,盡量不要影響讀操作,或者寫入數據庫時數據庫宕機,盡量不要影響此時數據庫的讀操作。此時,在互聯網應用中通常部署壹套“主從式”數據庫,主數據庫寫,從數據庫讀,會導致數據同步的問題或者概括為數據壹致性的問題。