自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

這些特性,PostgreSQL秒殺其他數(shù)據(jù)庫(kù)

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù) PostgreSQL
你可能會(huì)問(wèn)自己“為什么選擇PostgreSQL ?”開源數(shù)據(jù)庫(kù)我們有好幾種選擇 , 那么PostgreSQL具有哪些其它開源數(shù)據(jù)庫(kù)不具備的特性呢? PostgreSQL 宣稱它是“世界上最先進(jìn)的開源數(shù)據(jù)庫(kù)。”我們將會(huì)給出PostgreSQL這么宣稱的原因。本系列將帶我們一起看看數(shù)據(jù)存儲(chǔ) – 數(shù)據(jù)模型,結(jié)構(gòu),數(shù)據(jù)類型,和大小限制、數(shù)據(jù)操作和檢索。

這些特性,PostgreSQL秒殺其他數(shù)據(jù)庫(kù)

你可能會(huì)問(wèn)自己 “為什么選擇PostgreSQL ?” 開源數(shù)據(jù)庫(kù)我們有好幾種選擇 (本文參考 MySQL, MariaDB 和 Firebird ), 那么PostgreSQL具有哪些其它開源數(shù)據(jù)庫(kù)不具備的特性呢? PostgreSQL宣稱它是 “世界上最先進(jìn)的開源數(shù)據(jù)庫(kù)。” 我們將會(huì)給出PostgreSQL這么宣稱的原因。本系列將帶我們一起看看數(shù)據(jù)存儲(chǔ) – 數(shù)據(jù)模型, 結(jié)構(gòu), 數(shù)據(jù)類型, 和大小限制、數(shù)據(jù)操作和檢索。

數(shù)據(jù)模型

PostgreSQL 不僅僅是關(guān)系型,它也是對(duì)象關(guān)系型,這使它一定程度優(yōu)于其他一些開源數(shù)據(jù)庫(kù),例如 MySQL,MariaDB 和 Firebird。一個(gè)對(duì)象 - 關(guān)系數(shù)據(jù)庫(kù)的一個(gè)基本特征是支持用戶自定義對(duì)象和它的屬性,包括數(shù)據(jù)類型、函數(shù)、操作符,域和索引。這使得 PostgreSQL 非常靈活和健壯,除此之外,復(fù)雜的數(shù)據(jù)結(jié)構(gòu)可以被創(chuàng)建,存儲(chǔ)和檢索,下面的例子可以看到標(biāo)準(zhǔn) RDBMS 不支持的嵌套和復(fù)合結(jié)構(gòu)。

數(shù)據(jù)類型和結(jié)構(gòu)

PostgreSQL 有著廣泛的被支持?jǐn)?shù)據(jù)類型列表,除了 numeric, floating-point, string, boolean 和你能想到的數(shù)據(jù)類型 (并且支持各種選項(xiàng)),PostgreSQL 還引以為傲地支持 uuid, monetary, enumerated, geometric, binary, network address,bit string, text search, xml, json, array, composite 和 range 數(shù)據(jù)類型,以及一些內(nèi)部對(duì)象標(biāo)識(shí)和日志位置類型。公平地說(shuō),MySQL,MariaDB 和 Firebird 在不同程度上支持上面部分?jǐn)?shù)據(jù)類型,但僅僅 PostgreSQL 支持以上全部數(shù)據(jù)類型。

讓我們仔細(xì)看看其中幾個(gè)數(shù)據(jù)類型:

網(wǎng)絡(luò)地址類型

PostgreSQL 提供用于存儲(chǔ)不同網(wǎng)絡(luò)地址的類型, CIDR (Classless Internet Domain Routing) 數(shù)據(jù)類型適合 IPv4 和 IPv6 網(wǎng)絡(luò)地址,CIDR 的一些例子:

  • 192.168.100.128/25
  • 10.1.2.3/32
  • 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128
  • ::ffff:1.2.3.0/128

也可用于網(wǎng)絡(luò)地址存儲(chǔ)的是 INET 數(shù)據(jù)類型, 用于 IPv4 和 IPv6 主機(jī),子網(wǎng)是可選的,MACADDR 數(shù)據(jù)類型用于存儲(chǔ)硬件標(biāo)識(shí)的 MAC 地址,例如 08-00-2b-01-02-03。MySQL 和 MariaDB 提供一些 INET 函數(shù)用于網(wǎng)絡(luò)地址轉(zhuǎn)換,但不直接提供用于存儲(chǔ)網(wǎng)絡(luò)地址的數(shù)據(jù)類型, Firebird 也沒(méi)有網(wǎng)絡(luò)地址類型。

