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

SERIAL, IDENTITY, UUID

~12 min · schema, keys

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

자동 번호를 만드는 세 방식

PostgreSQL에는 기본 키 값을 자동으로 만드는 대표적인 선택이 세 가지 있어. 겉으로 비슷해도 표준 준수, 값의 크기, 외부 노출, 색인 지역성이 달라서 처음부터 목적에 맞게 골라야 해.

SERIAL은 기존 스키마를 위한 방식

SERIAL은 뒤에서 시퀀스를 만들고 열의 기본값에 연결하는 오래된 편의 문법이야. 동작은 하지만 생성 규칙이 느슨하고 사용자가 값을 덮어쓸 수 있어. 새 테이블에는 더 분명한 IDENTITY를 우선해.

IDENTITY는 새 정수 키의 기본 선택

GENERATED ALWAYS AS IDENTITY는 SQL 표준 방식이고 임의 삽입을 막아. 필요한 경우에만 GENERATED BY DEFAULT AS IDENTITY로 값을 직접 넣을 수 있게 해. 정수 키는 작아서 JOIN에 유리해.

UUID는 외부와 분산 경계에 강해

UUID는 128비트 식별자라 여러 시스템에서 따로 만들어도 충돌 가능성이 극히 낮아. 무작위 uuidv4()는 색인의 여러 위치에 흩어져 들어가지만, PG 18부터 내장된 uuidv7()은 시간 순서를 품어 B-tree 끝부분에 모여. PG 18 이전에는 확장 기능을 검토해.

목적에 따라 나눠 써

내부 JOIN에는 INTEGER GENERATED ALWAYS AS IDENTITY처럼 작은 키를 쓰고, 외부 URL에는 별도 uuid를 두는 방식도 좋아. 순차 id를 공개하면 외부에서 규모를 짐작하거나 값을 순회할 수 있어. 공개 키라면 가능할 때 uuidv7()을 우선해.

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로 바꾸고 시퀀스 소유 관계, 덤프 형식, OVERRIDING 동작의 차이를 기록해. 이어서 정수 기본 키 옆에 UUID 열을 추가할 가치가 저장 비용보다 커지는 경우를 토론해.

Progress

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

댓글 0

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

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