建一個公司網(wǎng)站網(wǎng)站營銷策劃
引言
關(guān)系數(shù)據(jù)模型以行和列的表格形式組織數(shù)據(jù),在數(shù)據(jù)庫管理工具中占主導(dǎo)地位。今天還有其他數(shù)據(jù)模型,包括NoSQL和NewSQL,但是關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)仍然占主導(dǎo)地位用于存儲和管理全球數(shù)據(jù)。
本文比較了三種實(shí)現(xiàn)最廣泛的開源RDBMS:SQLite、MySQL和PostgreSQL。具體來說,本章將探討每種RDBMS使用的數(shù)據(jù)類型、它們的優(yōu)缺點(diǎn),以及它們最適合優(yōu)化的情況。
數(shù)據(jù)庫管理系統(tǒng)簡介
數(shù)據(jù)庫是對信息或數(shù)據(jù)進(jìn)行邏輯建模的集群。另一方面,數(shù)據(jù)庫管理系統(tǒng) (DBMS)是與數(shù)據(jù)庫交互的計算機(jī)程序。DBMS允許你控制對數(shù)據(jù)庫的訪問、寫入數(shù)據(jù)、執(zhí)行查詢以及執(zhí)行與數(shù)據(jù)庫管理相關(guān)的任何其他任務(wù)。
雖然數(shù)據(jù)庫管理系統(tǒng)通常被稱為“數(shù)據(jù)庫”,但這兩個術(shù)語是不可互換的。數(shù)據(jù)庫可以是任何數(shù)據(jù)集合,而不僅僅是存儲在計算機(jī)上的數(shù)據(jù)。相比之下,DBMS特指允許您與數(shù)據(jù)庫交互的軟件。
所有數(shù)據(jù)庫管理系統(tǒng)都有一個底層模型,該模型對數(shù)據(jù)的存儲和訪問方式進(jìn)行結(jié)構(gòu)化。關(guān)系數(shù)據(jù)庫管理系統(tǒng)是一種采用關(guān)系數(shù)據(jù)模型的DBMS。在這種關(guān)系模型中,數(shù)據(jù)被組織成表。表,在RDBMS的上下文中,更正式的叫法是關(guān)系(relations)。關(guān)系是一組元組(tuples) 的集合,它們是表中的行,每個元組共享一組屬性(attributes),這些屬性是表中的列:
大多數(shù)關(guān)系型數(shù)據(jù)庫使用結(jié)構(gòu)化查詢語言 (SQL)來管理和查詢數(shù)據(jù)。然而,許多關(guān)系數(shù)據(jù)庫使用自己的SQL方言,這可能有一定的限制或擴(kuò)展。這些擴(kuò)展通常包含額外的特性,允許用戶執(zhí)行比標(biāo)準(zhǔn)SQL更復(fù)雜的操作。
注意: 術(shù)語“標(biāo)準(zhǔn)SQL”在本指南中出現(xiàn)多次。SQL標(biāo)準(zhǔn)由美國國家標(biāo)準(zhǔn)協(xié)會(ANSI)、國際標(biāo)準(zhǔn)化組織(ISO)和國際電工委員會(IEC)共同維護(hù)。當(dāng)本文提到“標(biāo)準(zhǔn)SQL”或“SQL標(biāo)準(zhǔn)”時,它指的是這些機(jī)構(gòu)發(fā)布的SQL標(biāo)準(zhǔn)的當(dāng)前版本。
需要注意的是,完整的SQL標(biāo)準(zhǔn)既龐大又復(fù)雜:完整的核心SQL:2011要求179個功能。正因?yàn)槿绱?#xff0c;大多數(shù)RDBMS并不支持整個標(biāo)準(zhǔn),盡管有些RDBMS確實(shí)比其他RDBMS更接近于完全遵從標(biāo)準(zhǔn)。
數(shù)據(jù)類型和約束
每一列都有一個數(shù)據(jù)類型,它規(guī)定了該列中允許哪些類型的項(xiàng)。不同的RDBMS實(shí)現(xiàn)不同的數(shù)據(jù)類型,這些類型并不總是可以直接互換。一些常見的數(shù)據(jù)類型包括日期、字符串、整數(shù)和布爾值。
在數(shù)據(jù)庫中存儲整數(shù)比在表中存儲數(shù)字要微妙得多。數(shù)值數(shù)據(jù)類型可以是有符號(signed),這意味著它們可以表示正數(shù)和負(fù)數(shù),也可以是無符號(unsigned),這意味著它們只能表示正數(shù)。例如,MySQL的tinyint
數(shù)據(jù)類型可以保存8位數(shù)據(jù),相當(dāng)于256個可能的值。這個數(shù)據(jù)類型的有符號范圍是-128 ~ 127,無符號范圍是0 ~ 255。
能夠控制哪些數(shù)據(jù)可以進(jìn)入數(shù)據(jù)庫是很重要的。有時,數(shù)據(jù)庫管理員會對表施加約束(constraint),以限制可以輸入的值。一個約束通常應(yīng)用于一個特定的列,但一些約束也可以應(yīng)用于整個表。下面是一些SQL中常用的約束:
UNIQUE
:將此約束應(yīng)用于列,確保該列中沒有兩個元素是相同的。NOT NULL
:這個約束確保列不包含任何NULL
元素。PRIMARY KEY
:UNIQUE
和NOT NULL
的組合,PRIMARY KEY
約束確保列中沒有NULL
條目,并且每個條目都是不同的。FOREIGN KEY
:FOREIGN KEY
是一張表中的一列,指向另一張表的PRIMARY KEY
。此約束用于將兩個表鏈接在一起。FOREIGN KEY
列的條目必須已經(jīng)存在于父PRIMARY KEY
列中,這樣寫進(jìn)程才能成功。CHECK
:這個約束限制了列可以輸入的值的范圍。例如,如果這一列是手機(jī)號碼,則可以在郵政編碼列上添加一個CHECK
約束,使條目只允許在13位數(shù)。
現(xiàn)在我們已經(jīng)大體上介紹了關(guān)系數(shù)據(jù)庫管理系統(tǒng),讓我們轉(zhuǎn)到本文將介紹的三個開源關(guān)系數(shù)據(jù)庫中的第一個:SQLite。
SQLite
SQLite是一個自包含的、基于文件的、完全開源的RDBMS,以其可移植性、可靠性和即使在低內(nèi)存環(huán)境中也具有強(qiáng)大的性能而聞名。其交易符合ACID標(biāo)準(zhǔn),即使在系統(tǒng)崩潰或經(jīng)歷停電的情況下也是如此。
SQLite項(xiàng)目的網(wǎng)站將其描述為無服務(wù)器
數(shù)據(jù)庫。大多數(shù)關(guān)系型數(shù)據(jù)庫引擎都實(shí)現(xiàn)為服務(wù)器進(jìn)程,程序通過中繼請求的進(jìn)程間通信與主機(jī)服務(wù)器進(jìn)行通信。相比之下,SQLite允許任何訪問數(shù)據(jù)庫的進(jìn)程直接讀寫數(shù)據(jù)庫磁盤文件。這簡化了SQLite的設(shè)置過程,因?yàn)樗巳魏闻渲梅?wù)器進(jìn)程的需要。同樣,使用SQLite數(shù)據(jù)庫的程序也不需要配置:它們只需要訪問磁盤。
SQLite是免費(fèi)開源軟件,使用它不需要特殊的許可證。然而,該項(xiàng)目確實(shí)提供了幾個擴(kuò)展-每個都需要一次性付費(fèi)-以幫助壓縮和加密。此外,該項(xiàng)目還提供各種商業(yè)支持包,每個包都需要支付年費(fèi)。
SQLite支持的數(shù)據(jù)類型
SQLite允許多種數(shù)據(jù)類型,數(shù)據(jù)類型如下:
數(shù)據(jù)類型 | 說明 |
---|---|
null | 包括任何NULL 值 |
integer | 有符號整數(shù),存儲在1、2、3、4、6或8個字節(jié)中,具體取決于值的大小。 |
real | 真實(shí)的或浮點(diǎn)值,存儲為8字節(jié)浮點(diǎn)數(shù)。 |
text | 使用數(shù)據(jù)庫編碼存儲的文本字符串,可以是UTF-8、UTF-16 BE或UTF-16 LE。 |
blob | 任何數(shù)據(jù)blob,每個blob完全按照輸入的方式存儲。 |
在SQLite的上下文中,術(shù)語“存儲類”和“數(shù)據(jù)類型”是可以互換的。如果您想了解有關(guān)SQLite的數(shù)據(jù)類型和SQLite類型關(guān)聯(lián)的更多信息,請查看SQLite的官方文檔。 |
SQLite的優(yōu)點(diǎn)
- 占用空間小:SQLite庫是非常輕量級的。盡管它使用的空間因安裝它的系統(tǒng)而異,但它可以占用不到600KiB的空間。此外,它是完全自包含的,這意味著你不需要在系統(tǒng)上安裝任何外部依賴即可使SQLite工作。
- 用戶友好:SQLite有時被描述為“零配置”數(shù)據(jù)庫,可以開箱即用。SQLite不作為服務(wù)器進(jìn)程運(yùn)行,這意味著它永遠(yuǎn)不需要停止、啟動或重啟,也不帶任何需要管理的配置文件。這些特性有助于簡化從安裝SQLite到將其與應(yīng)用程序集成的過程。
- 可移植性:不像其他數(shù)據(jù)庫管理系統(tǒng)通常將數(shù)據(jù)存儲為大量獨(dú)立文件,整個SQLite數(shù)據(jù)庫存儲在單個文件中。該文件可以位于目錄層次結(jié)構(gòu)中的任何位置,并可以通過可移動媒體或文件傳輸協(xié)議共享。
SQLite的缺點(diǎn)
- 有限的并發(fā)性:盡管多個進(jìn)程可以同時訪問和查詢SQLite數(shù)據(jù)庫,但在任何給定的時間內(nèi),只有一個進(jìn)程可以對數(shù)據(jù)庫進(jìn)行更改。這意味著雖然SQLite比大多數(shù)其他嵌入式數(shù)據(jù)庫管理系統(tǒng)支持更大的并發(fā)性,但它不能像MySQL或PostgreSQL這樣的客戶端/服務(wù)器RDBMS那樣支持那么多。
- 無用戶管理:數(shù)據(jù)庫系統(tǒng)通常支持用戶,或者通過預(yù)定義的對數(shù)據(jù)庫和表的訪問權(quán)限來管理連接。因?yàn)镾QLite直接讀寫普通磁盤文件,所以唯一適用的訪問權(quán)限是底層操作系統(tǒng)的典型訪問權(quán)限。這使得SQLite對于需要多個具有特殊訪問權(quán)限的用戶的應(yīng)用程序來說是一個糟糕的選擇。
- 安全性:在某些情況下,使用服務(wù)器的數(shù)據(jù)庫引擎可以提供比無服務(wù)器數(shù)據(jù)庫(如SQLite)更好的保護(hù),避免客戶端應(yīng)用程序中的bug。例如,客戶端中的游離指針不會破壞服務(wù)器上的內(nèi)存。另外,由于服務(wù)器是單一持久進(jìn)程,因此客戶機(jī)-服務(wù)器數(shù)據(jù)庫可以比無服務(wù)器數(shù)據(jù)庫更精確地控制數(shù)據(jù)訪問。這允許更細(xì)粒度的鎖和更好的并發(fā)。
什么時候可以用SQLite?
- 嵌入式應(yīng)用程序:對于需要可移植性且不需要未來擴(kuò)展的應(yīng)用程序,SQLite是一個很好的數(shù)據(jù)庫選擇。例如單用戶本地應(yīng)用程序、移動應(yīng)用程序或游戲。
- 單機(jī)程序:在應(yīng)用程序需要直接讀寫文件到磁盤的情況下,使用SQLite可以獲得SQL帶來的額外功能和簡單性。
- 測試:對于許多應(yīng)用來說,使用使用額外服務(wù)器進(jìn)程的DBMS來測試它們的功能可能是多余的。SQLite具有內(nèi)存模式,可以用于快速運(yùn)行測試,而無需實(shí)際數(shù)據(jù)庫操作的開銷,這使它成為測試的理想選擇。
什么時候不能使用SQLite?
- 處理大量數(shù)據(jù):只要磁盤驅(qū)動器和文件系統(tǒng)也支持?jǐn)?shù)據(jù)庫的大小要求,SQLite在技術(shù)上可以支持最大140TB的數(shù)據(jù)庫。然而,SQLite網(wǎng)站建議任何接近1TB的數(shù)據(jù)庫都應(yīng)該放在一個集中式的客戶機(jī)-服務(wù)器數(shù)據(jù)庫中,因?yàn)檫@種大小或更大的SQLite數(shù)據(jù)庫將很難管理。
- 高寫容量:SQLite在任何給定的時間只允許一個寫操作發(fā)生,這極大地限制了它的吞吐量。如果您的應(yīng)用程序需要大量寫操作或多個并發(fā)寫入器,那么SQLite可能無法滿足您的需求。
- 需要網(wǎng)絡(luò)訪問:因?yàn)镾QLite是一個無服務(wù)器數(shù)據(jù)庫,它不提供對其數(shù)據(jù)的直接網(wǎng)絡(luò)訪問。這種訪問內(nèi)置在應(yīng)用程序中。如果SQLite中的數(shù)據(jù)位于與應(yīng)用程序不同的機(jī)器上,它將需要一個高帶寬的引擎到磁盤的網(wǎng)絡(luò)連接。這是一種昂貴且低效的解決方案,在這種情況下,客戶端-服務(wù)器DBMS可能是更好的選擇。
MySQL數(shù)據(jù)庫
根據(jù)DB-Engines排名,從2012年開始跟蹤數(shù)據(jù)庫流行程度以來,MySQL一直是最受歡迎的開源RDBMS。它是一個功能豐富的產(chǎn)品,為世界上許多最大的網(wǎng)站和應(yīng)用程序提供支持,包括阿里巴巴、騰訊、Facebook、Netflix和Spotify。開始使用MySQL是相對簡單的,這在很大程度上要感謝它的詳盡的文檔和大型的開發(fā)者社區(qū),以及豐富的MySQL相關(guān)在線資源。
MySQL的設(shè)計追求的是速度和可靠性,但代價是完全遵循標(biāo)準(zhǔn)SQL。MySQL開發(fā)人員不斷地朝著遵循標(biāo)準(zhǔn)SQL的方向努力,但它仍然落后于其他SQL實(shí)現(xiàn)。然而,它確實(shí)提供了各種SQL模式和擴(kuò)展,使其更接近合規(guī)性。
與使用SQLite的應(yīng)用程序不同,使用MySQL數(shù)據(jù)庫的應(yīng)用程序通過一個單獨(dú)的守護(hù)進(jìn)程訪問它。因?yàn)榉?wù)器進(jìn)程位于數(shù)據(jù)庫和其他應(yīng)用程序之間,所以它可以更好地控制誰有權(quán)訪問數(shù)據(jù)庫。
MySQL激發(fā)了大量的第三方應(yīng)用程序、工具和集成庫,這些應(yīng)用程序、工具和庫擴(kuò)展了MySQL的功能,使其更易于使用。這些更廣泛使用的第三方工具有phpMyAdmin, DBeaver和HeidiSQL。
MySQL支持的數(shù)據(jù)類型
MySQL的數(shù)據(jù)類型可以分為三類:數(shù)值類型、日期和時間類型以及字符串類型。
數(shù)值類型:
數(shù)據(jù)類型 | 說明 |
---|---|
tinyint | 非常小的整數(shù)。這個數(shù)值類型的有符號范圍是-128到127,而無符號范圍是0到255。 |
smallint | 小整數(shù)。此數(shù)值類型的有符號范圍為-32768到32767,而無符號范圍為0到65535。 |
mediumint | 中等大小的整數(shù)。此數(shù)值數(shù)據(jù)類型的有符號范圍為-8388608到8388607,而無符號范圍為0到16777215。 |
int 、integer | 正常大小的整數(shù)。此數(shù)字?jǐn)?shù)據(jù)類型的有符號范圍是-2147483648到2147483647,而無符號范圍是0到4294967295。 |
bigint | 大整數(shù)。此數(shù)字?jǐn)?shù)據(jù)類型的有符號范圍是-9223372036854775808到9223372036854775807,而無符號范圍是0到18446744073709551615。 |
float | 小(單精度)浮點(diǎn)數(shù)。 |
double 、double precision 、real | 正常大小(雙精度)浮點(diǎn)數(shù)。 |
dec 、decimal 、fixed 、numeric | 一個壓縮的定點(diǎn)數(shù)。此數(shù)據(jù)類型的條目的顯示長度在創(chuàng)建列時定義,并且每個條目都遵循該長度。 |
bool 、boolean | 布爾值是一種只有兩個可能值的數(shù)據(jù)類型,通常是?true ?或?false ?。 |
bit | 一種位值類型,您可以為其指定每個值的位數(shù),從1到64。 |
日期和時間類型:
數(shù)據(jù)類型 | 說明 |
---|---|
date | 日期,表示為?YYYY-MM-DD ?。 |
datetime | 顯示日期和時間的時間戳,顯示為?YYYY-MM-DD HH:MM:SS ?。 |
timestamp | 時間戳,表示自Unix紀(jì)元(1970年1月1日00:00:00)以來的時間量。 |
time | 一天中的時間,顯示為?HH:MM:SS ?。 |
year | 以2位或4位數(shù)格式表示的年份,默認(rèn)為4位數(shù)。 |
字符串類型:
數(shù)據(jù)類型 | 說明 |
---|---|
char | 固定長度的字符串;這種類型的條目在右邊用空格填充,以在存儲時滿足指定的長度。 |
varchar | 可變長度的字符串。 |
binary | 類似于?char ?類型,但它是指定長度的二進(jìn)制字節(jié)串,而不是非二進(jìn)制字符串。 |
varbinary | 類似于?varchar ?類型,但它是長度可變的二進(jìn)制字節(jié)串,而不是非二進(jìn)制字符串。 |
blob | 最大數(shù)據(jù)長度為65535(2^16 - 1)字節(jié)的二進(jìn)制字符串。 |
tinyblob | 最大數(shù)據(jù)長度為255(2^8 - 1)字節(jié)的?blob ?列。 |
mediumblob | 最大數(shù)據(jù)長度為16777215(2^24 - 1)字節(jié)的?blob ?列。 |
longblob | 最大數(shù)據(jù)長度為4294967295(2^32 - 1)字節(jié)的?blob ?列。 |
text | 最大長度為65535(2^16 - 1)個字符的字符串。 |
tinytext | 最大長度為255(2^8 - 1)個字符的?text ?列。 |
mediumtext | 最大長度為16777215(2^24 - 1)個字符的?text ?列。 |
longtext | 最大長度為4294967295(2^32 - 1)個字符的?text ?列。 |
enum | 枚舉,它是一個字符串對象,從創(chuàng)建表時聲明的值列表中獲取單個值。 |
set | 與枚舉類似,一個字符串對象,可以有零個或多個值,每個值必須從創(chuàng)建表時指定的允許值列表中選擇。 |
MySQL的優(yōu)勢
- 受歡迎程度和易用性:作為世界上最受歡迎的數(shù)據(jù)庫系統(tǒng)之一,不乏有使用MySQL經(jīng)驗(yàn)的數(shù)據(jù)庫管理員。同樣,關(guān)于如何安裝和管理MySQL數(shù)據(jù)庫,有大量的紙質(zhì)文檔和在線文檔。這包括許多第三方工具——如phpMyAdmin——旨在簡化使用數(shù)據(jù)庫的過程。
- 安全性:MySQL安裝了一個腳本,通過設(shè)置安裝的密碼安全級別,定義root用戶的密碼,刪除匿名帳戶,以及刪除默認(rèn)情況下所有用戶都可以訪問的測試數(shù)據(jù)庫,來幫助您提高數(shù)據(jù)庫的安全性。另外,與SQLite不同的是,MySQL支持用戶管理,并允許您在每個用戶的基礎(chǔ)上授予訪問權(quán)限。
- 速度:通過選擇不實(shí)現(xiàn)SQL的某些特性,MySQL開發(fā)人員可以優(yōu)先考慮速度。雖然最近的基準(zhǔn)測試表明,PostgreSQL等其他rdbms在速度方面可以與MySQL相媲美,或者至少接近MySQL,但MySQL仍然被認(rèn)為是一種非??斓臄?shù)據(jù)庫解決方案。
- 復(fù)制:MySQL支持多種不同類型的復(fù)制,通過在兩個或多個主機(jī)之間共享信息來提高可靠性、可用性和容錯性。這對于建立數(shù)據(jù)庫備份解決方案或水平擴(kuò)展數(shù)據(jù)庫很有幫助。
MySQL的缺點(diǎn)
- 已知的限制:因?yàn)镸ySQL的設(shè)計目標(biāo)是速度和易用性,而不是完全符合SQL規(guī)范,所以它在功能上有一定的限制。例如,它缺乏對
FULL JOIN
子句的支持。 - 許可和專有特性:MySQL是一個雙許可的軟件,它有一個免費(fèi)和開源的社區(qū)版本,在GPLv2許可下發(fā)布,還有幾個付費(fèi)的商業(yè)版本,在專有許可下發(fā)布。因此,一些功能和插件只能在專有版本中使用。
- 開發(fā)速度慢:自從MySQL項(xiàng)目在2008年被Sun公司收購,2009年又被Oracle公司收購以來,用戶一直抱怨數(shù)據(jù)庫管理系統(tǒng)的開發(fā)進(jìn)程明顯慢了下來,因?yàn)樯鐓^(qū)不再有機(jī)構(gòu)來快速應(yīng)對問題和實(shí)施更改。
什么時候可以使用MySQL
- 分布式操作:MySQL的復(fù)制支持使其成為分布式數(shù)據(jù)庫設(shè)置的一個很好的選擇,例如primary-secondary或primary-primary架構(gòu)。
- 網(wǎng)站和web應(yīng)用程序:MySQL支持互聯(lián)網(wǎng)上的許多網(wǎng)站和應(yīng)用程序。這在很大程度上要?dú)w功于MySQL數(shù)據(jù)庫的安裝和設(shè)置非常容易,以及從長遠(yuǎn)來看它的整體速度和可擴(kuò)展性。
- 預(yù)期未來增長:MySQL的復(fù)制支持有助于促進(jìn)橫向擴(kuò)展。此外,升級到商業(yè)MySQL產(chǎn)品是一個相對簡單的過程,比如MySQL集群,它支持自動分片(另一種水平擴(kuò)展過程)。
什么時候不能使用MySQL
- 必須符合SQL規(guī)范:因?yàn)镸ySQL沒有嘗試實(shí)現(xiàn)完整的SQL標(biāo)準(zhǔn),所以這個工具不是完全符合SQL規(guī)范的。如果你的用例必須完全遵從甚至接近完全遵從SQL,那么你可能希望使用更完全遵從SQL的DBMS。
- 并發(fā)和大數(shù)據(jù)量:雖然MySQL通常在繁重的讀操作上表現(xiàn)良好,但并發(fā)的讀寫可能會帶來問題。如果你的應(yīng)用程序有很多用戶同時寫入數(shù)據(jù),那么像PostgreSQL這樣的RDBMS可能是更好的選擇。
PostgreSQL
PostgreSQL,也被稱為Postgres,自稱是“世界上最先進(jìn)的開源關(guān)系型數(shù)據(jù)庫”。它的創(chuàng)建目標(biāo)是高度可擴(kuò)展和符合標(biāo)準(zhǔn)。PostgreSQL是一個對象關(guān)系型數(shù)據(jù)庫,這意味著盡管它主要是一個關(guān)系型數(shù)據(jù)庫,但它也包括一些特性,如表繼承和函數(shù)重載,這些特性通常與對象數(shù)據(jù)庫相關(guān)。
Postgres能夠同時高效地處理多個任務(wù),這種特性被稱為并發(fā)。由于它實(shí)現(xiàn)了多版本并發(fā)控制(MVCC,它無需讀鎖就能實(shí)現(xiàn)這一點(diǎn),該實(shí)現(xiàn)確保了事務(wù)的原子性、一致性、隔離性和持久性,也稱為ACID一致性。
PostgreSQL不像MySQL那樣被廣泛使用,但是仍然有一些第三方工具和庫旨在簡化PostgreSQL的使用,包括pgAdmin和Postbird。
PostgreSQL支持的數(shù)據(jù)類型
PostgreSQL支持?jǐn)?shù)字、字符串、日期和時間數(shù)據(jù)類型,如MySQL。此外,它還支持幾何形狀、網(wǎng)絡(luò)地址、Bit串、文本搜索和JSON條目等數(shù)據(jù)類型。
數(shù)字類型:
數(shù)據(jù)類型 | 說明 |
---|---|
bigint | 有符號的8字節(jié)整數(shù)。 |
bigserial | 自動遞增的8字節(jié)整數(shù)。 |
double precision | 8字節(jié)雙精度浮點(diǎn)數(shù)。 |
integer | 有符號的4字節(jié)整數(shù)。 |
numeric 、decimal | 許多可選擇的精度,建議在精確性至關(guān)重要的情況下使用,例如貨幣金額。 |
real | 4字節(jié)單精度浮點(diǎn)數(shù)。 |
smallint | 有符號的2字節(jié)整數(shù)。 |
smallserial | 自動遞增的2字節(jié)整數(shù)。 |
serial | 自動遞增的4字節(jié)整數(shù)。 |
字符類型:
數(shù)據(jù)類型 | 說明 |
---|---|
character | 具有指定的固定長度的字符串。 |
character varying 、varchar | 一種長度可變但有限的字符串。 |
text | 一種長度不受限制的可變字符串。 |
日期和時間類型:
數(shù)據(jù)類型 | 說明 |
---|---|
date | 由日、月和年組成的日歷日期。 |
interval | 時間跨度。 |
time 、time without time zone | 一天中的時間,不包括時區(qū)。 |
time with time zone | 一天中的時間,包括時區(qū)。 |
timestamp 、timestamp without time zone | 日期和時間,不包括時區(qū)。 |
timestamp with time zone | 日期和時間,包括時區(qū)。 |
Geometric types:
數(shù)據(jù)類型 | 說明 |
---|---|
box | 平面上的長方形盒子。 |
circle | 平面上的圓。 |
line | 平面上的無限長線。 |
lseg | 平面上的線段。 |
path | 平面上的幾何路徑。 |
point | 平面上的幾何點(diǎn) |
polygon | 平面上的封閉幾何路徑。 |
網(wǎng)絡(luò)地址類型:
數(shù)據(jù)類型 | 說明 |
---|---|
cidr | IPv4或IPv6網(wǎng)絡(luò)地址。 |
inet | IPv4或IPv6主機(jī)地址。 |
macaddr | 介質(zhì)訪問控制(MAC)地址。 |
位串類型:
數(shù)據(jù)類型 | 說明 |
---|---|
bit | 固定長度的位串。 |
bit varying | 一種可變長度的位串。 |
文本搜索類型:
數(shù)據(jù)類型 | 說明 |
---|---|
tsquery | 文本搜索查詢。 |
tsvector | 文本搜索文檔。 |
JSON類型:
數(shù)據(jù)類型 | 說明 |
---|---|
json | 文本JSON數(shù)據(jù)。 |
jsonb | 分解的二進(jìn)制JSON數(shù)據(jù)。 |
其他數(shù)據(jù)類型:
數(shù)據(jù)類型 | 說明 |
---|---|
boolean | 邏輯布爾值,表示?true ?或?false ?。 |
bytea | 是“byte array”的縮寫,這種類型用于二進(jìn)制數(shù)據(jù)。 |
money | 貨幣數(shù)量 |
pg_lsn | PostgreSQL日志序列號。 |
txid_snapshot | 用戶級事務(wù)ID快照。 |
uuid | 通用唯一標(biāo)識符。 |
xml | XML數(shù)據(jù)。 |
PostgreSQL的優(yōu)勢
- 符合SQL標(biāo)準(zhǔn):與SQLite或MySQL相比,PostgreSQL的目標(biāo)是嚴(yán)格遵循SQL標(biāo)準(zhǔn)。根據(jù)PostgreSQL官方文檔, PostgreSQL支持full core SQL:2011合規(guī)所需的179個特性中的160個,此外還有一長列可選特性。
- 開源和社區(qū)驅(qū)動:PostgreSQL是一個完全開源的項(xiàng)目,它的源代碼是由一個大型的社區(qū)開發(fā)的。類似地,Postgres社區(qū)維護(hù)并貢獻(xiàn)了大量描述如何使用DBMS的在線資源,包括官方文檔、PostgreSQL wiki和各種在線論壇。
- 可擴(kuò)展性:用戶可以通過目錄驅(qū)動操作和動態(tài)加載以編程方式擴(kuò)展PostgreSQL。你可以指定一個目標(biāo)代碼文件,比如一個共享庫,PostgreSQL會根據(jù)需要加載它。
PostgreSQL的缺點(diǎn)
- 內(nèi)存性能:對于每個新的客戶端連接,PostgreSQL都會fork一個新的進(jìn)程。每個新進(jìn)程會分配大約10MB的內(nèi)存,對于有大量連接的數(shù)據(jù)庫來說,內(nèi)存會迅速增加。因此,對于簡單的重讀操作,PostgreSQL的性能通常不如MySQL等其他rdbms。
- 流行度:盡管PostgreSQL近年來被廣泛使用,但在流行度方面一直落后于MySQL。這樣做的一個后果是,可以幫助管理PostgreSQL數(shù)據(jù)庫的第三方工具仍然較少。類似地,與具有MySQL經(jīng)驗(yàn)的數(shù)據(jù)庫管理員相比,具有管理Postgres數(shù)據(jù)庫經(jīng)驗(yàn)的數(shù)據(jù)庫管理員并不多。
什么時候可以使用PostgreSQL
- 數(shù)據(jù)完整性很重要:PostgreSQL自2001年以來就完全遵循ACID規(guī)范,并實(shí)現(xiàn)了多版本貨幣控制以確保數(shù)據(jù)保持一致,這使得它成為數(shù)據(jù)完整性至關(guān)重要的RDBMS的首選。
- 與其他工具的集成:PostgreSQL兼容各種編程語言和平臺。這意味著,如果需要將數(shù)據(jù)庫遷移到另一個操作系統(tǒng)或與特定工具集成,使用PostgreSQL數(shù)據(jù)庫可能比使用其他DBMS更容易。
- 復(fù)雜的操作:Postgres支持利用多個cpu來以更快的速度回答查詢的查詢計劃。這一點(diǎn),再加上它對多個并發(fā)寫入器的強(qiáng)大支持,使它成為數(shù)據(jù)倉庫和在線事務(wù)處理等復(fù)雜操作的絕佳選擇。
什么時候不能使用PostgreSQL
- 速度至關(guān)重要:PostgreSQL在設(shè)計時考慮了可擴(kuò)展性和兼容性,這是以速度為代價的。如果你的項(xiàng)目需要盡可能快的讀取操作,PostgreSQL可能不是最佳的DBMS選擇。
- 簡單設(shè)置:由于Postgres的功能集很大,并且嚴(yán)格遵循標(biāo)準(zhǔn)SQL,因此對于簡單的數(shù)據(jù)庫設(shè)置來說,Postgres可能是多余的。對于讀取量大且要求速度快的操作,MySQL通常是更實(shí)用的選擇。
- 復(fù)雜復(fù)制:盡管PostgreSQL提供了強(qiáng)大的復(fù)制支持,但它仍然是一個相對較新的功能。有些配置——比如primary-primary架構(gòu)——只能通過擴(kuò)展實(shí)現(xiàn)。復(fù)制是MySQL上一個比較成熟的功能,許多用戶認(rèn)為MySQL的復(fù)制更容易實(shí)現(xiàn),特別是那些缺乏必要的數(shù)據(jù)庫和系統(tǒng)管理經(jīng)驗(yàn)的用戶。
總結(jié)
如今,SQLite、MySQL和PostgreSQL是世界上最流行的三個開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。每個都有自己獨(dú)特的功能和限制,并在特定場景中表現(xiàn)出色。在決定使用哪種RDBMS時,有很多變量在起作用,選擇最快的或功能最多的RDBMS很少像選擇那么簡單。下次需要關(guān)系型數(shù)據(jù)庫解決方案時,請務(wù)必深入研究這些工具和其他工具,以找到最適合您需求的工具。