SQLite、MySQL和PostgreSQL三種關(guān)系數(shù)據(jù)庫(kù)比較

2014-03-21 10:43:56來(lái)源:開(kāi)源中國(guó)作者:

在這篇文章中,我們將嘗試?yán)斫庖恍┳畛S、最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)的內(nèi)核區(qū)別。我們將會(huì)探索最底層的區(qū)別——特性與功能,它們?nèi)绾喂ぷ,在哪方面更出色,以幫助程序員選擇合適的RDBMS。

關(guān)系型數(shù)據(jù)庫(kù)的使用已經(jīng)有相當(dāng)長(zhǎng)的時(shí)間了。它們變得流行起來(lái)托了管理系統(tǒng)的福,關(guān)系模型被實(shí)現(xiàn)得相當(dāng)?shù)暮,并且被證明是操作數(shù)據(jù)的好方法(特別是事務(wù)性強(qiáng)的應(yīng)用)。

在這篇DigitalOcean文章中,我們將嘗試?yán)斫庖恍┳畛S谩⒆盍餍械年P(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)的內(nèi)核區(qū)別。我們將會(huì)探索最底層的區(qū)別——特性與功能,它們?nèi)绾喂ぷ,在哪方面更出色,以幫助程序員選擇合適的RDBMS。 

條目表

1. 數(shù)據(jù)庫(kù)管理系統(tǒng)

  1. 關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)

  2. 關(guān)系與數(shù)據(jù)類(lèi)型

  3. 重要的和流行的關(guān)系型數(shù)據(jù)庫(kù)

2. SQLite

  1. SQLite支持的數(shù)據(jù)類(lèi)型

  2. SQLite的優(yōu)勢(shì)

  3. SQLite的劣勢(shì)

  4. 何時(shí)使用SQLite

  5. 何時(shí)不用SQLite

3. MySQL

  1. MySQL支持的數(shù)據(jù)類(lèi)型

  2. MySQL的優(yōu)勢(shì)

  3. MySQL的劣勢(shì)

  4. 何時(shí)使用MySQL

  5. 何時(shí)不用MySQL

3. PostgreSQL

  1. PostgreSQL支持的數(shù)據(jù)類(lèi)型

  2. PostgreSQL的優(yōu)勢(shì)

  3. PostgreSQL的劣勢(shì)

  4. 何時(shí)使用PostgreSQL

  5. 何時(shí)不用PostgreSQL

數(shù)據(jù)庫(kù)管理系統(tǒng)

數(shù)據(jù)庫(kù)是有組織地存儲(chǔ)模型數(shù)據(jù)的空間,存儲(chǔ)各種類(lèi)型的信息(數(shù)據(jù))。每個(gè)數(shù)據(jù)庫(kù),除了無(wú)模式型的,都有一個(gè)模型,提供數(shù)據(jù)的結(jié)構(gòu)描述。數(shù)據(jù)庫(kù)管理系統(tǒng)是管理數(shù)據(jù)庫(kù)結(jié)構(gòu)、大小和排序的應(yīng)用(或庫(kù))。

注: 更多有關(guān)數(shù)據(jù)庫(kù)管理系統(tǒng)的內(nèi)容,請(qǐng)看我們的文章:理解數(shù)據(jù)庫(kù)。

關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)

關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)實(shí)現(xiàn)了關(guān)系模型,并用它來(lái)處理數(shù)據(jù)。關(guān)系模型在表中將信息與字段關(guān)聯(lián)起來(lái)(也就是schemas),從而存儲(chǔ)數(shù)據(jù)。

這種數(shù)據(jù)庫(kù)管理系統(tǒng)需要結(jié)構(gòu)(例如表)在存儲(chǔ)數(shù)據(jù)之前被定義出來(lái)。有了表,每一列(字段)都存儲(chǔ)一個(gè)不同類(lèi)型(數(shù)據(jù)類(lèi)型)的信息。數(shù)據(jù)庫(kù)中的每個(gè)記錄,都有自己唯一的key,作為屬于某一表的一行,行中的每一個(gè)信息都對(duì)應(yīng)了表中的一列——所有的關(guān)系一起,構(gòu)成了關(guān)系模型。

