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

Primary Key: 모든 행에 정체성

~12 min · schema, keys

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

행의 영구 정체성

Primary key 는 행의 영구 이름 — 테이블 안 유일, NULL 절대 없음, 이상적으론 절대 안 바뀜. 이게 없으면 다른 테이블에서, 앱에서, 새벽 2 시 디버깅하는 미래의 자기에서 행을 신뢰성 있게 가리킬 수 없어. 모든 테이블이 가져야 함. 예외 없음.

좋은 PK 가 되는 조건

  • 유일. 두 행이 값을 공유 안 함.
  • NULL 아님. 모든 행이 가짐.
  • 불변. 행 만든 후 절대 안 바뀜.
  • compact + 인덱싱 가능. Integer 또는 UUID — 비즈니스 필드 200 자 합성 아님.

Surrogate vs natural key

Natural key = 실세계 데이터 (email, ISBN, phone). Surrogate key = 비즈니스 의미 0 인 시스템 생성값 (auto-increment integer, UUID). Surrogate 선호; email 같은 natural 필드는 UNIQUE 제약으로 유지. 실세계 식별자는 실제로 바뀌고 (사람이 email 바꾸고, ISBN 재발행), PK 바뀌면 모든 FK 참조에 cascade 고통.

Composite primary key

순수 junction 테이블 (many-to-many bridge) 에선 두 FK 의 composite key 가 자연스러운 핏이고 redundant surrogate 컬럼 안 만들어도 됨.

Code

Surrogate PK (권장 default)·sql
CREATE TABLE users (
    id    INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    email TEXT UNIQUE NOT NULL,
    name  TEXT NOT NULL
);
Junction 테이블의 composite PK·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

작업한 어떤 스키마든 모든 테이블의 PK 식별. 룰 어기는 거 (가변 필드 PK, PK 없음, 비즈니스 필드 composite) 표시. 한 위반자에 대해 수정 스키마 변경 스케치.

Progress

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

댓글 0

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

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