iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 17
3
Postgresql 的複合資料型態

英文是 Composite Types, 有些時候會用 Row Type 或是 Record.
定義以後,可以讓多個 Table 都使用,這對系統開發來說,善用會有不錯的效率提升.
當然遇到亂改的,也是傳播性的災難.會有災難的,時常是大家都能改,這種不嚴謹的團隊,
災難也不會是因為這種資料型態,是早晚發生的事.

先來看一些簡單的例子

create type typ_191001a as (
  a integer
, b text
, c boolean
, d timestamp
, e jsonb
);

實務上,較少在複合資料型態中,再放 JSON 型態,但也不是不行.
一切應用應該是有彈性,多種選擇,擇優.
一般較常見到是使用基本型態,來組合.例如地址,可以用text
分別存放城市,里鄰,等等來組合.

為了舉例起見,我們再來建立一個.

create type typ_191001b as (
  a integer
, b text
, c boolean
);

當我們建立了 type ,就可以用 :: 

select (2, '測試', true)::typ_191001b;

+------------+
|    row     |
+------------+
| (2,測試,t) |
+------------+

大多是應用在 table 當小夥伴

create table tbl_191001 (
  id int generated always as identity
, val typ_191001b
);

insert into tbl_191001 (val) values
(row(3, '不知火', false)),
(row(4, '野分', false)),
(row(5, '冬月', true));

select *
  from tbl_191001;

+----+--------------+
| id |     val      |
+----+--------------+
|  1 | (3,不知火,f) |
|  2 | (4,野分,f)   |
|  3 | (5,冬月,t)   |
+----+--------------+
(3 rows)

取出裡面的成員

select (val).b
     , (val).c
  from tbl_191001;

+--------+---+
|   b    | c |
+--------+---+
| 不知火 | f |
| 野分   | f |
| 冬月   | t |
+--------+---+

要用 () 將 欄位名稱包住.

還可以用來當組成其他複合資料型態.
例如與 Array 

select unnest(array[(5, '冬月', true)
         ,(3, '不知火', false)]::typ_191001b[])
+--------------+
|    unnest    |
+--------------+
| (5,冬月,t)   |
| (3,不知火,f) |
+--------------+

select ((un.val)::typ_191001b).a
     , (un.val).b
     , (un.val).c
  from (select unnest(array[(5, '冬月', true)
         ,(3, '不知火', false)]::typ_191001b[]) as val) un;

+---+--------+---+
| a |   b    | c |
+---+--------+---+
| 5 | 冬月   | t |
| 3 | 不知火 | f |
+---+--------+---+
(2 rows)

複合型態是 Postgresql 一個很不錯的特色,使用原生資料型態組合,在儲存空間以及存取速度
都有不錯的效率.可以視情況導入使用.



上一篇
Postgresql 的先進資料型態 JSON 與 JSONB
下一篇
Postgresql 的 Domain 型態
系列文
以Postgresql為主,聊聊資料庫.31

1 則留言

我要留言

立即登入留言