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

SERIAL vs IDENTITY vs UUID

~12 min · schema, keys

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

세 가지 numbering scheme

PostgreSQL 이 PK 자동 생성 세 방법 줘. 동등 아님 — 잘못 고르면 잘못된 trade-off 영원히 상속.

SERIAL — legacy, 새 코드에선 피해

SERIAL 은 원조 'auto-increment integer'. 뒤에서 sequence 만들고 컬럼 default 로 사용. 동작은 하지만 컬럼이 기술적으로 nullable, sequence 가 느슨하게 소유, 유저가 값 silently override 가능. SQL 표준 대체 (IDENTITY) 가 엄격히 더 나음.

IDENTITY — 모던 default

SQL 표준의 정수 자동 생성 방식. GENERATED ALWAYS AS IDENTITY 가 앱 코드의 명시적 ID 삽입 방지. GENERATED BY DEFAULT AS IDENTITY 는 필요할 때 override 허용 (드뭄). Cleaner semantics, cleaner pg_dump 출력, sequence 소유 이상함 없음.

UUID — 전역 유일 식별자

분산 시스템, 공개 API, 여러 소스 데이터 병합에 충돌 없이 안전한 128-bit 식별자. 두 종류 중요: uuidv4() (랜덤; 좋지만 정렬 안 됨), uuidv7() (PG 18+; 타임스탬프 박힘, 정렬됨, B-tree 친화).

고르기

내부 PK: INTEGER GENERATED ALWAYS AS IDENTITY 가 default. 공개 식별자 (URL slug, API token, 유저에게 보이는 거): UUID, 이상적으론 uuidv7(). 실제 스키마 많은 게 둘 다 — JOIN 용 내부 id, 외부 참조용 공개 uuid.

Code

옛 스타일 (SERIAL — 새 코드 회피)·sql
CREATE TABLE items_legacy (
    id   SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);
모던 스타일 (IDENTITY — 권장)·sql
CREATE TABLE items (
    id   INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    name TEXT NOT NULL
);

-- 생성된 값 override (드뭄), OVERRIDING 사용:
INSERT INTO items (id, name)
OVERRIDING SYSTEM VALUE
VALUES (999, 'Special Item');
공개 ID 용 UUID·sql
-- v4: 랜덤; coordination 없이 유일성, 그러나 B-tree locality 나쁨
CREATE TABLE sessions_v4 (
    id   UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id INTEGER NOT NULL
);

-- v7: 시간 정렬; UUID 안전성 + 인덱스 친화 정렬
CREATE TABLE sessions_v7 (
    id   UUID PRIMARY KEY DEFAULT uuidv7(),
    user_id INTEGER NOT NULL
);

External links

Exercise

SERIAL 기반 테이블을 IDENTITY 로 변환. 발견되는 미묘한 행동 차이 문서화 (sequence 소유, dump 포맷, OVERRIDING semantics). 이후 정수 PK 옆에 UUID 컬럼 추가가 storage 비용만큼 가치 있는 때 토론.

Progress

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

댓글 0

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

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