코드보다 먼저 청사진을 그려
화면이나 ORM 모델부터 만들기 전에 어떤 대상이 있고 서로 어떤 관계를 맺으며 무엇이 절대 깨지면 안 되는지 적어봐. 스키마는 현재 화면의 모양이 아니라 데이터의 수명을 따라가야 해. 먼저 각 대상을 정규화해 별도 테이블로 두고 외래 키로 연결해. 계산된 합계나 중복 이름 같은 비정규화는 측정된 병목이 생겼을 때만 도입해.
스키마를 정직하게 만드는 6가지 습관
- 테이블은 복수형처럼 한 가지 이름 규칙을 고르고
users,order_items처럼 뜻을 드러내. - 모든 영속 테이블에 안정적인 기본 키를 두고, 생성 시각인
created_at도 빠뜨리지 마. - 자료형과 NOT NULL, CHECK, 외래 키로 업무 규칙을 데이터베이스가 지키게 해.
created_at같은 시각은TIMESTAMPTZ NOT NULL DEFAULT now()처럼 일관되게 저장해.- 아무 테이블에나
table_id같은 모호한 이름을 쓰지 말고 관계를 이름에 드러내. - 삭제 이력이 필요하면
deleted_at TIMESTAMPTZ같은 명시적 정책을 정하고 모든 질의가 따르게 해.
updated_at은 데이터베이스가 갱신하게 해
앱의 모든 쓰기 경로가 updated_at을 기억하길 기대하면 빠뜨리는 순간이 와. 트리거를 이용해 UPDATE 때 자동으로 올리면 하나의 규칙으로 통일할 수 있어. 다만 트리거가 숨은 동작이 되지 않도록 마이그레이션과 문서에서 분명히 밝혀.