關(guān)系和數(shù)據(jù)類(lèi)型

關(guān)系可以被看做是包含一系列共同表示被保持?jǐn)?shù)據(jù)庫(kù)以及相關(guān)信息的屬性的數(shù)學(xué)集合. 這種類(lèi)型的識(shí)別和采集方法可以讓關(guān)系型數(shù)據(jù)庫(kù)以它們自己的方式運(yùn)作.

在定義一個(gè)可以向其中插入數(shù)據(jù)的表時(shí),每一個(gè)形成一條記錄的元素(例如: 屬性)都必須同定義的數(shù)據(jù)類(lèi)型相匹配(例如:一個(gè)integer, 一個(gè)date 等等.). 不同的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)實(shí)現(xiàn)了不同的數(shù)據(jù)類(lèi)型 -- 它們不總是能直接互相轉(zhuǎn)換的.

與限制的協(xié)作,就像我們之前已經(jīng)介紹過(guò)的,在關(guān)系數(shù)據(jù)庫(kù)的使用中是很普遍的。事實(shí)上,限制形成了關(guān)系的核心.

注意: 如果你需要實(shí)際上沒(méi)有關(guān)系的,隨機(jī)的數(shù)據(jù)(例如一份文檔),你也許會(huì)對(duì)使用NoSQL感興趣 (無(wú)模式數(shù)據(jù)庫(kù)). 如果你想對(duì)它們有更多了解,看看我們的文章 數(shù)據(jù)庫(kù)管理系統(tǒng)的比較吧.

重要和流行的關(guān)系型數(shù)據(jù)庫(kù)

本文中,我們將會(huì)介紹三種主要而且重要的開(kāi)源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),是他們影響了應(yīng)用開(kāi)發(fā)世界。

  • SQLite:

一個(gè)強(qiáng)大的嵌入式關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。

  • MySQL:

最流行的RDBMS。

  • PostgreSQL:

最先進(jìn)SQL型開(kāi)源objective-RDBMS。

注: 開(kāi)源應(yīng)用總是可以自由使用的。大多數(shù)時(shí)候,復(fù)制工程(利用代碼)創(chuàng)建新應(yīng)用也是被允許的。如果你對(duì)DBMS感興趣,你可以看看一些基于這些工程的分支項(xiàng)目,例如MariaDB

SQLite

SQLite是非凡的數(shù)據(jù)庫(kù),他可以進(jìn)程在使用它的應(yīng)用中。作為一個(gè)自包含、基于文件的數(shù)據(jù)庫(kù),SQLite提供了出色的工具集,可以處理所有類(lèi)型的數(shù)據(jù),沒(méi)有什么限制,而且比起服務(wù)器運(yùn)行的進(jìn)程型服務(wù)器使用起來(lái)輕松許多。

一個(gè)應(yīng)用使用SQLite時(shí),它的功能直接被集成在其中,應(yīng)用會(huì)直接訪問(wèn)包含數(shù)據(jù)的文件(即SQLite數(shù)據(jù)庫(kù)),而不是通過(guò)一些端口(port, socket)來(lái)交互。感謝這種底層技術(shù),這使SQLite變得非?焖俸透咝,并且十分強(qiáng)大。

SQLite支持的數(shù)據(jù)類(lèi)型

  • NULL:

NULL值。

  • INTEGER:

有符號(hào)整數(shù),按照設(shè)置用1、2、3、4、6或8字節(jié)存儲(chǔ)。

  • REAL:

浮點(diǎn)數(shù),使用8字節(jié)IEEE浮點(diǎn)數(shù)方式存儲(chǔ)。

  • TEXT:

文本字符串,使用數(shù)據(jù)庫(kù)編碼存儲(chǔ)(UTF-8, UTF-16BE 或 UTF-16LE)。

  • BLOB:

二進(jìn)制大對(duì)象,怎么輸入就怎么存儲(chǔ)。

