范圍類型
PostgreSQL 是市場上最靈活的數據庫之一,這已不是什么秘密。事實上,PostgreSQL 的可擴展性和豐富的功能集使 PostgreSQL 近期已超越 MySQL,成為最受開發人員推崇和最受歡迎的數據庫系統。在這個使用 Navicat Premium 17 在 PostgreSQL 創建自定義數據類型的系列中,我們已經探索了一些選項,包括自定義域、復合類型和枚舉類型。本周博客的主題是范圍類型,當你需要處理連續區間或數值范圍時,范圍類型特別有用。
范圍類型的簡要說明
PostgreSQL 中的范圍類型提供了一種處理連續區間值的方法。因此,一個范圍可以包括 10 美元到 20 美元之間的所有產品價格。通過這些范圍,你可以處理在其范圍內的任何值,從而輕松檢查計劃沖突或價格匹配等問題。在數據庫中,如果需要處理連續的時間跨度、數字區間或任何其他連續數據,范圍尤其有用。
例如,在一家電影院的數據庫中,你可以使用范圍來表示放映時間,確保沒有兩部電影在同一影院重映。或者,在酒店預訂系統中,范圍可以跟蹤客房空房日期,方便檢查空房沖突。范圍類型特別有用,因為PostgreSQL可以處理所有比較和操作這些區間的復雜邏輯,提供內置操作來檢查范圍之間的重疊、包含和交叉。
定義電影放映時間范圍
在考慮自定義范圍類型之前,我們應該確認下 PostgreSQL 的內置范圍類型是否能實現我們的目標。這些類型包括:
int4range:整數范圍
int8range:bigint 的范圍
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”列,將其設置為我們的自定義類型:
然后,我們就可以在“檢查”選項卡上添加字段驗證: