范圍類型

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


范圍類型的簡要說明


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


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


定義電影放映時間范圍


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

int4range:整數范圍

int8rangebigint 的范圍

numrange:數字范圍

tsrange: 不含時區的時間戳范圍

tstzrange:包含時區的時間戳范圍

daterange:日期范圍

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


 


Navicat 17 中創建范圍類型

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



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



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



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



注意到類型名稱是無標題,因為我們還沒有保存定義。這是意料之中的。

點擊保存按鈕后,我們將看到一個另存為對話框,在此我們可以將類型命名為 “runtime_range ”



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



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