注: 想了解更多有關(guān)SQLite數(shù)據(jù)類(lèi)型的信息,可以查看這一主題的 官方文檔 

SQLite 的優(yōu)點(diǎn)

  • 基于文件:

整個(gè)數(shù)據(jù)庫(kù)都包含在磁盤(pán)上的一個(gè)文件中,因此它有很好的遷移性。

  • 標(biāo)準(zhǔn)化:

盡管它看起來(lái)像個(gè)“簡(jiǎn)化版”的數(shù)據(jù)庫(kù),SQLite 確實(shí)支持 SQL。它略去了一些功能(RIGHT OUTER JOIN 和 FOR EACH STATEMENT),但是,又同時(shí)增加了一些其他功能。

  • 對(duì)開(kāi)發(fā)乃至測(cè)試都很棒:

在絕大多數(shù)應(yīng)用的開(kāi)發(fā)階段中,大部分人都非常需要解決方案能有并發(fā)的靈活性。SQLite 含有豐富功能基礎(chǔ),所能提供的超乎開(kāi)發(fā)所需,并且簡(jiǎn)潔到只需一個(gè)文件和一個(gè) C 鏈接庫(kù)。

SQLite的缺點(diǎn)

  • 沒(méi)有用戶管理:

高級(jí)數(shù)據(jù)庫(kù)都能支持用戶系統(tǒng),例如,能管理數(shù)據(jù)庫(kù)連接對(duì)數(shù)據(jù)庫(kù)和表的訪問(wèn)權(quán)限。但由于 SQLite 產(chǎn)生的目的和本身性質(zhì)(沒(méi)有多用戶并發(fā)的高層設(shè)計(jì)),它沒(méi)有這個(gè)功能。

  • 缺乏額外優(yōu)化性能的靈活性:

仍然是從設(shè)計(jì)之初,SQLite 就不支持使用各種技巧來(lái)進(jìn)行額外的性能優(yōu)化。這個(gè)庫(kù)容易配置,容易使用。既然它并不復(fù)雜,理論上就無(wú)法讓它比現(xiàn)在更快,其實(shí)現(xiàn)在它已經(jīng)很快了。

什么時(shí)候要用 SQLite

  • 嵌入式應(yīng)用:

所有需要遷移性,不需要擴(kuò)展的應(yīng)用,例如,單用戶的本地應(yīng)用,移動(dòng)應(yīng)用和游戲。

  • 代替磁盤(pán)訪問(wèn):

在很多情況下,需要頻繁直接讀/寫(xiě)磁盤(pán)文件的應(yīng)用,都很適合轉(zhuǎn)為使用 SQLite ,可以得益于 SQLite 使用 SQL 帶來(lái)的功能性和簡(jiǎn)潔性。

  • 測(cè)試:

它能秒殺大部分專(zhuān)門(mén)針對(duì)應(yīng)用業(yè)務(wù)邏輯(也就是應(yīng)用的主要目的:能完成功能)的測(cè)試。

什么時(shí)候不要用SQLite

  • 多用戶應(yīng)用:

如果你在開(kāi)發(fā)的應(yīng)用需要被多用戶訪問(wèn),而且這些用戶都用同一個(gè)數(shù)據(jù)庫(kù),那么相比 SQLite 最好還是選擇一個(gè)功能完整的關(guān)系型數(shù)據(jù)庫(kù)(例如 MySQL)。

  • 需要大面積寫(xiě)入數(shù)據(jù)的應(yīng)用:

SQLite 的缺陷之一是它的寫(xiě)入操作。這個(gè)數(shù)據(jù)庫(kù)同一時(shí)間只允許一個(gè)寫(xiě)操作,因此吞吐量有限。

MySQL

MySQL 在所有大型數(shù)據(jù)庫(kù)服務(wù)器中最流行的一個(gè). 它的特性豐富,產(chǎn)品的開(kāi)源性質(zhì)使得其驅(qū)動(dòng)了線上大量的網(wǎng)站和應(yīng)用程序. 要入手 MySQL 相對(duì)簡(jiǎn)單,開(kāi)發(fā)人員可以在互聯(lián)網(wǎng)上面訪問(wèn)到大量有關(guān)這個(gè)數(shù)據(jù)庫(kù)的信息.

注意: 由于這個(gè)產(chǎn)品的普及性,大量的第三方應(yīng)用、工具和集成庫(kù)對(duì)于操作這個(gè)RDBCMS的方方面面大有幫助.

Mysql沒(méi)有嘗試去實(shí)現(xiàn)SQL標(biāo)準(zhǔn)的全部,而是為用戶提供了很多有用的功能. 作為一個(gè)獨(dú)立的數(shù)據(jù)庫(kù)服務(wù)器,應(yīng)用程序同Mysql守護(hù)進(jìn)程的交互,告訴它去訪問(wèn)數(shù)據(jù)庫(kù)自身 -- 這一點(diǎn)不像 SQLite.

MySQL支持的數(shù)據(jù)類(lèi)型

  • TINYINT:

一個(gè)非常小的整數(shù).

  • SMALLINT:

一個(gè)小整數(shù).

  • MEDIUMINT:

一個(gè)中間大小的整數(shù).

  • INT or INTEGER:

一個(gè)正常大小的整數(shù).

  • BIGINT:

一個(gè)大的整數(shù).

  • FLOAT:

一個(gè)小的 (單精度) 浮點(diǎn)數(shù),不能是無(wú)符號(hào)的那種.

  • DOUBLE, DOUBLE PRECISION, REAL:

一個(gè)正常大小 (雙精度) 的浮點(diǎn)數(shù),不能使無(wú)符號(hào)的那種.

  • DECIMAL, NUMERIC:

沒(méi)有被包裝的浮點(diǎn)數(shù)。不能使無(wú)符號(hào)的那種.

  • DATE:

一個(gè)日期.

  • DATETIME:

一個(gè)日期和時(shí)間的組合.

  • TIMESTAMP:

一個(gè)時(shí)間戳.

  • TIME:

一個(gè)時(shí)間.

  • YEAR:

一個(gè)用兩位或者4位數(shù)字格式表示的年份(默認(rèn)是4位).

  • CHAR:

一個(gè)固定長(zhǎng)度的字符串,存儲(chǔ)時(shí)總是在其固定長(zhǎng)度的空間里右對(duì)齊.

  • VARCHAR:

一個(gè)可變長(zhǎng)度的字符串.

  • TINYBLOB, TINYTEXT:

一個(gè)BLOB或者TEXT列,最大長(zhǎng)度255 (2^8 - 1)個(gè)字符.

  • BLOB, TEXT:

一個(gè)BLOB或者TEXT列,最大長(zhǎng)度 65535 (2^16 - 1)個(gè)字符.

  • MEDIUMBLOB, MEDIUMTEXT:

一個(gè)BLOB或者TEXT列,最大長(zhǎng)度 16777215 (2^24 - 1)個(gè)字符.

  • LONGBLOB, LONGTEXT:

一個(gè)BLOB或者TEXT列,最大長(zhǎng)度4294967295 (2^32 - 1) 個(gè)字符.

  • ENUM:

一個(gè)枚舉類(lèi)型.

  • SET:

一個(gè)集合.

MySQL的優(yōu)點(diǎn)

  • 容易使用:

安裝MySQL非常容易。第三方庫(kù),包括可視化(也就是有GUI)的庫(kù)讓上手使用數(shù)據(jù)庫(kù)非常簡(jiǎn)單。

  • 功能豐富:

MySQL 支持大部分關(guān)系型數(shù)據(jù)庫(kù)應(yīng)該有的 SQL 功能——有些直接支持,有些間接支持。

  • 安全:

MYSQL 有很多安全特性,其中有些相當(dāng)高級(jí)。

  • 靈活而強(qiáng)大:

MySQL 能處理很多數(shù)據(jù),此外如有需要,它還能“適應(yīng)”各種規(guī)模的數(shù)據(jù)。

  • 快速:

