關連式資料庫管理系統(RDBMS)存在已久,有嚴謹的資料結構檢查能力,到現在還是非常好用。NoSQL是網路迅速發展時代下的後起之秀,通常捨棄那些資料結構檢查來提高效能,也漸漸成為各種應用的優先選擇。但我覺得NoSQL不會取代RDBMS,而是補足RDBMS不夠好的地方。就好像客車可以載貨卻更適合載人,貨車可以載人卻更適合載貨,都是車子卻能互補彼此不專精的部分。

本篇文章也可以看作是「我該使用傳統關連式資料庫還是文件式NoSQL資料庫?」或是「MariaDB與MongoDB的比較」,我會介紹功能差異的考量、授權的考量、我自己的實務應用方式。

功能差異

儲存結構的差別

MariaDB與MongoDB一樣,安裝一個資料庫管理系統實例(Instance)底下可以有多個資料庫,每個資料庫底下可以有多個資料表(MongoDB稱為集合),資料表內有定義資料格式的資料欄位(Column、Field)與實際儲存資料的資料列(Row、Document)。

資料庫資料表資料列資料欄位
MariaDBDatabaseTableRowColumn
MongoDBDatabaseCollectionDocumentField
為了快速理解,稍微不嚴謹的比較方式

MariaDB的資料欄位的格式跟其他關連式資料庫一樣,有非常多種尺寸的數字、文字、日期、二進位的資料型態,可以參考我另外寫的這篇:資料庫教學3-2:Data Type 資料型態介紹。MongoDB使用二進位的JSON結構儲存資料,稱為BSON。

兩種資料庫最常見的差別是在MariaDB的定義之料表之後,裡面的結構就是固定的,每一筆新增到資料表的資料都要符合我們定義的結構。而MongoDB的資料集合(Collection)雖然類似MariaDB資料表,但是建立資料集合的時候不用預先定義結構,同一個資料集合內的不同資料可以完全不一樣。

操作方式的差別

MariaDB使用SQL作為操作方式,好處是其他關連式資料庫的操作方式也是SQL,雖然使用的細節會有點差別,但是大致上都是相同的。因此會了MariaDB再去使用MySQL、MS SQL、Oracle Database、PostgreSQL、SQLite、H2 Database等各種關聯式資料庫能比較快學會。

MongoDB使用JavaScript與JSON作為操作方式,而且每個指令也都是非同步運作,因此熟悉JavaScript學起來比較親切。但是學會MongoDB就只能操作MongoDB,不同NoSQL資料庫的差異非常大。

索引與進階查詢

雖然MongoDB的特色是不在乎集合裡面儲存什麼資料,但MongoDB還是能為資料建立索引,因此查詢的速度不比MariaDB遜色。

在MariaDB使用SQL的groupjoin、子查詢等進階查詢方式非常方便,SQL的語法比較接近人類語言,方便閱讀與除錯。在MongoDB可以使用聚合工具Aggregate對資料進行複雜的查詢與運算,但是寫起來比較麻煩點。

另外以前用MongoDB 4.0的時候發現skip(n)的效能不好,查詢的資料量很大的時候使用count()的效能也不好,因此很難做出查詢一堆資料後一頁一頁顯示的網頁。但是目前利用MongoDB 6.0測試時發現速度很快,看來已經改善了。

從授權方式考量

授權方式也是一個重要考量的點。MariaDB與MongoDB都是公開原始碼的資料庫,兩者都可以免費商業使用,也都有付費商業版。但是兩者在免費使用的授權方式有很大的差別,以下提供兩種資料庫授權方式的大致說明,可能會有點誤差,請詳閱官方的說明文件,以官方說明為主。

MariaDB的GPLv2授權

MariaDB的本體採用GNU 通用公共授權(GPL)第二版授權,可以參考官方說明。GPL是開源原始碼授權,允許免費商業使用。根據GPL的規定,如果你修改了MariaDB的原始碼,則必須公開你所修改過的MariaDB原始碼。

通常情況下,我們安裝MariaDB作為伺服器端,然後透過網路作為Client端操作MariaDB。例如,你可以使用Java程式透過JDBC連接資料庫、使用PHP程式透過Driver連接資料庫,或使用MySQL Client連接資料庫。在這種情況下,只是透過連線方式使用MariaDB並不會使你的應用程式受到GPL的限制,只有在修改了MariaDB原始碼的情況下才需要公開修改後的原始碼。

MongoDB的SSPL授權