多維數(shù)組

因?yàn)?PostgreSQL 是對(duì)象關(guān)系數(shù)據(jù)庫(kù),數(shù)組的元素可以存儲(chǔ)大多數(shù)現(xiàn)有的數(shù)據(jù)類型,通過(guò)將方括號(hào)附加到使用數(shù)組類型的字段后就能定義數(shù)組,可以指定數(shù)組大小,但不是必需的。讓我們通過(guò)一個(gè)假日野餐菜單展示數(shù)組的使用:(譯者注:建表腳本有錯(cuò)誤,創(chuàng)建表會(huì)報(bào)錯(cuò),作者大概只是展示數(shù)組數(shù)據(jù)類型的使用。)

 

MySQL, MariaDB, 和 Firebird 不具備這種能力,如果想把類似這樣的數(shù)組存儲(chǔ)在傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)中,替代的解決方法是為數(shù)組值每一行創(chuàng)建單獨(dú)的表。

幾何類型

地理數(shù)據(jù)正迅速成為很多應(yīng)用程序的核心需求, PostgreSQL 一直支持各種各樣的幾何數(shù)據(jù)類型,如點(diǎn)、線、圓、多邊形。路徑數(shù)據(jù)類型就是其中之一。路徑中包含多個(gè)點(diǎn)序列,可以開放 (開始和結(jié)束點(diǎn)是沒(méi)有連接的) 或封閉 (開始和結(jié)束點(diǎn)連接)。讓我們用一個(gè)徒步旅行的例子作為一個(gè)路徑,在這個(gè)例子中我的徒步旅行路線是循環(huán)的,開始點(diǎn)和結(jié)束點(diǎn)相連,所以我的路徑是閉環(huán)的。坐標(biāo)內(nèi)的圓括號(hào)意味著一個(gè)封閉的路徑而方括號(hào)表示開放的路徑。

 

PostGIS 擴(kuò)展增強(qiáng)了 PostgreSQL 現(xiàn)有的幾何數(shù)據(jù)特性,例如額外的空間類型,函數(shù),操作符和索引,它支持位置特性以及柵格和矢量數(shù)據(jù)數(shù)據(jù)。它還提供了與各種第三方開源和專有的地理空間處理工具的互操作性,例如映射和呈現(xiàn)數(shù)據(jù). 今年一月份我們?yōu)?Compose PostgreSQL 部署提供了 PostGIS:為所有 Compose PostgreSQL 部署的 PostGIS。

注意在 MySQL 5.7.8 和 MariaDB 5.3.3,才添加了支持 OpenGIS 地理信息標(biāo)準(zhǔn)的數(shù)據(jù)類型擴(kuò)展, 這個(gè)版本的 MySQL 和之后的 MariaDB 版本提供了和 類似 PostgreSQL 方便使用的幾何數(shù)據(jù)類型的數(shù)據(jù)類型存儲(chǔ)。 然而,在 MySQL 和 MariaDB,數(shù)據(jù)值必須先使用簡(jiǎn)單的命令轉(zhuǎn)換為幾何格式之后才能插入到表中,F(xiàn)irebird 目前并不提供地理數(shù)據(jù)類型。

JSON 支持

PostgreSQL 的 JSON 支持在 SQL 數(shù)據(jù)庫(kù)中支持非結(jié)構(gòu)化數(shù)據(jù),當(dāng)數(shù)據(jù)結(jié)構(gòu)由于處在開發(fā)中需要靈活性或數(shù)據(jù)對(duì)象包含了未知的字段時(shí)是有用的。

JSON 數(shù)據(jù)類型強(qiáng)制檢查 JSON 有效性,這讓你可以使用專門的 JSON 操作符和 PostgreSQL 提供的內(nèi)置函數(shù)用于查詢和操作數(shù)據(jù)。也可用 JSONB 類型 – JSON 的二進(jìn)制形式,與 JSON 不同的是它刪除了數(shù)據(jù)中的空格,保存對(duì)象的順序不一樣,存儲(chǔ)層面做了優(yōu)化,只有最后一個(gè)重復(fù)的鍵值保留。JSONB 通常是首選的格式因?yàn)樗枰俚目臻g存儲(chǔ)對(duì)象,可以被索引,處理速度更快,因?yàn)樗恍枰唤馕?,要了解更多,?qǐng)查看: Is PostgreSQL Your Next JSON Database?

