본문 바로가기
C.W.K.
Stream
Lesson 03 of 10 · published

PostgreSQL 배열

~12 min · extensions, arrays

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

짧은 목록을 한 열에

PostgreSQL은 TEXT[], INTEGER[], 필요하다면 JSONB[] 같은 배열 자료형을 정식으로 지원해. 순서가 의미 있고 목록이 작으며 원소 자체에 별도 속성이 없을 때 편해.

포함과 겹침을 직접 묻는다

=은 배열 전체를 비교하고 tags @> ARRAY['red','wool']ARRAY['red'] <@ tags@><@ 포함 관계, tags && ARRAY['red','blue']&&로 하나라도 겹치는지 검사해. unnest()는 원소를 행으로 펼쳐 JOIN과 집계에 쓸 수 있어.

연결 테이블로 바꿀 경계

원소에 created_at, score, owner 같은 속성이 붙거나 목록을 자주 부분 갱신한다면 연결 테이블이 맞아. 배열은 태그와 작은 선호 목록에는 좋지만 독립된 대상을 숨기는 곳은 아니야.

Code

배열 열의 기본 사용법·sql
CREATE TABLE products (
    id   INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    name TEXT NOT NULL,
    tags TEXT[] NOT NULL DEFAULT '{}'
);

INSERT INTO products (name, tags) VALUES
    ('Wool Sweater', ARRAY['red','wool','winter']),
    ('Cotton Tee',   ARRAY['blue','cotton','summer']);

-- 'red' 태그 product 찾기
SELECT * FROM products WHERE 'red' = ANY(tags);
SELECT * FROM products WHERE tags @> ARRAY['red'];

-- 태그 추가 (불변: 새 array 생성)
UPDATE products SET tags = array_append(tags, 'sale') WHERE id = 1;
빠른 포함 여부 조회를 위한 색인·sql
CREATE INDEX products_tags_gin ON products USING gin (tags);

EXPLAIN ANALYZE
SELECT * FROM products WHERE tags @> ARRAY['wool'];
-- products_tags_gin 의 Bitmap Index Scan
집계를 위한 unnest·sql
-- 카탈로그 전체의 top tag
SELECT tag, COUNT(*) AS uses
FROM   products, UNNEST(tags) AS tag
GROUP  BY tag
ORDER  BY uses DESC
LIMIT  10;

External links

Exercise

테이블에 TEXT[] tags 열을 추가하고 행을 넣어. @>&&로 조회한 뒤 GIN 색인을 추가해 EXPLAIN을 비교해. UNNEST로 모든 행의 태그별 사용 횟수도 세어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.