儘管關聯式資料庫那麼方便好用,但在資料量持續增長、強調高可用性和可擴展性的領域,關聯式資料庫並無法滿足期望。
當應用服務需要消化的請求數量逐漸成長,我們可以把資料庫和應用分開放在不同的主機,讓他們各自擁有更多的硬體資源。當原本配置的硬體資源不足以應付運算量,我們可以透過幫它升級CPU、加記憶體和掛上更多硬碟等方式擴展它的性能,這樣的擴充方式稱為「垂直擴展 (Scale Up)」。一台應用服務無法消化時,因為應用服務本身是無狀態的(Stateless),所以我們可以加開兩三四五六台,讓他們平行處理各自被分派到的請求,這樣的擴展方式稱為「水平擴展 (Scale Out)」。由於資料庫是有狀態的,且垂直擴展有其極限,於是資料庫成為系統的效能瓶頸。
有些功能在符合需求時你會說「太棒了!」,但當你不需要或是它並不是最優先事項時,若因這些功能拖累其他更重要的需求而變成成本,這情境就不怎麼棒了。關聯式資料庫的強約束資料模型設計在符合需求時是強項,但若系統的需求是更彈性且多變的資料長相,Schema 異動的高成本成為關聯式資料庫的缺點。同樣的,關聯式資料庫中資料的強一致性在某些情境並沒有那麼重要,這時為了達到強一致性的運算成本就超過資料一致帶來的價值。
社群媒體等領域使用關聯式資料庫面臨的就是上述問題,於是發展出 NoSQL Database。NoSQL 是 Not only SQL 的意思,它有策略的犧牲關聯式資料庫的某些特性,像是資料的強一致性,以換取更高的可擴展性及可用性。NoSQL Database 為了不同需求有不同的設計,一般分為四大類:
接下來幾天會先了解關聯式資料庫的一些特性,再來看 NoSQL Database 在這些特性上做了什麼取捨,又用什麼方式處理這些特性,最後針對四種不同的 NoSQL Database 進行介紹並搭配應用實作範例。