在 MySQL 5.7.8 和 MariaDB 10.0.1 支持 JSON 對(duì)象, 雖然目前在這些數(shù)據(jù)庫(kù)中有不同的函數(shù)和運(yùn)算符支持 JSON,它們的索引方式與 PostgreSQL 的 JSONB 不同。 Firebird 目前僅支持文本對(duì)象的 JSON。

創(chuàng)新的數(shù)據(jù)類型

如果 PostgreSQL 提供的數(shù)據(jù)類型列表還不夠,您還可以使用 CREATE TYPE 命令創(chuàng)建新的數(shù)據(jù)類型,例如復(fù)合類型,枚舉,范圍等。 這里是一個(gè)創(chuàng)建并且使用新創(chuàng)建的復(fù)合類型的例子。

 

MySQL,MariaDB,和 Firebird 不提供這種強(qiáng)大的功能,因?yàn)樗鼈儾皇敲嫦驅(qū)ο蟮摹?/p>

Data Size

PostgreSQL 可以處理大量的數(shù)據(jù)。下面列出了當(dāng)前的大小限制:

Limit

Value

Maximum Database Size

Unlimited

Maximum Table Size

32 TB

Maximum Row Size

1.6 TB

Maximum Field Size

1 GB

Maximum Rows per Table

Unlimited

Maximum Columns per Table

250 - 1600 depending on column types

Maximum Indexes per Table

Unlimited

在 Compose 平臺(tái)我們會(huì)自動(dòng)部署擴(kuò)展,所以您不必?fù)?dān)心數(shù)據(jù)增長(zhǎng)。但是,正如每位 DBA 知道的,最好警惕容量上的限制,我們建議您在創(chuàng)建表和索引時(shí)遵從常規(guī)性的指導(dǎo)。

相比之下, MySQL 和 MariaDB 行大小限制為 65535 字節(jié),F(xiàn)irebird 宣稱最大行大小為 64KB ,通常數(shù)據(jù)大小被操作系統(tǒng)文件大小限制。因?yàn)?PostgreSQL 可以將表數(shù)據(jù)存儲(chǔ)在多個(gè)小文件,它可以繞過(guò)這個(gè)限制 – 不過(guò)需要注意的是太多的文件可能對(duì)性能造成負(fù)面影響。然而,MySQL 和 MariaDB 確實(shí)比 PostgreSQL 單表支持更多的列 (最多 4096 列,與數(shù)據(jù)類型有關(guān)) 和更大的單表大小,但在罕見(jiàn)的情況下,現(xiàn)有的 PostgreSQL 限制需要被超過(guò)。

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

PostgreSQL 毫無(wú)疑問(wèn)符合 ANSI-SQL:2008 標(biāo)準(zhǔn),完全遵從 ACID (Atomicity, Consistency, Isolation and Durability) ,并且它因穩(wěn)定性和事務(wù)完整性而聞名。它支持的主鍵,約束,外鍵,唯一約束,非空約束,以及其它數(shù)據(jù)完整性特性確保只有合法的數(shù)據(jù)被存儲(chǔ)。

MySQL 和 MariaDB 使用合 InnoDB / XtraDB 存儲(chǔ)引擎可兼容更多的 SQL 標(biāo)準(zhǔn),他們現(xiàn)在為 SQL 模式提供一個(gè) STRICT 選項(xiàng),SQL 模式?jīng)Q定了使用的數(shù)據(jù)檢查方法。然而,基于使用的模式,非法和截?cái)嗟臄?shù)據(jù)可能會(huì)被插入或更新時(shí)創(chuàng)建。這些數(shù)據(jù)庫(kù)現(xiàn)在都不支持檢查約束,外鍵約束也存在許多附加說(shuō)明。此外,數(shù)據(jù)的完整性可能會(huì)大大取決于所選擇的存儲(chǔ)引擎。 MySQL ,MariaDB 長(zhǎng)期側(cè)重于速度和效率甚于遵從完整性和遵從性。

總結(jié)

