RDBMS vs. NOSQL | 關聯式資料庫 vs. 非關聯式資料庫
News from: Hs
本篇文章中,會先簡單解釋 RDBMS 還有 NOSQL 是什麼,接著整理出 RDBMS 與 NOSQL 兩種類型資料庫的區別、優缺點、以及實務上該怎麼去做選擇。因為在解釋資料庫時有非常多名詞觀念在其中,本篇將聚焦在兩者的比較上,其他較詳項的內容在其他篇幅做更詳細的解釋吧。
前言: 有鑒於最近參加了幾場軟體工程師的面試,可以發現,只要在工作要求中有提到資料庫的話,RDBMS 與 NOSQL 相關的問題,幾乎都是面試必考題。包含 『 RDBMS 是什麼』、『 NOSQL 是什麼』、『兩者的區別是什麼』、『為什麼要用 RDBMS 』… 等等延伸的問題。
因此全面性的了解這兩種主流資料庫的區別、有缺點與使用情境之後,才能在實務或是面試上,有更好更正確且更合理的答案!那就廢話不多說,以下進入正題!
關聯式資料庫(RDBMS)
RDBMS (Relational Database Management System) 又為關聯式資料庫管理系統,意即資料庫是由多個資料表(Table)所組成,並且可以將資料表關聯起來,去連結多個資料表之間的關係。諸如 MySQL, PostgreSQL, MS SQL, … 都是關聯式資料庫。以下列出幾個關聯式資料庫的特點:
- 由資料表(Table)組成,其中 row 代表一筆資料,column 代表資料欄位名稱
- Schema 必須先定義好,並且只接受同樣格式資料的插入與修改。往後如果要修改 schema,必須對於已存在的資料做相對應的處理較為麻煩
- 可以使用 JOIN 來連結多個資料表,做較複雜的查詢
- 具備 ACID 特性
- 使用 SQL(Structured Querying Language) 來管理及查詢資料
非關聯式資料庫(NOSQL).
NOSQL(Non-SQL,又為 Not only SQL) 稱為非關聯式資料庫,跟關聯式資料庫不一樣,不需要定義 schema、沒有關聯的關係。諸如 MongoDB, Redis, … 都是非關聯式資料庫的一種。以下為非關聯式資料庫的幾個特點:
- 資料庫由 collection 組成
- collection 中每筆資料為一份 document,document 的資料格式不需一致
- 以 CAP theorem 為概念設計
- 常用於分散式雲端系統
什麼時候要用 RDBMS? 什麼時候要用 NOSQL?
在實務上,並沒有一個標準答案去說該用哪一種資料庫,必須依照使用情境與需求,分析 RDBMS & NOSQL 的特性,進而去選擇最適合的資料庫來使用。
為什麼使用 RDBMS?
- 需要確保 ACID 特性的情境。RDBMS 類型的資料庫,保證了 ACID,保證了資料的一致性。舉例在金融類型的應用,你會希望匯入匯出的錢,能夠同步一致的更新到資料庫上,以防重複扣款或是餘額顯示錯誤等等的狀況。而 NOSQL 是沒有保證 ACID 的,所以在這種情況下,RDBMS 相較於 NOSQL 更適合。
為什麼使用 NOSQL?
- 由於 NOSQL 的 schema 不需要固定,且資料可以為任意結構。所以在 schema 需要頻繁變動或者是 schema 不固定的時候,NOSQL 提供更有彈性的開發。比如在開發初期,schema 會需要頻繁更新,這時候 NOSQL 就比較適合。
- 需要儲存大量資料,利用分散式系統以及雲端儲存的時候。由於 NOSQL 相較於 RDBMS 更容易做 horizontal scaling,且本身的設計就是分散式系統的設計。因此對於未來有大量擴充需求的系統,會更容易的去擴充,且擴充的成本也較低。
NOSQL 比 RDBMS 快嗎?
RDBMS 以及 NOSQL 在查詢上最主要的差別在於,RDBMS 可以執行較複雜的查詢,因為 RDBMS 具有關聯的特性,例如有顧客、商品、銷售員三個資料表,分別儲存顧客的個人資料、商品的詳細價格與類別以及銷售員的個人資料,RDBMS 此時可以將三個表依照指定邏輯將他們關聯起來,建立一個含有某個顧客,從某個銷售員手上,購買的某個商品,這樣子的一個資料表。因此 RDBMS 在查詢上,可能需要跟很多資料表做關聯,等於是多查詢了很多個資料表,因此查詢的時間相對比較長。
對比的 NOSQL,因為不包含任何關聯,單筆資料查詢後的所有需要的資料,都存在這一筆資料中,不需要做其他額外的查詢,相較之下會比 RDBMS 快。
為什麼 RDBMS 的擴充性(scalability)比較低?
RDBMS 比較容易做 vertical scaling, vertical scaling 意思是將單一台 server 做硬體的升級(例如增加 CPU, memory … 等等),花費相較於 horizontal scaling 高。
至於為什麼 RDBMS 較不容易做 horizontal scaling 呢?
一個原因是 RDBMS 具有 ACID 的特性,因此當一個 transaction 要修改某個資料時,會將其他也要操作這個資料的 transaction 先 lock 住,以防 race condition,接著等到這個 transaction 做完後,才同意讓其他 transaction 繼續進行下去。所以這樣的機制下,會降低到資料庫的效能。
也因為上述的狀況,假設今天要將 RDBMS 做 horizontal scaling 的擴充,這時需要被 lock 的 Table 可能分佈在不同的 server 上面,這時要找出哪些 Table 要被 lock,以及該 Table 在哪一台 server 上面,都會嚴重降低資料庫效能,而且系統的複雜度也遠比單一台 server 要複雜許多!
對比之下, NOSQL 本身就是基於分散式系統架構,且不具備 ACID 的特性,因此更適合 horizontal scaling。在做水平擴充之後,只需要把資料分散儲存到各個 server 中,不用去處理資料之間的關聯性。比起關聯式資料庫,能夠更簡單的做到 horizontal scaling。
結論
本篇文章總結了一些 RDBMS vs NOSQL 常見的問題。事實上,關於兩者的優劣、該如何取捨,其實還有非常的多能夠探討的議題,這裡寫的只是大概念的想法,其中像是 ACID, CAP 等等的觀念,就需要另外去找更詳細及全面的解釋。這裡提供一些問題的觀點,希望能對大家有幫助^^
留言
張貼留言