自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嵌入式應用程式 所有需要可移植性、不需要擴充的應用程式,例如單使用者的本地應用、行動裝置 App或者遊戲。
替代磁碟訪問在很多情況下,需要直接讀寫磁碟檔案的應用程式可以切換到SQLite從而受益於SQLite提供的額外功能以及使用結構化查詢語言 (SQL)(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能夠非常容易地尾隨並執行你的規則。
何時不應該使用MySQLSQL遵從性因為MySQL並沒有打算實現完整的SQL標準,所以它並不完全符合SQL。如果你可能需要與這樣的關係型資料庫整合,那麼從MySQL切換過去可能並不容易。
並發性儘管MySQL和一些其他的儲存引擎能夠非常好地執行讀操作,但是並發讀寫可能會有問題。
缺少功能MySQL缺少某些功能,例如全文本搜尋。
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實現複製要更簡單,除非你願意花費時間、精力和資源。
引用:http://www.infoq.com/cn/news/2014/04/sqlite-mysql-postgresql