曾經MongoDB使用AGPL授權,但是2018 年引入了伺服器端公用授權(Server Side Public License,SSPL)授權,可參考iThome的「不滿雲端廠商不付錢,MongoDB另立開源授權」報導。SSPL是MongoDB公司自己發表的一種授權方式,最主要的差別是限制了免費商業使用的範圍,在使用MongoDB Community版本的時候不能將我們開發的程式做成雲端服務平台,畢竟這會跟MongoDB公司的MongoDB Atlas有利益衝突,必續付費購買商業授權版才能免公開原始碼。

也就是說使用免費版MongoDB作為網站的資料庫來儲存資料是可以的,但不能做出類似雲端資料庫服務的功能,例如提供網站使用者操控MongoDB的Database、Collection、Auth、備份與還原等。


如何考慮

當我們開發一個應用程式、網頁後端程式要使用MariaDB還是MongoDB好呢?

需要事務交易功能

以前的MongoDB無法提供Transaction功能,如果需要嚴謹的不可分割的操作一定是推薦關聯式資料庫,但是現代的MongoDB已經可以支援交易了,使用MongoDB也能滿足大部分Transaction需求。可以參考我另外寫的這篇新版MongoDB的Transaction教學,讓MongoDB不再只能做「假交易」

資料結構明確

當我們有明確的資料結構需求,例如某個表的某個欄位一定要是數字且不可以為null、A資料表的某欄位一定要對應上B資料表的ID、一筆資料新增或刪除前一定要檢查相關資料是否齊全…等,那麼MariaDB等關連式資料庫會是比較好的選擇。雖然MongoDB也有索引鍵、唯一鍵與驗證器可以對資料結構進行一些約束,但設計的方便性、約束能力與性能損耗會有差距。

資料結構彈性

需要彈性的結構使用MongoDB比較好,例如我們希望一筆資料中同時有Map又有List結構,在傳統資料庫中很難達成,需要透過正規化聯合多張資料表才能有這樣的結構。在MongoDB中卻可以全部儲存在一個Document中,查詢一次就全部拿到。

需要支援多種資料庫

我曾經遇過一個需求就是我設計的程式可能需要使用MySQL,也可能要使用MS SQL,因此我只要注意我不要使用太多特別的SQL,我寫出來的程式就可以改一下連線設定就能轉換資料庫,隨時可以改用H2 DB、MariaDB、MS SQL等不同方案。但如果使用MongoDB就必須搭配MongoDB,需要改資料庫可能要重寫非常多程式。

水平擴展需求

如果有水平擴展需求我會比較推薦MongoDB。在MongoDB上要添加分片和副本集都很容易,具有良好的水平擴展性,可以輕鬆地在多台機器上分散數據和負載,以應對未來的增長需求。

總結

總體而言,選擇使用MariaDB還是MongoDB取決於具體需求和項目的特點。如果您需要嚴格的事務處理、傳統的資料結構約束和關聯性,以及對不同資料庫的支援,則MariaDB可能是一個較好的選擇。而如果需要彈性的資料結構、水平擴展性和較好的性能,則MongoDB可能更適合。最佳選擇將取決於業務需求、資料模型和預期的系統規模。

其實我有些專案中在一個網站內同時使用了MariaDB與MongoDB,分別使用Java的Spring Data JPA與Spring Data MongoDB來操作兩個資料庫。結構嚴格的設定相關的資料就存在MariaDB,需要彈性的結構就存在MongoDB。其中MongoDB光是一個Collection就佔據50GB以上,接近兩億個Document,光是Index就有25GB,沒有做水平擴展。但是新增、查詢、Aggregate運算都還是一秒內完成,對網站使用者而言根本沒等待的感覺。看得出MongoDB效能非常好,但這也需要不少經驗去優化資料結構,不然還是會卡頓。

MariaDB教學系列說明

  1. 資料庫系統介紹
  2. 我該使用MariaDB還是MongoDB?
  3. 觀念篇
    1. 資料庫與資料表介紹
    2. 資料型態
    3. 主鍵、唯一鍵、索引鍵、外來鍵
    4. 資料正規化
  4. 基本操作篇
    1. 建立資料庫與資料表
    2. 新增與查詢資料
    3. 修改與刪除資料
  5. 進階查詢篇
    1. Sort排序、Limit筆數限制
    2. 函數(Function)
    3. SQL子查詢
    4. JOIN合併查詢
  6. 群組查詢篇
    1. Group by分類
    2. Group函數
    3. Having查詢
  7. 進階操作篇
    1. 視圖(View)
    2. 交易(Transaction)
    3. 修改與刪除資料庫
    4. 修改與刪除資料表
    5. 資料庫權限管理
    6. 備份與還原資料庫

還沒有連結的就是還在編寫中…😅。