PostgreSQL 有很多功能。使用一個(gè)對(duì)象 - 關(guān)系模型,它支持復(fù)雜的結(jié)構(gòu)和內(nèi)置的豐富用戶定義的數(shù)據(jù)類型,它提供了廣闊的數(shù)據(jù)容量和可信的數(shù)據(jù)完整性,你可能不需要我這里回顧的所有高級(jí)特性,但由于數(shù)據(jù)需求發(fā)展很快,擁有所有這些毫無(wú)疑問(wèn)具有明顯的好處。

如果 PostgreSQL 不能完全滿足你的需求,或者你更傾向于更多選型, 那么看看我們?cè)?Compose 平臺(tái)提供的 NoSQL 數(shù)據(jù)庫(kù)或其他開源 SQL 數(shù)據(jù)庫(kù),它們每個(gè)都有自己的優(yōu)勢(shì),Compose 堅(jiān)信選擇合適的數(shù)據(jù)庫(kù)為當(dāng)務(wù)之急,作為解決方案,有時(shí)候這也意味著需要選擇多個(gè)數(shù)據(jù)庫(kù)。

準(zhǔn)備好了看更多關(guān)于 PostgreSQL 的內(nèi)容嗎?剛剛我們介紹了存儲(chǔ)數(shù)據(jù),包括數(shù)據(jù)模型、數(shù)據(jù)結(jié)構(gòu)、類型、大小限制,給出了一些 PostgreSQL 為何如此聲稱的理由,接下來(lái)我們將介紹數(shù)據(jù)操作和檢索,包括索引、虛擬表特性和查詢能力。

索引

PostgreSQL 提供其他開源數(shù)據(jù)庫(kù)所不具備的索引功能。PostgreSQL 除了標(biāo)準(zhǔn)索引類型之外,還支持局部、表達(dá)式、GiST、GIN 索引。我們來(lái)看上述這些特殊索引。

局部索引

當(dāng)你僅僅想為一張表的子集添加索引就可以創(chuàng)建局部索引(Partial Indexes),比如某列的值符合一個(gè)特定條件的所有行。這個(gè)有利特性讓你保持合理的索引大小,并達(dá)成提高性能和減少磁盤空間的目標(biāo)。局部索引的一個(gè)關(guān)鍵是被索引的列可以與提供子集約束條件的列不同。比如,你可能只想索引那些支付客戶的帳號(hào)而不包括為內(nèi)部測(cè)試而創(chuàng)建的帳號(hào)。

 

說(shuō)明重要的一點(diǎn),有時(shí)候 MySQL 的局部索引(Partial Indexes 有時(shí)也被翻譯為部分索引)術(shù)語(yǔ)用來(lái)指截取被索引的列值至一定數(shù)量的字節(jié)數(shù),而不是基于一個(gè)條件去限制被索引行的數(shù)量。我們這里描述的局部索引 MySQL 不支持。

表達(dá)式索引

創(chuàng)建表達(dá)式索引用來(lái)索引通過(guò)函數(shù)預(yù)計(jì)算得到的一個(gè)列。這些新值在查詢時(shí)被索引和對(duì)待如同常量,而不是查詢每次運(yùn)行時(shí)需要重新計(jì)算。舉一個(gè)例子,如果你有一個(gè)網(wǎng)頁(yè)點(diǎn)擊日志,采集他們接收的任何格式 URL 點(diǎn)擊,你可能想創(chuàng)建一個(gè)基于小寫的標(biāo)準(zhǔn) URL 的索引(PostgreSQL 是大小寫敏感的,compose.io 和 Compose.io 會(huì)被認(rèn)為是不同的結(jié)果):

 

GIST 和 GIN

GiST(Generalized Search Tree)允許聯(lián)合 B 樹、R 樹和用戶自定義索引類型來(lái)創(chuàng)建擁有先進(jìn)查詢能力的定制索引。GiST 在 PostGIS(從 2015 年 1 月以來(lái)我們所有 PostgreSQL 部署的標(biāo)配)和 OpenFTS(一個(gè)開源全文搜索引擎)中使用。PostgreSQL 也支持 SP-GiST,它允許使數(shù)據(jù)檢索異??焖俚姆謪^(qū)查找索引的創(chuàng)建。

GIN(Generalized Inverted Index)可以索引復(fù)雜數(shù)據(jù)類型。復(fù)雜數(shù)據(jù)類型允許你以不同方式聯(lián)合其他數(shù)據(jù)類型來(lái)創(chuàng)建完全定制化的數(shù)據(jù)類型。查看本系列的 Part I 以概覽復(fù)雜數(shù)據(jù)類型。

