RDBMS vs. NOSQL | 關聯式資料庫vs. 非關聯式資料庫

文章推薦指數: 80 %
投票人數:10人

RDBMS (Relational Database Management System) 又為關聯式資料庫管理系統,意即資料庫是由多個資料表(Table)所組成,並且可以將資料表關聯起來,去 ... GetstartedOpeninappHsSigninGetstartedAboutGetstartedOpeninappRDBMSvs.NOSQL|關聯式資料庫vs.非關聯式資料庫HsJul27·6minread本篇文章中,會先簡單解釋RDBMS還有NOSQL是什麼,接著整理出RDBMS與NOSQL兩種類型資料庫的區別、優缺點、以及實務上該怎麼去做選擇。

因為在解釋資料庫時有非常多名詞觀念在其中,本篇將聚焦在兩者的比較上,其他較詳項的內容在其他篇幅做更詳細的解釋吧。

前言有鑒於最近參加了幾場軟體工程師的面試,可以發現,只要在工作要求中有提到資料庫的話,RDBMS與NOSQL相關的問題,幾乎都是面試必考題。

包含『RDBMS是什麼』、『NOSQL是什麼』、『兩者的區別是什麼』、『為什麼要用RDBMS』…等等延伸的問題。

因此全面性的了解這兩種主流資料庫的區別、有缺點與使用情境之後,才能在實務或是面試上,有更好更正確且更合理的答案!那就廢話不多說,以下進入正題!關聯式資料庫(RDBMS)RDBMS(RelationalDatabaseManagementSystem)又為關聯式資料庫管理系統,意即資料庫是由多個資料表(Table)所組成,並且可以將資料表關聯起來,去連結多個資料表之間的關係。

諸如MySQL,PostgreSQL,MSSQL,…都是關聯式資料庫。

以下列出幾個關聯式資料庫的特點:由資料表(Table)組成,其中row代表一筆資料,column代表資料欄位名稱Schema必須先定義好,並且只接受同樣格式資料的插入與修改。

往後如果要修改schema,必須對於已存在的資料做相對應的處理較為麻煩可以使用JOIN來連結多個資料表,做較複雜的查詢具備ACID特性使用SQL(StructuredQueryingLanguage)來管理及查詢資料https://drawsql.app/非關聯式資料庫(NOSQL)NOSQL(Non-SQL,又為NotonlySQL)稱為非關聯式資料庫,跟關聯式資料庫不一樣,不需要定義schema、沒有關聯的關係。

諸如MongoDB,Redis,…都是非關聯式資料庫的一種。

以下為非關聯式資料庫的幾個特點:資料庫由collection組成collection中每筆資料為一份document,document的資料格式不需一致以CAPtheorem為概念設計常用於分散式雲端系統什麼時候要用RDBMS?什麼時候要用NOSQL?在實務上,並沒有一個標準答案去說該用哪一種資料庫,必須依照使用情境與需求,分析RDBMS&NOSQL的特性,進而去選擇最適合的資料庫來使用。

為什麼使用RDBMS?需要確保ACID特性的情境。

RDBMS類型的資料庫,保證了ACID,保證了資料的一致性。

舉例在金融類型的應用,你會希望匯入匯出的錢,能夠同步一致的更新到資料庫上,以防重複扣款或是餘額顯示錯誤等等的狀況。

而NOSQL是沒有保證ACID的,所以在這種情況下,RDBMS相較於NOSQL更適合。

為什麼使用NOSQL?由於NOSQL的schema不需要固定,且資料可以為任意結構。

所以在schema需要頻繁變動或者是schema不固定的時候,NOSQL提供更有彈性的開發。

比如在開發初期,schema會需要頻繁更新,這時候NOSQL就比較適合。

需要儲存大量資料,利用分散式系統以及雲端儲存的時候。

由於NOSQL相較於RDBMS更容易做horizontalscaling,且本身的設計就是分散式系統的設計。

因此對於未來有大量擴充需求的系統,會更容易的去擴充,且擴充的成本也較低。

NOSQL比RDBMS快嗎?RDBMS以及NOSQL在查詢上最主要的差別在於,RDBMS可以執行較複雜的查詢,因為RDBMS具有關聯的特性,例如有顧客、商品、銷售員三個資料表,分別儲存顧客的個人資料、商品的詳細價格與類別以及銷售員的個人資料,RDBMS此時可以將三個表依照指定邏輯將他們關聯起來,建立一個含有某個顧客,從某個銷售員手上,購買的某個商品,這樣子的一個資料表。

因此RDBMS在查詢上,可能需要跟很多資料表做關聯,等於是多查詢了很多個資料表,因此查詢的時間相對比較長。

對比的NOSQL,因為不包含任何關聯,單筆資料查詢後的所有需要的資料,都存在這一筆資料中,不需要做其他額外的查詢,相較之下會比RDBMS快。

為什麼RDBMS的擴充性(scalability)比較低?RDBMS比較容易做verticalscaling,verticalscaling意思是將單一台server做硬體的升級(例如增加CPU,memory…等等),花費相較於horizontalscaling高。

至於為什麼RDBMS較不容易做horizontalscaling呢?一個原因是RDBMS具有ACID的特性,因此當一個transaction要修改某個資料時,會將其他也要操作這個資料的transaction先lock住,以防racecondition,接著等到這個transaction做完後,才同意讓其他transaction繼續進行下去。

所以這樣的機制下,會降低到資料庫的效能。

也因為上述的狀況,假設今天要將RDBMS做horizontalscaling的擴充,這時需要被lock的Table可能分佈在不同的server上面,這時要找出哪些Table要被lock,以及該Table在哪一台server上面,都會嚴重降低資料庫效能,而且系統的複雜度也遠比單一台server要複雜許多!對比之下,NOSQL本身就是基於分散式系統架構,且不具備ACID的特性,因此更適合horizontalscaling。

在做水平擴充之後,只需要把資料分散儲存到各個server中,不用去處理資料之間的關聯性。

比起關聯式資料庫,能夠更簡單的做到horizontalscaling。

結論本篇文章總結了一些RDBMSvsNOSQL常見的問題。

事實上,關於兩者的優劣、該如何取捨,其實還有非常的多能夠探討的議題,這裡寫的只是大概念的想法,其中像是ACID,CAP等等的觀念,就需要另外去找更詳細及全面的解釋。

這裡提供一些問題的觀點,希望能對大家有幫助^^HsSoftwareengineerinTaiwanFollow22 2資料庫DatabaseNoSQLRdbmsBackendMorefromHsFollowSoftwareengineerinTaiwan



請為這篇文章評分?