PostgreSQL在哪些方面勝過了其他開源SQL數據庫(Part I)

這篇文章翻譯自:https://www.compose.io/articles/what-postgresql-has-over-other-open-source-sql-databases/

PostgreSQL宣稱:“這是世界上最高級的開源數據庫。”這篇文章將PostgreSQL與MySQL、MariaDB和Firebird對比,得到PostgreSQL的一些特點。

第一部分主要是存儲數據-模型,結構,類型和大小限制。在第二部分重點放在數據處理和檢索。

數據模型

PostgreSQL不只是關係型的,它是對象關係型。這使得它擁有超越其他開源數據庫的一些優點,比如MySQL,MariaDB和Firebird。

對象關係數據庫的一個基本特徵是支持用戶定義的對象及其行爲,包括數據類型、函數、運算符、域和索引。這使得PostgreSQL非常靈活和強大。在其他方面,可以創建、存儲和檢索複雜的數據結構。在下面的一些例子中你會看到嵌套的複合結構,而標準關係型數據庫是不支持的。

數據類型和結構

還有,PostgreSQL支持數據類型非常廣泛。除了你可能期望的數字、字符串、布爾值和浮點數據類型(以及在這些選項之中的),PostgreSQL還支持UUID、貨幣、枚舉、地理、二進制、網絡地址、位字符串,文本搜索,XML,JSON,數組,複合範圍類型,以及對象識別和日誌定位的一些內部類型。坦白說,MySQL、MariaDB和Firebird各自都不同程度的支持這些類型,但只有PostgreSQL支持他們所有。

讓我們仔細看幾個例子:

網絡地址

PostgreSQL提供了用於存儲不同網絡地址的類型。CIDR(無分類互聯網域間路由)的數據類型遵循IPv4和IPv6網絡地址的慣例。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
也可存儲網絡地址的是INET數據類型,用於所在子網可選的IPv4和IPv6主機地址。數據類型MACADDR可以用來存儲用於硬件識別的MAC地址,比如08-00-2b-01-02-03 。

MySQL和MariaDB有INET函數轉換網絡地址,但不提供本地存儲網絡地址的數據類型。Firebird也沒有網絡地址類型。

多維數組

因爲PostgreSQL是一個對象關係型數據庫,數組的值可以保存爲大部分的現有數據類型。可以通過在列的數據類型定義上加方括號或者使用ARRAY表達式做到。可以指定數組大小,但不是必需的。讓我們看一看節日野餐菜單的例子,用以演示數組的使用:

-- create a table where the values are arrays
CREATETABLE holiday_picnic (  
     holiday varchar(50) -- single value
     sandwich text[], -- array
     side text[] [], -- multi-dimensional array
     dessert text ARRAY, -- array
     beverage text ARRAY[4] -- array of 4 items
);

 -- insert array values into the table
INSERTINTO holiday_picnic VALUES  
     ('Labor Day',
     '{"roast beef","veggie","turkey"}',
     '{
        {"potato salad","green salad","macaroni salad"},
        {"chips","crackers"}
     }',
     '{"fruit cocktail","berry pie","ice cream"}',
     '{"soda","juice","beer","water"}'
     );
MySQL,MariaDB和Firebird都沒有這個能力。想在傳統的關係數據庫中以數組的形式存儲這些值,一個解決方案是創建一個單獨的表,數組中的每個值作爲表的一行。

地理數據

支持地理數據迅速成爲許多應用的核心要求。PostgreSQL一直支持各種地理數據類型,如點、線、圓以及多邊形。PATH數據類型就是其中之一。一個路徑由多個順序點組成,可以是開口的(開始和結束點不連接)或是閉合的(開始和結束點連接)。讓我們用一個徒步旅行的例子作爲一個路徑。在這種情況下,我的遠足路徑是一個環形,所以我的起點和終點是相連的,並且因此我的路徑是閉合的。在座標系下,圓括號表示一個閉合的路徑,而方括號表示一個開口的路徑。

-- create a table for trails
CREATETABLE trails (  
     trail_name varchar(250),
     trail_path path
);

 -- insert a trail into the table
-- where the path is defined by lat-long coordinates
INSERTINTO trails VALUES  
     ('Dool Trail - Creeping Forest Trail Loop',
     ((37.172,-122.22261666667),
     (37.171616666667,-122.22385),
     (37.1735,-122.2236),
     (37.175416666667,-122.223),
     (37.1758,-122.22378333333),
     (37.179466666667,-122.22866666667),
     (37.18395,-122.22675),
     (37.180783333333,-122.22466666667),
     (37.176116666667,-122.2222),
     (37.1753,-122.22293333333),
     (37.173116666667,-122.22281666667)));
The PostGIS extension available for PostgreSQL augments the existing geometric data featues with additional spatial types, functions, operators and indexes. It's location aware and supports both raster and vector data. It also provides for interoperability with a variety of 3rd party open source and proprietary geo-spatial tools for working with, mapping and rendering the data. We rolled PostGIS out for Compose PostgreSQL deployments in January this year: PostGIS for All Compose PostgreSQL Deployments.

PostgreSQL 的POSTGIS擴展補充了現有地理數據的特徵,它提供了額外的空間數據類型、函數、運算符和索引。它能感知位置並支持柵格和矢量數據。它還提供了各種第三方開放源代碼和處理、映射和渲染數據用的專有地理空間工具的互操作性。今年一月我們推出了PostGIS作爲PostgreSQL部署組件:PostGIS for All Compose PostgreSQL Deployments.