放棄支持某些標(biāo)準(zhǔn),讓 MySQL 效率更高并能使用捷徑,因此帶來(lái)速度的提升。

MySQL的缺點(diǎn)

  • 已知的局限:

從設(shè)計(jì)之初,MySQL 就沒(méi)打算做到全知全能,因此它有一些功能局限,無(wú)法滿足某些頂尖水平應(yīng)用的需求。

  • 可靠性問(wèn)題:

MySQL 對(duì)于某些功能的實(shí)現(xiàn)方式(例如,引用,事務(wù),數(shù)據(jù)審核等) 使得它比其他一些關(guān)系型數(shù)據(jù)庫(kù)略少了一些可靠性。

  • 開(kāi)發(fā)停滯:

盡管 MySQL 理論上仍是開(kāi)源產(chǎn)品,也有人抱怨它誕生之后更新緩慢。然而,應(yīng)該注意到有一些基于 MySQL 并完整集成的數(shù)據(jù)庫(kù)(如 MariaDB),在標(biāo)準(zhǔn)的 MySQL 基礎(chǔ)上帶來(lái)了額外價(jià)值。

何時(shí)使用 MySQL?

  • 分布式操作:

當(dāng)你需要的比SQLite可以提供的更多時(shí),把MySQL包括進(jìn)你的部署棧,就像任何一個(gè)獨(dú)立的數(shù)據(jù)庫(kù)服務(wù)器,會(huì)帶來(lái)大量的操作自由和一些先進(jìn)的功能。

  • 高安全性:

MySQL的安全功能,用一種簡(jiǎn)單的方式為數(shù)據(jù)訪問(wèn)(和使用)提供了可靠的保護(hù)。

  • Web網(wǎng)站 和 Web應(yīng)用:

絕大多數(shù)的網(wǎng)站(和Web應(yīng)用程序)可以忽視約束性地簡(jiǎn)單工作在MySQL上。這種靈活的和可擴(kuò)展的工具是易于使用和易于管理的——這被證明非常有助于長(zhǎng)期運(yùn)行。

  • 定制解決方案:

如果你工作在一個(gè)高度量身定制的解決方案上,MySQL能夠很容易地尾隨和執(zhí)行你的規(guī)則,這要感謝其豐富的配置設(shè)置和操作模式。

何時(shí)不用 MySQL?

  • SQL 服從性:

因?yàn)?MySQL 沒(méi)有[想要]實(shí)現(xiàn) SQL 的全部標(biāo)準(zhǔn),所以這個(gè)工具不完全符合SQL。如果你需要對(duì)這樣的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)進(jìn)行整合,從MySQL進(jìn)行切換是不容易的。

  • 并發(fā):

即使MySQL和一些存儲(chǔ)引擎能夠真地很好執(zhí)行讀取操作,但并發(fā)讀寫(xiě)還是有問(wèn)題的。

  • 缺乏特色:

再次提及,根據(jù)數(shù)據(jù)庫(kù)引擎的選擇標(biāo)準(zhǔn),MySQL會(huì)缺乏一定的特性,如全文搜索。

PostgreSQL

PostgreSQL 是一個(gè)先進(jìn)的,開(kāi)放源代碼的[對(duì)象]-關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它的主要目標(biāo)是實(shí)現(xiàn)標(biāo)準(zhǔn)和可擴(kuò)展性. PostgreSQL, 或者說(shuō)是 Postgres, 試圖把對(duì) ANSI/ISO SQL標(biāo)準(zhǔn)的采用與修正結(jié)合起來(lái).

對(duì)比其他的RDBMS, PostgreSQL以它對(duì)于對(duì)象-關(guān)系和\或關(guān)系型數(shù)據(jù)庫(kù)功能,比如對(duì)于可靠事務(wù),例如原子性,一致性,隔離性和持久性(ACID)的完全支持,這些東西的高度需求和集合的支持,以示其獨(dú)特性.

