C.W.K.
Stream
Lesson 03 of 10 · published

PostgreSQL 의 Array

~12 min · extensions, arrays

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

First-class array 컬럼

PostgreSQL 이 native array 타입 — TEXT[], INTEGER[], 굳이라면 JSONB[] 까지. Array 가 짧고 거의 안 수정되는 리스트 (순서 중요 + 멤버십 쿼리) 에 좋음.

Array 연산자

  • = 정확한 array 동등.
  • @> 포함: tags @> ARRAY['red','wool'].
  • <@ 포함됨: ARRAY['red'] <@ tags.
  • && 공통 요소 있음: tags && ARRAY['red','blue'].
  • unnest() 가 array 를 join/aggregate 위한 행으로.

Array vs junction 테이블

Array 가 리스트 작고 개념적으로 행의 일부 일 때 join 테이블 절약. 아이템이 자체 속성 가지면 어색해짐 (junction 원함) 또는 리스트 커지면 (insert 마다 array 재작성 = O(n)).

Code

Array 컬럼 기본·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
Aggregation 위한 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 컬럼 추가. 행 insert; @>&& 로 쿼리. GIN 인덱스 추가; EXPLAIN 비교. UNNEST 로 모든 행의 tag-frequency 카운트.

Progress

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

댓글 0

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

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