注意,在MySQL 5.7.8和MariaDB 5.3.3 以後的版本中,增加了擴展數據類型,以支持地理信息的OpenGIS標準。該版本的MySQL和MariaDB之後的版本中,都提供了類似的數據類型,用以存儲PostgreSQL即時可用的地理數據類型。然而,在MySQL和MariaDB中,數據插入表格之前,必須首先使用簡單的命令將數據值轉換成地理數據形式。Firebird目前不提供地理數據類型。

JSON支持

PostgreSQL的JSON讓你能在一個SQL數據庫使用無模式。當數據結構需要一些靈活性時這個比較有用,因爲數據結構可能在開發中發生變化,或當它不知道數據對象會包含哪些數據字段時。

JSON數據類型強制執行有效的JSON,這樣就可以利用PostgreSQL內建的專用JSON操作符和函數查詢和處理數據。還有一個JSONB類型——JSON去除空格後的二進制形式,不保存對象順序但卻是最佳存儲,而且只保留重複鍵值的最後一個。JSONB通常是首選的格式,因爲該格式下,每個對象所需空間更少,支持索引,不需要重新解析所以處理更快速。 瞭解更多,請參看: PostgreSQL是你的下一個JSON數據庫嗎?

在MySQL 5.7.8和MariaDB10.0.1中,添加了對原生JSON對象支持。儘管這些數據庫中有各種各樣的函數和操作符用於JSON類型,但它們都不是PostgreSQL中JSONB的索引方式。Firebird還沒加入這個隊伍,並且還只支持文本式的JSON對象。

創建一個新類型

而且,即使PostgreSQL有廣泛的現有數據類型列表,但好像還是不夠,你可以使用CREATE TYPE命令創建新的數據類型作爲複合,列舉,範圍和基類型。這裏是創建和查詢一個新的複合類型的例子:

-- create a new composite type called "wine"
CREATETYPE wine AS (  
     wine_vineyard varchar(50),
     wine_type varchar(50),
     wine_year int
);

 -- create a table that uses the composite type "wine"
CREATETABLE pairings (  
     menu_entree varchar(50),
     wine_pairing wine
);

 -- insert data into the table using the ROW expression
INSERTINTO pairings VALUES  
     ('Lobster Tail',ROW('Stag''s Leap','Chardonnay', 2012)),
     ('Elk Medallions',ROW('Rombauer','Cabernet Sauvignon',2012));

 /*
   query from the table using the table column name
   (use parentheses followed by a period
   then the name of the field from the composite type)
 */SELECT (wine_pairing).wine_vineyard, (wine_pairing).wine_type  
FROM pairings  
WHERE menu_entree ='Elk Medallions';  
由於他們不是對象關係型的,MySQL、MariaDB和Firebird都不提供這個強大的功能。

數據規模

PostgreSQL可以處理大量數據。目前發佈的規模限制如下:

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
At Compose we auto-scale your deployment so you don't have to worry when your data grows. But, as every DBA knows, it's good to be wary about extremely large and unlimited capacities. We recommend you let common sense be your guide when creating your tables and performing indexing.

在Compose我們自動擴大您的部署規模,所以你不必擔心數據增長時候的情況。但是,正如每個DBA都知道的,當數據規模非常大,需要無限容量時謹慎總是好的。我們建議您在創建表和執行索引時,還是判斷一下。

相比而言,MySQL和MariaDB都因65535字節的行大小限制而臭名昭著。Firebird也只聲稱了64KB的行最大值。通常,數據規模是由操作系統文件規模限制的。因爲PostgreSQL可以將表存儲在多個較小的文件中,所以它可以繞過這個限制——不過,需要重點注意的是,文件過多可能會對性能產生負面影響。然而,對比PostgreSQL,MySQL和MariaDB確實能在每個表中支持更多的列數(根據數據類型不同最多可達4096),單個表的規模也更大,但在非常情況下,需要跨越現有的PostgreSQL限制。

數據完整性

PostgreSQL是力求符合ANSI-SQL:2008標準,一個完全的ACID(原子性,一致性,隔離性和持久性)的標準,並以其堅實的引用和事務完整性的知名。主鍵,限制以及級聯外鍵,唯一約束,非空約束,條件約束和其他數據完整性特徵,確保只有驗證過的數據才能存儲。

MySQL和MariaDB爲了成爲符合InnoDB / XtraDB存儲引擎的SQL標準做的更多。他們現在提供了一個STRICT選項來使用SQL模式,這決定了數據驗證檢查的習慣;然而,在更新數據時無效或是已被截斷的數據能否插入或創建取決於你使用的模式。這兩個數據庫都不支持條件約束,而且對於外鍵約束也有一系列的警告。此外,數據完整性可能會明顯取決於存儲引擎選擇。MySQL(和MariaDB分支)長期在完整性和規範性上 進行速度和效率上反覆權衡已經不是祕密了。

總結

PostgreSQL有很多功能。由於使用對象關係模型構建,它支持複雜結構和廣泛內建以及用戶自定義的數據類型。它提供了廣泛的數據容量,並保證數據的完整性。對於存儲數據,您可能不需要這裏列舉的所有高級功能,但由於數據需求會快速發展,掌握它毫無疑問是極有好處的。

如果感覺PostgreSQL不符合你的需求比例或者你更喜歡不按規則來,那就看看 我們在Compose提供的NoSQL數據庫 或者是考慮我們所提到的其他開源數據庫吧。他們每個都有各自的優勢。Compose堅決支持爲任務選擇最合適的數據庫…而且有時候,這意味着一個多數據庫的解決方案!

準備好更多地瞭解PostgreSQL了嗎?在本系列的第二部分,我們將看看PostgreSQL的數據處理和檢索功能,包括虛表特性,查詢功能,索引以及語言擴展。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章