自1970年埃德加·科德提出關系模型之后,關系型數據庫便開始出現,經過了40多年的演化,如今的關系型數據庫種類繁多,功能強大,使用廣泛。面對如此之多的關系型數據庫,我們應該如何權衡找出適合自己應用場景的數據庫系統呢?O.S. Tezer最近在DigitalOcean上發表了一篇博文,對比了SQLite、MySQL和PostgreSQL這三個常用的、流行的關系型數據庫管理系統(RDBMS),希望能對你有所幫助。
O.S. Tezer分別從數據庫支持的數據類型、優勢、劣勢、何時應該使用以及何時不應該使用該數據庫這5個方面對SQLite、MySQL和PostgreSQL做了比較。
SQLite
SQLite是一款輕型數據庫,它遵守ACID,能夠嵌入到使用它的應用程序中。作為一個自包含的、基于文件的數據庫,SQLite提供了非常出色的工具集能夠處理所有類型的數據,與托管在服務器上基于進程的關系型數據庫相比它的約束更少,也更易用。
當應用程序使用SQLite時,SQLite并非作為一個獨立進程通過某種通信協議(例如socket)與應用程序通信,而是作為應用程序的一部分,應用程序通過調用SQLite的接口直接訪問數據文件。感謝類庫的底層技術,它讓SQLite變得非常快速、高效并且十分強大。
SQLite支持的數據類型
SQLite支持的數據類型包括:NULL、INTEGER、REAL、TEXT、BLOB。
注意:如果你想了解與SQLite數據類型相關的更多內容,可以參閱官方文檔。
SQLite的優點
- 基于文件
整個數據庫完全由磁盤上的一個文件構成,這使得它的可移植性非常好。
- 標準化
盡管它看起來像一個“簡化版”的數據庫實現,但是SQLite確實支持SQL。它省略了一些功能(RIGHT OUTER JOIN和FOR EACH STATEMENT),但同時也增加了一些額外的功能。
- 非常適合開發甚至是測試
在大多數應用程序的開發階段,大部分開發人員可能都非常需要一個能夠支持并發擴展的解決方案。SQLite 包含豐富的功能,所能提供的特性超乎開發所需,使用起來也非常簡潔——只需要一個文件和一個C鏈接庫。
SQLite的缺點
- 沒有用戶管理
高級數據庫都支持用戶系統,例如管理連接對數據庫和表的訪問權限。鑒于SQLite的目的和性質(沒有多客戶端并發的高層設計),它并不包含這些功能。
- 缺少通過優化獲得額外性能的空間
還是由于設計方面的原因,無法通過優化SQLite獲得大量的額外性能。這個類庫非常容易調整、也非常容易使用。它并不復雜,所以從技術上無法讓它變得更快,因為它已經很快了。
何時應該使用SQLite
- 嵌入式應用程序
所有需要可移植性、不需要擴展的應用程序,例如單用戶的本地應用、移動應用或者游戲。
- 替代磁盤訪問
在很多情況下,需要直接讀寫磁盤文件的應用程序可以切換到SQLite從而受益于SQLite提供的額外功能以及使用結構化查詢語言(SQL)所帶來的簡便性。
- 測試
對大部分應用程序而言沒必要使用額外的進程測試業務邏輯(例如應用程序的主要目標:功能)。
何時不應該使用SQLite
- 多用戶應用程序
如果有多個客戶端需要訪問并使用同一個數據庫,那么最好使用功能完整的關系型數據庫(例如MySQL),而不是選擇SQLite。
- 需要高寫入量的應用程序
寫操作是SQLite的一個局限。該DBMS在同一時刻僅允許一個寫操作,因而也限制了其吞吐量。
MySQL
MySQL是最受歡迎的一個大規模數據庫服務器。它是一款功能豐富的開源產品,許多網站和在線應用程序都使用該數據庫。MySQL的入門相對比較簡單,開發者可以從Internet上獲取到大量與該數據庫相關的信息。
注意:鑒于該產品的受歡迎程度,使用該數據庫可以讓我們受益于大量第三方應用程序、工具以及集成類庫。
盡管MySQL并沒有嘗試實現完整的SQL標準,但是它依然為用戶提供了大量功能。作為一個獨立的數據庫服務器,應用程序需要與MySQL守護進程通信才能訪問數據庫——不同于SQLite。
MySQL支持的數據類型
MySQL支持的數據類型包括TINYINT、SMALLINT、MEDIUMINT、INT或INTEGER、BIGINT、FLOAT、DOUBLE、DOUBLE PRECISION、REAL、DECIMAL、NUMERIC、DATE、DATETIME、TIMESTAMP、TIME、YEAR、CHAR、VARCHAR、TINYBLOB, TINYTEXT、BLOB, TEXT、MEDIUMBLOB、MEDIUMTEXT、LONGBLOB, LONGTEXT、ENUM、SET。
MySQL的優點
- 易用
很容易安裝。第三方工具,包括可視化工具,讓用戶能夠很容易入門。
- 功能豐富
MySQL支持關系型數據庫應該有的大部分功能——或者直接支持、或者間接支持。
- 安全
支持很多安全特性,有些非常高級,并且是內置于MySQL中。
- 可擴展也非常強大
MySQL能夠處理大量數據,并且在需要的時候可以規模化使用。
- 快速
放棄某些標準讓MySQL能夠非常高效、簡捷地工作,因而速度更快。
MySQL的缺點
- 已知限制
MySQL從一開始就沒有打算做所有事情,因而它在功能方面有一定的局限性,并不能滿足一些先進應用程序的要求。
- 可靠性問題
MySQL對某些功能(例如引用、事務、審計等)的實現方式使得它與其他的關系型數據庫相比缺少了一些可靠性。
- 開發停滯
盡管MySQL依然是一款開源產品,但是自從它被收購之后人們就對其開發進展有很多抱怨。需要注意的是有一些基于MySQL的、完整集成的數據庫在標準的MySQL之上附加了其他價值,例如MariaDB。
何時應該使用MySQL
- 分布式操作
如果SQLite不能滿足你的需求,那么將MySQL引入到開發棧中,就像任何其他獨立的數據庫服務器一樣,它能夠給你帶來大量的操作自由度以及一些先進的功能。
- 高安全性
MySQL的安全機制通過一種簡單的方式為數據的訪問和使用提供了可靠的保護。
- 網站和Web應用
盡管有一些約束,但是絕大部分網站和Web應用都可以簡單地運行在MySQL上。相關的靈活可擴展的工具非常易于使用和管理——事實證明這些工具在長期運行時非常有用。
- 定制解決方案
MySQL有豐富的配置項和運行模式,如果你需要一個高度量身定制的解決方案,那么MySQL能夠非常容易地尾隨并執行你的規則。
何時不應該使用MySQL
- SQL遵從性
因為MySQL并沒有打算實現完整的SQL標準,所以它并不完全符合SQL。如果你可能需要與這樣的關系型數據庫集成,那么從MySQL切換過去可能并不容易。
- 并發性
盡管MySQL和一些其他的存儲引擎能夠非常好地執行讀操作,但是并發讀寫可能會有問題。
- 缺少功能
MySQL缺少某些功能,例如全文本搜索。
PostgreSQL
PostgreSQL是一款先進的、開源的對象關系型數據庫管理系統,它的主要目標是遵從標準和可擴展。PostgreSQL,或者說Postgres,試圖將ANSI/ISO SQL標準及其修正結合起來。
與其他關系型數據庫相比,PostgreSQL獨特的地方是它支持高度需要的、完整的面向對象以及關系型數據庫的功能,例如完全支持可靠性事務。
由于其強大的底層技術,PostgreSQL能夠非常高效地處理很多任務。得益于多版本并發控制(MVCC),它能夠在沒有讀鎖的情況下實現并發并保證ACID。
PostgreSQL是高度可編程的,因此擴展性非常好,它支持稱為“存儲過程”的自定義程序。用戶可以創建這種函數簡化重復的、復雜的以及經常需要的數據庫操作的執行。
盡管該數據庫非常強大,但是它卻沒有像MySQL那么流行,即便如此依然有很多優秀的第三方工具和類庫可以讓我們更容易地使用它。
PostgreSQL支持的數據類型
PostgreSQL支持的數據類型包括:bigint、bigserial、bit [(n)]、bit varying [(n)]、boolean、box、bytea、character varying [(n)]、character [(n)]、cidr、circle、date、double precision、inet、integer、interval [fields] [(p)]、line、lseg、macaddr、money、numeric [(p,s)]、path、point、polygon、real、smallint、serial、text、time、timestamp、tsquery、tsvector、txid_snapshot、uuid、xml
PostgreSQL的優點
- 開源且遵從SQL標準
PostgreSQL是一款開源的、免費的、功能非常強大的關系型數據庫。
- 強大的社區
由一個忠實的、經驗豐富的社區支持,用戶可以通過知識庫和Q&A網站獲得全天候的免費服務。
- 強有力的第三方支持
除了非常先進的特性之外,PostgreSQL還有很多優秀的、開源的第三方工具可以輔助系統的設計、管理和使用。
- 可擴展
可以通過存儲過程擴展PostgreSQL的功能。
- 面向對象
PostgreSQL不僅是一個關系型數據庫,它還是一個面向對象的數據庫——支持嵌套等功能。
PostgreSQL的缺點
- 性能:
對于簡單繁重的讀取操作,使用PostgreSQL可能有點小題大做,同時性能也比MySQL這樣的同類產品要差。
- 流行程度
盡管有大量的部署,但是鑒于該數據庫的性質,它的受歡迎程序并不高。
- 托管
由于上面提到的幾點,很難找到提供托管PostgreSQL實例的主機或者服務提供商。
何時應該使用PostgreSQL
- 數據完整性
當絕對需要可靠性和數據完整性的時候,PostgreSQL是更好的選擇。
- 復雜的定制程序
如果需要數據庫執行定制程序,那么可擴展的PostgreSQL是更好的選擇。
- 集成:
如果將來可能需要將整個數據庫遷移到其他合適的解決方案上(例如Oracle),那么PostgreSQL可能兼容性最好也更容易切換。
- 復雜的設計
與其他開源且免費的數據庫相比,對于復雜的數據庫設計PostgreSQL在功能方面最全面,潛力最大,不需要你放棄其他有價值的資產。
何時不應該使用PostgreSQL
- 速度
如果你只需要快速讀取操作,那么PostgreSQL并不合適。
- 簡單
除非你需要絕對的數據完整性,ACID遵從性或者設計復雜,否則PostgreSQL對于簡單的場景而言有點多余。
- 復制
對于缺少數據庫和系統管理經驗的人而言使用MySQL實現復制要更簡單,除非你愿意花費時間、精力和資源。
文章列表