創(chuàng)建 GiST 和 GIN 索引的語(yǔ)法是,CREATE INDEX .. ON .. USING GIST|GIN ..。簡(jiǎn)單!在 PostgreSQL 9.5(譯者注:目前處于 beta 2),BRIN(Block Range Index)將被支持。BRIN 允許基于被索引的列將大表打散為一系列范圍。這意味著查詢計(jì)劃只需要掃描查詢所限定的某一個(gè)范圍。此外,范圍索引所需要的磁盤空間大小比標(biāo)準(zhǔn) B 樹索引要小很多。

對(duì)比

我們關(guān)注的其他 SQL 數(shù)據(jù)庫(kù)在表達(dá)式索引上正在縮小差距。在 MySQL 5.7.6,生成列(Generated Column)開始被支持,可以用作表達(dá)式索引。對(duì)于 MariaDB,虛擬列(Virtual Column,也成為生成列或計(jì)算列)在版本 5.2 中開始支持,但僅支持使用內(nèi)置函數(shù)創(chuàng)建列(無(wú)法使用用戶自定義函數(shù))。Firebird 的 2.0 版本,使用計(jì)算列(Computed Column)的表達(dá)式索引開始被支持。然而,這些數(shù)據(jù)庫(kù)不支持局部、GiST 或 GIN 索引。當(dāng)創(chuàng)建索引并希望去分析它們的性能時(shí),別忘記去閱讀 mySidewalk 的 Matt Barr 書寫的技術(shù)文章 Simple Index Checking with PostgreSQL。

虛擬表特性

虛擬表在很多查詢中是必需的。我們對(duì)比過(guò)的所有 SQL 數(shù)據(jù)庫(kù)提供一些虛擬表功能,PostgreSQL 提供了更多。

通用表達(dá)式和遞歸

PostgreSQL 通過(guò) WITH 子句支持通用表表達(dá)式(Common Table Expression,CTE)。我們?cè)诩夹g(shù)文章 PostgreSQL – Series Random and With 中展示過(guò)該特性。通用表表達(dá)式使你在查詢語(yǔ)句以內(nèi)聯(lián)方式創(chuàng)建虛擬表,邏輯上表達(dá)一系列操作的順序,這相比在其他地方使用子查詢創(chuàng)建虛擬表更容易閱讀和保證質(zhì)量。PostgreSQL 中的通用表表達(dá)式可以遞歸使用。這個(gè)方便的功能使你單步遍歷一個(gè)層次結(jié)構(gòu),語(yǔ)句重復(fù)自我引用直到?jīng)]有數(shù)據(jù)被返回。這是一個(gè)遞歸通用表表達(dá)式的例子,在一個(gè)話題分類中標(biāo)識(shí)了層級(jí)、話題、父子關(guān)系: 

 

MySQL 和 MariaDB 不使用 WITH 子句,所以,并不正式支持通用表表達(dá)式。這些數(shù)據(jù)庫(kù)中可以使用子查詢創(chuàng)建衍生表,然而它們并不允許遞歸。Firebird 這方面比 MySQL 和 MariaDB 好,與 PostgreSQL 一樣支持使用 WITH 子句的通用表表達(dá)式并提供遞歸功能。

物化視圖

物化視圖是另一項(xiàng) PostgreSQL 支持的實(shí)用的虛擬表特性。物化視圖就像普通視圖那樣代表一個(gè)經(jīng)常使用的查詢結(jié)果集,只是結(jié)果集像一個(gè)普通表那樣存儲(chǔ)在磁盤上。物化視圖也可以添加索引,不像普通視圖每次請(qǐng)求時(shí)重新生成,物化視圖是及時(shí)的快照。它們只在特定時(shí)刻刷新。這可以極大地加快使用物化視圖的查詢的執(zhí)行速度。無(wú)需在查詢中使用普通視圖或做復(fù)雜表關(guān)聯(lián)或運(yùn)行聚合函數(shù),使用一個(gè)包含所需數(shù)據(jù)在磁盤的物化視圖可以提高效率。當(dāng)你在一個(gè)物化視圖中更新數(shù)據(jù),可以按需使用 REFRESH 命令。這是一個(gè)物化視圖的例子,生成聚合收益數(shù)據(jù):

 

