關連式資料庫管理系統(RDBMS)存在已久,有嚴謹的資料結構檢查能力,到現在還是非常好用。NoSQL是網路迅速發展時代下的後起之秀,通常捨棄那些資料結構檢查來提高效能,也漸漸成為各種應用的優先選擇。但我覺得NoSQL不會取代RDBMS,而是補足RDBMS不夠好的地方。就好像客車可以載貨卻更適合載人,貨車可以載人卻更適合載貨,都是車子卻能互補彼此不專精的部分。
本篇文章也可以看作是「我該使用傳統關連式資料庫還是文件式NoSQL資料庫?」或是「MariaDB與MongoDB的比較」,我會介紹功能差異的考量、授權的考量、我自己的實務應用方式。
功能差異
儲存結構的差別
MariaDB與MongoDB一樣,安裝一個資料庫管理系統實例(Instance)底下可以有多個資料庫,每個資料庫底下可以有多個資料表(MongoDB稱為集合),資料表內有定義資料格式的資料欄位(Column、Field)與實際儲存資料的資料列(Row、Document)。
資料庫 | 資料表 | 資料列 | 資料欄位 | |
---|---|---|---|---|
MariaDB | Database | Table | Row | Column |
MongoDB | Database | Collection | Document | Field |
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的group
、join
、子查詢等進階查詢方式非常方便,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效能非常好,但這也需要不少經驗去優化資料結構,不然還是會卡頓。