由于強(qiáng)大的底層技術(shù), Postgres對(duì)于高效的完成許多處理任務(wù)很有一手. 得益于其多版本并發(fā)控制 (MVCC)的實(shí)現(xiàn),在沒(méi)有讀取鎖的前提下也能達(dá)成并發(fā), 這也同樣確保了ACID的實(shí)施.

PostgreSQL是高度可編程的, 因而可以使用被稱(chēng)作“存儲(chǔ)過(guò)程”的自定義程序進(jìn)行擴(kuò)展. 這些功能可以被創(chuàng)建用來(lái)簡(jiǎn)化一個(gè)寫(xiě)重復(fù)、復(fù)雜并且常常需要數(shù)據(jù)庫(kù)操作的任務(wù)的執(zhí)行.

雖然特性強(qiáng)大,但這個(gè) DBMS并沒(méi)有MySQL那么流行, 可還是有許多迷人的第三方工具和庫(kù)被設(shè)計(jì)出來(lái)用于使得對(duì)PostgreSQL的操作簡(jiǎn)化. 如今通過(guò)許多操作系統(tǒng)默認(rèn)的包管理器輕松的獲取PostgreSQL已成為可能.

PostgreSQL支持的數(shù)據(jù)類(lèi)型

  • bigint:

有符號(hào)的八位整數(shù)

  • bigserial:

自增長(zhǎng)的八位整數(shù)

  • bit [(n)]:

固定長(zhǎng)度的位串

  • bit varying [(n)]:

可變長(zhǎng)度的位串

  • boolean:

邏輯布爾值(true/false)

  • box:

在一個(gè)平面上的矩形框

  • bytea:

二進(jìn)制數(shù)據(jù)("位數(shù)組")

  • character varying [(n)]:

可變長(zhǎng)度的字符串

  • character [(n)]:

固定長(zhǎng)度的字符串

  • cidr:

IPv4 或者 IPv6 網(wǎng)絡(luò)地址

  • circle:

平面上的一個(gè)圓

  • date:

日歷日期 ( 年月日)

  • double precision:

雙精度浮點(diǎn)數(shù)(8位)

  • inet:

IPv4 或者 IPv6 主機(jī)地址

  • integer:

有符號(hào)的四位整數(shù)

  • interval [fields] [(p)]:

時(shí)間跨度

  • line:

平面上的一個(gè)無(wú)限長(zhǎng)的直線

  • lseg:

平面上的一個(gè)線段

  • macaddr:

MAC (媒體訪問(wèn)控制)地址

  • money:

貨幣金額

  • numeric [(p, s)]:

可選精度的精確數(shù)字

  • path:

一個(gè)平面上的幾何路徑

  • point:

一個(gè)平面上的幾何點(diǎn)

  • polygon:

一個(gè)平面上的閉合的幾何路徑

  • real:

單精度浮點(diǎn)數(shù)(4 位)

  • smallint:有符號(hào)的兩位整數(shù)

  • serial:

自增長(zhǎng)4位整數(shù)

  • text:

可變長(zhǎng)度字符創(chuàng)

  • time [(p)] [without time zone]:

一天中的時(shí)間(無(wú)時(shí)區(qū))

  • time [(p)] with time zone:

一天中的時(shí)間,包含時(shí)區(qū)

  • timestamp [(p)] [without time zone]:

日期和時(shí)間(沒(méi)有時(shí)區(qū))

  • timestamp [(p)] with time zone:

日期和時(shí)間,包含時(shí)區(qū)

  • tsquery:

文本搜索查詢

  • tsvector:

文本搜索文檔

  • txid_snapshot:

用戶級(jí)事務(wù)ID快照

  • uuid:

通用的唯一標(biāo)識(shí)符

  • xml:

XML 數(shù)據(jù)

PostgreSQL的優(yōu)點(diǎn)

  • 標(biāo)準(zhǔn)支持 SQL 的開(kāi)源關(guān)系型數(shù)據(jù)庫(kù):