Firebird、MySQL 和 MariaDB 并不支持物化視圖,但可以使用一種變通方案,創(chuàng)建一張普通表并使用存儲(chǔ)過(guò)程或者觸發(fā)器更新它。

查詢能力

PostgreSQL 的查詢功能是豐富的。前面章節(jié)討論了 WITH 子句,現(xiàn)在來(lái)看 SELECT 語(yǔ)句中使用的另外兩個(gè)可選特性。

集合查詢

PostgreSQL 提供 UNION、INTERSECT 和 EXCEPT 子句用于 SELECT 語(yǔ)句之間的交互。UNION 將第二個(gè) SELECT 語(yǔ)句的結(jié)果附加到第一個(gè)。 INTERSECT 返回兩個(gè) SELECT 語(yǔ)句均有的行。EXCEPT 返回第一個(gè) SELECT 語(yǔ)句有而第二個(gè) SELECT 語(yǔ)句沒(méi)有的行。我們看一個(gè)使用 EXCEPT 的例子,該語(yǔ)句返回客戶聯(lián)系信息除非客戶一周內(nèi)已經(jīng)收到并回復(fù)郵件。

 

MySQL、MariaDB 和 Firebird 都支持 UNION,但都不支持 INTERSECT 和 EXCEPT。然而,通過(guò)查詢中的關(guān)聯(lián)以及 EXISTS 條件,可以獲取與 PostgreSQL 相同的結(jié)果集。當(dāng)然,這會(huì)使查詢變得更為復(fù)雜。

窗口函數(shù)

窗口函數(shù)基于結(jié)果集的部分行(一個(gè)子集一個(gè)窗口)運(yùn)行聚合函數(shù),極其有用。實(shí)質(zhì)上,它遍歷與當(dāng)前行有關(guān)的分區(qū)中的所有行,運(yùn)行該函數(shù)。常用函數(shù)包括 ROW_NUMBER()、RANK()、DENSE_RANK() 和 PERCENT_RANK()。關(guān)鍵詞 OVER,與 PARTITION BY 和 ORDER BY 一起,指示使用一個(gè)窗口函數(shù)。舉一個(gè)例子,在下面的章節(jié) “函數(shù)及其他”,我們使用一個(gè)窗口函數(shù) ROW_NUMBER() OVER 來(lái)確定一系列數(shù)值的中位數(shù)。注意 WINDOW 子句并不是必需的,只是用來(lái)創(chuàng)建和命名窗口以幫助保持條理。Firebird、MySQL 和 MariaDB 現(xiàn)階段不支持窗口函數(shù),雖然窗口函數(shù)幾年前就在 Firebird 3 的支持計(jì)劃中宣布。

網(wǎng)絡(luò)地址類型橫向子查詢

在 FROM 子句中關(guān)鍵詞 LATERAL 可以作用于子查詢,允許子查詢和之前創(chuàng)建的其他表或虛擬表之間做交叉引用。查詢語(yǔ)句如此可以更為簡(jiǎn)化。它的工作方式是每一行與交叉引用的表作衡量,這意味著查詢語(yǔ)句執(zhí)行的速度加快。這里是一個(gè)例子,我們想要一個(gè)學(xué)生列表以了解他們最近是否閱讀面向技術(shù)的話題:

 

MySQL、Firebird 和 MariaDB 現(xiàn)階段不支持橫向子查詢(Lateral Subquery)。同樣地,存在變通方案,但是查詢語(yǔ)句將變得更為復(fù)雜。另一件事需要說(shuō)明,MySQL 和 MariaDB 不支持完全外連接,但一個(gè)使用 UNION ALL 的變通方案可以用來(lái)合并兩張表的所有行。

函數(shù)及其他

PostgreSQL 提供健壯的內(nèi)置操作符和函數(shù),包括那些支持本系列 Part I 里特定數(shù)據(jù)類型,但你可以創(chuàng)建自己的操作符和函數(shù)(包括聚合函數(shù)),如同定制的存儲(chǔ)過(guò)程和觸發(fā)器。我們無(wú)法提及所有這些細(xì)節(jié),因?yàn)閮?nèi)容過(guò)多,但我們可以看函數(shù)相關(guān)的兩個(gè)簡(jiǎn)單例子。PostgreSQL 支持 4 種用戶自定義函數(shù):查詢語(yǔ)言、過(guò)程語(yǔ)言、C 語(yǔ)言和內(nèi)部語(yǔ)言。每一種都可以傳入和返回基礎(chǔ)和復(fù)雜類型。注意在 PostgreSQL 中 CREATE FUNCTION 命令不僅可以創(chuàng)建函數(shù)也可以創(chuàng)建存儲(chǔ)過(guò)程。

