范圍類(lèi)型

PostgreSQL 是市場(chǎng)上最靈活的數據庫之一,這已不是什么秘密。事實(shí)上,PostgreSQL 的可擴展性和豐富的功能集使 PostgreSQL 近期已超越 MySQL,成為最受開(kāi)發(fā)人員推崇和最受歡迎的數據庫系統。在這個(gè)使用 Navicat Premium 17 PostgreSQL 創(chuàng )建自定義數據類(lèi)型的系列中,我們已經(jīng)探索了一些選項,包括自定義域、復合類(lèi)型和枚舉類(lèi)型。本周博客的主題是范圍類(lèi)型,當你需要處理連續區間或數值范圍時(shí),范圍類(lèi)型特別有用。


范圍類(lèi)型的簡(jiǎn)要說(shuō)明


PostgreSQL 中的范圍類(lèi)型提供了一種處理連續區間值的方法。因此,一個(gè)范圍可以包括 10 美元到 20 美元之間的所有產(chǎn)品價(jià)格。通過(guò)這些范圍,你可以處理在其范圍內的任何值,從而輕松檢查計劃沖突或價(jià)格匹配等問(wèn)題。在數據庫中,如果需要處理連續的時(shí)間跨度、數字區間或任何其他連續數據,范圍尤其有用。


例如,在一家電影院的數據庫中,你可以使用范圍來(lái)表示放映時(shí)間,確保沒(méi)有兩部電影在同一影院重映?;蛘?,在酒店預訂系統中,范圍可以跟蹤客房空房日期,方便檢查空房沖突。范圍類(lèi)型特別有用,因為PostgreSQL可以處理所有比較和操作這些區間的復雜邏輯,提供內置操作來(lái)檢查范圍之間的重疊、包含和交叉。


定義電影放映時(shí)間范圍


在考慮自定義范圍類(lèi)型之前,我們應該確認下 PostgreSQL 的內置范圍類(lèi)型是否能實(shí)現我們的目標。這些類(lèi)型包括:

int4range:整數范圍

int8rangebigint 的范圍

numrange:數字范圍

tsrange: 不含時(shí)區的時(shí)間戳范圍

tstzrange:包含時(shí)區的時(shí)間戳范圍

daterange:日期范圍

雖然 DVD Rental 數據庫中的電影放映時(shí)間是以整數形式存儲的,但當我們有特定的業(yè)務(wù)需求而內置類(lèi)型又無(wú)法滿(mǎn)足時(shí),創(chuàng )建我們自己的范圍類(lèi)型還是很有意義的。例如,如果我們要跟蹤具有特殊驗證規則的影片放映時(shí)間范圍:


 


Navicat 17 中創(chuàng )建范圍類(lèi)型

定義自定義類(lèi)型的更簡(jiǎn)單方法是使用 Navicat 基于圖形用戶(hù)界面的工具。你可以在 Navicat Premium 17  Navicat for PostgreSQL 17 中找到它們。若要訪(fǎng)問(wèn)類(lèi)型工具,只需單擊主工具欄中的其他,然后從下拉菜單中選擇類(lèi)型



這將彈出對象窗格,我們將看到現有類(lèi)型的列表。若要創(chuàng )建新類(lèi)型,請單擊對象工具欄中新建類(lèi)型項旁邊的箭頭,然后從上下文菜單中選擇范圍項:



范圍類(lèi)型設計器有三個(gè)選項卡:常規、注釋和 SQL 預覽。在常規選項卡上,我們需要提供的主要信息是子類(lèi)型子類(lèi)型差異。我們的類(lèi)型將以 int4 為基礎,如下所示:



在單擊保存按鈕之前,我們可以通過(guò)單擊“SQL 預覽選項卡查看 Navicat 將生成的語(yǔ)句:



注意到類(lèi)型名稱(chēng)是無(wú)標題,因為我們還沒(méi)有保存定義。這是意料之中的。

點(diǎn)擊保存按鈕后,我們將看到一個(gè)另存為對話(huà)框,在此我們可以將類(lèi)型命名為 “runtime_range ”



現在,我們可以像使用其他 PostgreSQL 數據類(lèi)型一樣使用“runtime_range”類(lèi)型。例如,如果我們創(chuàng )建了上面例子中的“film_runtime_categories”表,我們可以從對象類(lèi)型下拉菜單中選擇“typical_runtime”列,將其設置為我們的自定義類(lèi)型:



然后,我們就可以在檢查選項卡上添加字段驗證: