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

기본 키: 모든 행의 영구 이름

~12 min · schema, keys

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

행을 변하지 않는 이름으로 부른다

기본 키는 행 하나를 영구히 가리키는 이름이야. 값이 중복되지 않고 비어 있지 않으며, 다른 테이블의 외래 키가 이 이름을 따라 관계를 맺어. 모든 영속 테이블에는 기본 키가 있어야 해. 정수나 UUID처럼 짧고 색인하기 쉬운 값을 쓰고, 업무 필드 200자를 이어 붙인 합성 값은 피해야 해.

좋은 기본 키의 조건

짧고 안정적이며 업무 의미의 변화에 흔들리지 않아야 해. 이메일, 전화번호, 슬러그처럼 바뀔 수 있는 값은 UNIQUE로 지키되 기본 키로 삼지 않는 편이 좋아. 보통은 GENERATED ALWAYS AS IDENTITY로 만든 대리 키가 이 조건을 가장 단순하게 만족해.

자연 키와 복합 키

나라 코드처럼 정말 변하지 않는 자연 키는 쓸 수 있지만, “절대 안 바뀐다”는 약속을 신중히 검증해야 해. 두 대상의 관계 자체가 행인 연결 테이블에서는 외래 키 2개를 묶은 복합 기본 키가 자연스러워. 별도 대리 키를 더해도 관계 중복을 막는 고유 제약은 남겨야 해. 키 0개인 영속 테이블은 정체성을 다른 곳에 떠넘긴 설계야.

Code

권장 기본값인 대리 기본 키·sql
CREATE TABLE users (
    id    INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    email TEXT UNIQUE NOT NULL,
    name  TEXT NOT NULL
);
연결 테이블의 복합 기본 키·sql
CREATE TABLE course_enrollments (
    student_id INTEGER NOT NULL REFERENCES students(id) ON DELETE CASCADE,
    course_id  INTEGER NOT NULL REFERENCES courses(id)  ON DELETE CASCADE,
    enrolled   DATE NOT NULL DEFAULT CURRENT_DATE,
    PRIMARY KEY (student_id, course_id)
);
공개 ID를 위한 UUID PK·sql
CREATE TABLE api_tokens (
    id         UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id    INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

External links

Exercise

작업해 본 스키마에서 모든 테이블의 기본 키를 확인해. 바뀔 수 있는 필드를 키로 쓴 경우, 기본 키가 없는 경우, 업무 필드를 불필요하게 복합 키로 묶은 경우를 표시하고 한 사례의 수정 마이그레이션을 설계해.

Progress

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

댓글 0

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

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