각 사실은 한 자리에만
Normalization 은 데이터를 여러 테이블로 쪼개서 각 사실이 정확히 한 번만 저장되게 하는 거야. 반대 — denormalized 데이터 — 는 사실을 여러 row 에 중복해서, 업데이트마다 모든 사본 찾아 바꿔야 함.
blog post + author 두 디자인 비교:
- Denormalized:
posts테이블에author_name,author_email,author_bio컬럼. Alice 가 글 100 개 쓰면 그 정보가 100 번 저장. 이메일 바꾸려면 row 100 개 건드림. 하나 빼먹으면 corrupt 상태. - Normalized:
posts에author_id(FK) + 별도authors테이블 author 당 한 row. 이메일 바꾸기 = row 한 개.
Normalization 비용 = join (다음 lessons). Denormalization 비용 = 업데이트 anomaly + 저장 낭비. 대부분 앱 데이터는 normalize 먼저, 측정한 read 병목 있을 때만 선별적으로 denormalize.
Principle: Write 위해 normalize, read 위해 denormalize — 단, 측정한 후에만. SQLite 앱에서 미리 denormalize 한 건 보통 query 속도 절약보다 update 버그 비용이 더 들어.