Blueprint phase
스키마 설계는 콘크리트 붓기 전에 청사진 그리기. 좋은 청사진이 나중 리노베이션 몇 달 절약. 나쁜 거 = 입주 후 배관 재배치.
스키마를 정직하게 유지하는 6 가지 습관
- 먼저 정규화; 측정된 고통에서 비정규화. 모든 entity 자체 테이블; FK 가 연결. 비정규화 (계산된 total, 중복 이름) 는 성능 최적화, 시작점 아님.
- 모든 곳에 snake_case:
users,order_items,created_at. 복수 테이블, 단수 컬럼, FK 는table_id. 일관성이 취향을 이김. - 항상
created_at+updated_at포함 —TIMESTAMPTZ NOT NULL DEFAULT now(). 매 UPDATE 시 updated_at 갱신 트리거 추가. 디버깅, 동기화, audit 에 필요. 지금 추가 안 하면 나중 후회. - 기본 NOT NULL; 예외로 NULL 허용.
- 제약이 문서 — 모든 CHECK, UNIQUE, FK 가 앱이 의지할 룰 인코딩.
- Audit 중요하면 hard delete 대신 soft delete —
deleted_at TIMESTAMPTZ추가, non-null deleted_at 행을 쿼리에서 제외. (Default 로 soft delete 안 함; 가치 있을 때만.)
Auto-bumping updated_at 트리거
외워둘 가치 — 대부분 테이블에 이 트리거 쓸 거야.