PostgreSQL 是一個(gè)開(kāi)源的,免費(fèi)的,同時(shí)非常強(qiáng)大的關(guān)系型數(shù)據(jù)管理系統(tǒng)。

  • 強(qiáng)大的社區(qū):

PostgreSQL 背后有熱忱而經(jīng)驗(yàn)豐富的社區(qū),可以通過(guò)知識(shí)庫(kù)和問(wèn)答網(wǎng)站獲取支持,全天候免費(fèi)。

  • 強(qiáng)大的第三方支持:

即使其本身功能十分強(qiáng)大,PostgreSQL 仍附帶有許多強(qiáng)大的開(kāi)源第三方工具來(lái)輔助系統(tǒng)的設(shè)計(jì)、管理和使用。

  • 可擴(kuò)展性:

可以用預(yù)先存儲(chǔ)的流程來(lái)程序性擴(kuò)展 PostgreSQL ,一個(gè)高級(jí)的關(guān)系型數(shù)據(jù)庫(kù)理應(yīng)如此。

  • 面向?qū)ο?

PostgreSQL 不只是一個(gè)關(guān)系型數(shù)據(jù)庫(kù),還是一個(gè)面向?qū)ο髷?shù)據(jù)庫(kù)——支持嵌套,及一些其他功能。

PostgreSQL的缺點(diǎn):

  • 性能:

對(duì)于簡(jiǎn)單而繁重的讀取操作, 超過(guò)了 PostgreSQL 的殺傷力,可能會(huì)出現(xiàn)比同行(如MySQL)更低的性能。

  • 普及:

按給出的該工具的性質(zhì),從普及度來(lái)說(shuō)它還缺乏足夠后臺(tái)支撐,盡管有大量的部署——這可能會(huì)影響能夠獲得支持的容易程度。

  • 托管:

由于上述因素的影響,要讓主機(jī)或服務(wù)提供商提出使用PostgreSQL實(shí)例是很難的。

何時(shí)使用PostgreSQL?

  • 數(shù)據(jù)完整性:

    當(dāng)可靠性和數(shù)據(jù)完整性是絕對(duì)必要而無(wú)需理由時(shí),PostgreSQL是更好的選擇。

  • 復(fù)雜的自定義過(guò)程:

    如果你需要你的數(shù)據(jù)庫(kù)執(zhí)行自定義過(guò)程,可擴(kuò)展的PostgreSQL是更好的選擇。

  • 整合:

    在將來(lái),如果可能要把整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)遷移到另一個(gè)適當(dāng)?shù)慕鉀Q方案(例如Oracle)中,PostgreSQL對(duì)于這種切換將是最兼容和易于操作的。

  • 復(fù)雜的設(shè)計(jì):

相比其他的開(kāi)源和免費(fèi)的 RDBMS(關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))實(shí)現(xiàn)來(lái)說(shuō),對(duì)于復(fù)雜的數(shù)據(jù)庫(kù)設(shè)計(jì),PostgreSQL提供了大部分的功能和可能性,同時(shí)并沒(méi)放棄其他有價(jià)值的地方。

何時(shí)不用 PostgreSQL?

  • 速度:

如果你需要的只是快速的讀取操作, PostgreSQL 不是為此而準(zhǔn)備的工具。

  • 簡(jiǎn)化體制:

除非你需要絕對(duì)的數(shù)據(jù)完整性,原子性,一致性,隔離性,耐久性,或復(fù)雜的設(shè)計(jì),PostgreSQL 對(duì)簡(jiǎn)化體制來(lái)說(shuō)是殺手。

  • 復(fù)制:

除非你愿意花不少時(shí)間,精力和資源,否則對(duì)于那些缺乏數(shù)據(jù)庫(kù)和系統(tǒng)管理經(jīng)驗(yàn)的人來(lái)說(shuō),實(shí)現(xiàn)與MySQL的(主從)復(fù)制可能不容易。

原文:https://www.digitalocean.com/community/articles/sqlite-vs-mysql-vs-postgresql-a-comparison-of-relational-database-management-systems

贊助商鏈接: