에듀테크 프로젝트 대시보드
배열 · ENUM · 도메인
PostgreSQL 만의 편의 타입들입니다. 남용하면 정규화를 해치니 '값의 작은 집합'에만 쓰세요.
CREATE TABLE posts (id int, tags text[]);
INSERT INTO posts VALUES (1, '{python,fastapi}'), (2, ARRAY['db','sql']);
SELECT * FROM posts WHERE 'sql' = ANY(tags); -- 요소 포함
SELECT * FROM posts WHERE tags @> ARRAY['db']; -- 배열 포함
SELECT id, unnest(tags) AS tag FROM posts; -- 행으로 펼치기
SELECT array_length(tags, 1) FROM posts; -- 1-based!-- 배열용 인덱스
CREATE INDEX idx_posts_tags ON posts USING gin (tags);CREATE TYPE order_status AS ENUM ('pending', 'paid', 'shipped', 'done');
CREATE TABLE orders (id int, status order_status NOT NULL DEFAULT 'pending');
SELECT * FROM orders WHERE status < 'shipped'; -- 정의된 순서로 비교됨
ALTER TYPE order_status ADD VALUE 'refunded' AFTER 'done';CREATE DOMAIN email AS text
CHECK (VALUE ~ '^[^@\s]+@[^@\s]+\.[^@\s]+$');
CREATE DOMAIN positive_int AS integer CHECK (VALUE > 0);
CREATE TABLE users (id int, contact email, credits positive_int);도메인은 '제약이 붙은 타입'입니다. 여러 테이블에서 같은 규칙을 재사용할 때 유용합니다.