짧은 목록을 한 열에
PostgreSQL은 TEXT[], INTEGER[], 필요하다면 JSONB[] 같은 배열 자료형을 정식으로 지원해. 순서가 의미 있고 목록이 작으며 원소 자체에 별도 속성이 없을 때 편해.
포함과 겹침을 직접 묻는다
=은 배열 전체를 비교하고 tags @> ARRAY['red','wool']와 ARRAY['red'] <@ tags는 @>와 <@ 포함 관계, tags && ARRAY['red','blue']는 &&로 하나라도 겹치는지 검사해. unnest()는 원소를 행으로 펼쳐 JOIN과 집계에 쓸 수 있어.
연결 테이블로 바꿀 경계
원소에 created_at, score, owner 같은 속성이 붙거나 목록을 자주 부분 갱신한다면 연결 테이블이 맞아. 배열은 태그와 작은 선호 목록에는 좋지만 독립된 대상을 숨기는 곳은 아니야.