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

스키마 설계 습관

~15 min · schema, design

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

Blueprint phase

스키마 설계는 콘크리트 붓기 전에 청사진 그리기. 좋은 청사진이 나중 리노베이션 몇 달 절약. 나쁜 거 = 입주 후 배관 재배치.

스키마를 정직하게 유지하는 6 가지 습관

  1. 먼저 정규화; 측정된 고통에서 비정규화. 모든 entity 자체 테이블; FK 가 연결. 비정규화 (계산된 total, 중복 이름) 는 성능 최적화, 시작점 아님.
  2. 모든 곳에 snake_case: users, order_items, created_at. 복수 테이블, 단수 컬럼, FK 는 table_id. 일관성이 취향을 이김.
  3. 항상 created_at + updated_at 포함TIMESTAMPTZ NOT NULL DEFAULT now(). 매 UPDATE 시 updated_at 갱신 트리거 추가. 디버깅, 동기화, audit 에 필요. 지금 추가 안 하면 나중 후회.
  4. 기본 NOT NULL; 예외로 NULL 허용.
  5. 제약이 문서 — 모든 CHECK, UNIQUE, FK 가 앱이 의지할 룰 인코딩.
  6. Audit 중요하면 hard delete 대신 soft deletedeleted_at TIMESTAMPTZ 추가, non-null deleted_at 행을 쿼리에서 제외. (Default 로 soft delete 안 함; 가치 있을 때만.)

Auto-bumping updated_at 트리거

외워둘 가치 — 대부분 테이블에 이 트리거 쓸 거야.

Code

'항상 이 컬럼들' 템플릿·sql
CREATE TABLE things (
    id         INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    -- ... 비즈니스 컬럼들 ...
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
Auto-bumping updated_at 트리거·sql
CREATE OR REPLACE FUNCTION set_updated_at()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
BEGIN
    NEW.updated_at = now();
    RETURN NEW;
END;
$$;

CREATE TRIGGER things_updated_at
BEFORE UPDATE ON things
FOR EACH ROW EXECUTE FUNCTION set_updated_at();
Soft-delete 패턴·sql
ALTER TABLE things ADD COLUMN deleted_at TIMESTAMPTZ;
CREATE INDEX things_active_idx ON things (id) WHERE deleted_at IS NULL;

-- 앱 컨벤션: view / 재사용 WHERE 에서 삭제 행 필터.
CREATE VIEW active_things AS
  SELECT * FROM things WHERE deleted_at IS NULL;

External links

Exercise

'kanban board' 앱의 풀 스키마 (타입, 제약, 인덱스, FK, 표준 timestamp/trigger 셋업 포함) 스케치: board 가 list 갖고, list 가 card 갖고, card 가 label 갖고 (many-to-many), board 가 여러 member (user) 를 역할과 함께 가짐.

Progress

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

댓글 0

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

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