Складений тип (composite type) - структура з кількох іменованих полів, як рядок таблиці. Кожна таблиця автоматично має однойменний складений тип.
CREATE TYPE address AS (
street text,
city text,
postal_code text
);
CREATE TABLE companies (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name text NOT NULL,
hq address
);
INSERT INTO companies (name, hq) VALUES ('Acme', ROW('Хрещатик, 1', 'Київ', '01001'));
SELECT name, (hq).city FROM companies; -- дужки обов'язкові
Де складені типи справді корисні - функції, що повертають кілька значень:
CREATE FUNCTION order_stats(p_user_id bigint)
RETURNS TABLE (orders_count bigint, total_spent numeric, last_order_at timestamptz)
LANGUAGE sql STABLE AS $$
SELECT count(*), coalesce(sum(total), 0), max(created_at)
FROM orders
WHERE user_id = p_user_id;
$$;
SELECT * FROM order_stats(42);
Рядок таблиці як значення: SELECT u FROM users u повертає весь рядок одним значенням; row_to_json(u) перетворює його на JSON - зручно для API та аудиту.
Чому складені типи в колонках рідкісні:
- Звернення до полів незручне (дужки), ORM майже не підтримують такі колонки.
- Зміна типу (
ALTER TYPE ... ADD ATTRIBUTE) зачіпає всі таблиці, що його використовують. - Індексувати поле можна лише індексом за виразом.
- Для «вкладеної структури» сьогодні частіше беруть
jsonb(гнучкий, добре підтримуваний) або окремі колонки чи таблицю (з обмеженнями й індексами).
Висновок: складені типи - потужний інструмент для функцій і SQL-рівня (повернення результатів, групування значень у запитах), але для моделювання даних у таблицях зазвичай є простіші варіанти.