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

Normalization — 데이터 중복 피하기

~12 min · normalization, schema, writes

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

각 사실은 한 자리에만

Normalization 은 데이터를 여러 테이블로 쪼개서 각 사실이 정확히 한 번만 저장되게 하는 거야. 반대 — denormalized 데이터 — 는 사실을 여러 row 에 중복해서, 업데이트마다 모든 사본 찾아 바꿔야 함.

blog post + author 두 디자인 비교:

  • Denormalized: posts 테이블에 author_name, author_email, author_bio 컬럼. Alice 가 글 100 개 쓰면 그 정보가 100 번 저장. 이메일 바꾸려면 row 100 개 건드림. 하나 빼먹으면 corrupt 상태.
  • Normalized: postsauthor_id (FK) + 별도 authors 테이블 author 당 한 row. 이메일 바꾸기 = row 한 개.

Normalization 비용 = join (다음 lessons). Denormalization 비용 = 업데이트 anomaly + 저장 낭비. 대부분 앱 데이터는 normalize 먼저, 측정한 read 병목 있을 때만 선별적으로 denormalize.

Principle: Write 위해 normalize, read 위해 denormalize — 단, 측정한 후에만. SQLite 앱에서 미리 denormalize 한 건 보통 query 속도 절약보다 update 버그 비용이 더 들어.

Code

Denormalized — 되긴 하는데 나쁨·sql
CREATE TABLE posts_bad (
  id INTEGER PRIMARY KEY,
  title TEXT NOT NULL,
  author_name  TEXT NOT NULL,    -- 모든 post 마다 반복
  author_email TEXT NOT NULL,    -- 또 반복
  author_bio   TEXT              -- 또
) STRICT;
Normalized — joinable, single source·sql
CREATE TABLE authors (
  id    INTEGER PRIMARY KEY,
  name  TEXT NOT NULL,
  email TEXT NOT NULL UNIQUE,
  bio   TEXT
) STRICT;

CREATE TABLE posts (
  id        INTEGER PRIMARY KEY,
  author_id INTEGER NOT NULL REFERENCES authors(id),
  title     TEXT NOT NULL,
  body      TEXT NOT NULL,
  created_at TEXT NOT NULL DEFAULT (datetime('now'))
) STRICT;

External links

Exercise

Denormalized CSV 하나 (연락처, 주문 export 등 반복 필드 있는 거) 골라. Normalized 2-3 테이블 schema 스케치. 엔티티, PK, FK 관계 식별. 어디서 통제된 denormalization 받을지 (예: 주문 시점 가격 snapshot).

Progress

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

댓글 0

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

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