讓我們看一個(gè)例子,創(chuàng)建一個(gè)返回復(fù)雜類型的函數(shù):

 

這是一個(gè)實(shí)用的定制函數(shù),用來(lái)找到一個(gè)數(shù)值序列中的中位數(shù):

 

我們用來(lái)對(duì)比的其他開源 SQL 數(shù)據(jù)庫(kù)也允許創(chuàng)建自己的函數(shù)、存儲(chǔ)過(guò)程和觸發(fā)器,但它們沒(méi)有 PostgreSQL 提供的那么豐富的數(shù)據(jù)類型和自定義選項(xiàng)。額外的,在 PostgreSQL 你可以創(chuàng)建自己的操作符。其他數(shù)據(jù)庫(kù)并不支持用戶自定義操作符。

語(yǔ)言擴(kuò)展

PostgreSQL 擁有大量的語(yǔ)言擴(kuò)展,一些是發(fā)行版的一部分,更多的是第三方。

在 Compose,我們僅支持可信任的 PostgreSQL 語(yǔ)言擴(kuò)展,以保證你的部署是安全的。我們?cè)诙轮匦轮С?PL/Perl,并在八月支持 PL/v8,一個(gè)基于 Javascript 的過(guò)程語(yǔ)言。這些語(yǔ)言擴(kuò)展,比基于 SQL 的 PL/pgSQL 語(yǔ)言(Compose 的部署同樣可以使用)擁有更多內(nèi)置函數(shù),使你可以創(chuàng)建復(fù)雜腳本來(lái)操作和處理服務(wù)器上的數(shù)據(jù)。

總結(jié)

PostgreSQL 有豐富的內(nèi)置特性和大量的方式可以定制或擴(kuò)展來(lái)滿足需求。另外,它是可靠和成熟的,這是一個(gè)值得任何企業(yè)致力于的數(shù)據(jù)庫(kù)解決方案。即便如此,它仍對(duì)剛起步的開發(fā)項(xiàng)目保持易用性和高效性。我們僅僅涉及了少數(shù) PostgreSQL 不同于其他開源 SQL 數(shù)據(jù)庫(kù)的功能,還有更多的其他功能未涉及(在 9.5 版本還將帶來(lái)更多)。我們希望這兩篇文章能提供一個(gè)為什么選擇 PostgreSQL 的堅(jiān)實(shí)概述。 

責(zé)任編輯:龐桂玉 來(lái)源: ITPUB
相關(guān)推薦

2019-11-20 09:08:46

PostgreSQL數(shù)據(jù)庫(kù)

2011-08-02 15:04:49

2018-05-15 16:33:12

數(shù)據(jù)庫(kù)MySQL 8.0新特性

2024-03-04 10:48:15

PostgreSQL數(shù)據(jù)庫(kù)

2024-04-26 08:42:17

PostgreSQL數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)入導(dǎo)出

2010-05-26 10:15:11

MySQL數(shù)據(jù)庫(kù)

2022-10-12 13:33:25

PostgreSQL數(shù)據(jù)庫(kù)

2010-06-13 10:46:52

MySQL 數(shù)據(jù)庫(kù)

2025-01-10 09:25:10

NOSQL數(shù)據(jù)庫(kù)ACID

2024-07-10 08:00:00

數(shù)據(jù)庫(kù)流式數(shù)據(jù)庫(kù)

2018-04-10 14:36:18

數(shù)據(jù)庫(kù)MySQL優(yōu)化技巧

2010-03-02 15:16:23

Ubuntu Post

2025-04-02 08:30:00

IvorySQLOraclePostgreSQL

2011-03-25 13:08:19

PostgreSQL數(shù)

2017-06-26 08:28:41

PostgreSQL數(shù)據(jù)庫(kù)單機(jī)

2015-06-30 12:53:40

秒殺應(yīng)用MySQL數(shù)據(jù)庫(kù)優(yōu)化

2019-02-15 14:59:09

華為云

2023-11-29 09:53:29

數(shù)據(jù)庫(kù)遷移SQL Server

2020-09-03 11:35:22

SQLiteMySQLPostgreSQL

2011-07-26 14:34:28

openSUSEpostgresql
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)