세 가지 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.