4-6 연습 문제 — 정규화 직관,
잘못된 설계를 두 직관으로 진단한다
이번 강의에서 배운 두 직관 — "같은 정보 두 번 적지 마라", "한 테이블에 한 종류만" — 을 무기로 잘못된 설계 3개를 직접 진단합니다. 눈으로 읽은 정규화는 금방 흐려지지만, 손으로 직접 진단해본 설계는 머리에 남습니다. 풀어본 뒤에는 AI에게 "이 진단이 맞나" 검증까지 해보세요.
이번 연습의 위치
완료 ✓
강의 완료 ✓
지금 여기
진짜 서비스의 ERD
섹션 4 마무리 ⭐
2-4에서 만든 AI 과외 선생님 세션을 그대로 쓰세요. 막히면 정답이 아니라 힌트만 요청하고 — 다 푼 뒤에는 본인의 진단을 던지며 “이 진단이 맞나 검증해줘” 라고 물어보세요. 직접 진단하고 → 검증받는 순서가 설계 보는 눈을 만듭니다.
풀기 전에 — 두 직관 복습
직관 1 — “같은 정보 두 번 적지 마라” · 직관 2 — “한 테이블에 한 종류만”. 아래 세 문제는 전부 이 두 문장만으로 풀립니다.
문제 1. 이 설계 — 어디가 잘못됐나?
다음 테이블 설계를 보고 — 두 직관 중 무엇을 어긴 건지 진단하세요.
| product_id | product_name | price | category_id | category_name |
|---|---|---|---|---|
| 1 | 라운드 티셔츠 | 19000 | 1 | 의류 |
| 2 | 슬림핏 청바지 | 49000 | 1 | 의류 |
| 3 | 후드 집업 | 65000 | 1 | 의류 |
| ⋮ | ||||
질문: 무엇이 문제인가? 어떻게 고쳐야 하나?
정답 보기
문제: 직관 1 위반 — “같은 정보 두 번 적지 마라”.
category_name(의류) 가category_id = 1인 모든 상품에 반복 적힘.- 카테고리명 의류 → 의류&잡화 로 바꾸려면 — 그 카테고리 상품 8 행 다 고쳐야 함. 한 군데 빼먹으면 사고.
해결: 카테고리명을 categories 테이블 한 곳에만 (shop 의 현재 설계). products 에는 category_id FK 만.
조회 시 JOIN 으로 가져옴:
SELECT
p.product_name,
c.category_name
FROM
products p
JOIN categories c
ON p.category_id = c.category_id;shop init.sql 이 이미 이렇게 정규화되어 있습니다.
문제 2. 잘못 쪼개진 테이블 진단
다음 설계는 “너무 쪼갰다” 라고 비판받을 수 있어요. 이 설계가 어색한 이유는?
힌트: 직관 2 — “한 테이블에 한 종류만” 의 역방향 으로 너무 갔을 때.
정답 보기
문제: 과잉 분리 — 직관 1 / 2 모두 어기지는 않지만 “실용적이지 못한” 설계.
각각 별도 테이블로 만든 이유가 없음:
gender,age,joined_at모두 회원에 1:1 속하는 정보. “한 회원의 한 성별, 한 나이, 한 가입일” — 분리할 이유 X.- 회원 정보 1 회 조회하려고 4 테이블을 JOIN 해야 함 — 비효율.
- 새 회원 추가 시 4 테이블 모두에 INSERT 필요 — 트랜잭션 부담.
해결: 다시 한 테이블로.
핵심: 정규화는 “무한히 쪼개라” 가 아닙니다. “같은 정보 두 번 적지 마라”, “한 테이블에 한 종류만” 의 의미는 — 분리해야 “그 자체로 의미 있는 종류” 일 때만.
함께 둔다
gender 가 회원의 속성 일 때는 함께 둡니다. 한 회원에 1:1로 붙는 정보를 굳이 떼어내면 — JOIN 비용과 INSERT 부담만 늘어납니다.
분리한다
단, gender 자체가 마스터 데이터 (예: 회사가 정의한 “성별 카테고리” 가 따로 있다) 일 때는 분리 — 그건 다른 종류입니다.
“이 컬럼이 독립적인 엔티티 라면 분리, 단순 속성 이라면 함께.”
문제 3 (도전). 주어진 잘못된 설계 → 어떻게 쪼갤지
다음은 “가입 양식이 그대로 들어간 테이블”. 어떻게 정규화해야 할지 직접 설계해보세요.
문제 상황:
- 한 학생이 최대 3 강의 수강 (course1, 2, 3 컬럼)
- 4번째 강의 추가하려면 컬럼 추가 필요 — 유연성 0
- 강의 정보가 강사명까지 같이 박혀있음
문제: 이 설계를 — 두 직관에 맞게 어떻게 쪼갤까요? 어떤 테이블들이 필요하고 어떤 FK 가?
정답 보기
다음 4 개 테이블로 분리:
근거:
students— 학생 정보만 (직관 2)teachers— 강사는 독립 엔티티courses— 강의 정보, 강사 FKenrollments— 학생 ↔ 강의 N:M 중간 테이블. 수강 강의 N 개 가능 (3개 제한 X)
개선 효과:
- 4 번째 강의도 행 추가만 하면 됨 — 컬럼 변경 X
- 강사 이름 바뀌면
teachers한 곳만 고침 - 총 수업료 계산도 SQL 로:
SELECT SUM(c.fee) FROM enrollments e JOIN courses c USING(course_id) WHERE e.student_id = ?
“X1, X2, X3 같은 반복 컬럼이 보이면 → 거의 항상 별도 테이블로 빼야 한다”
. 컬럼 반복 = 정규화 위반의 강한 신호.
AI 에게 “이 잘못된 설계를 정규화해줘” 라고 던지면 거의 비슷한 답이 나옵니다. 본인 답과 비교해보세요.
잘못된 설계 세 개를 두 직관만으로 진단해냈다면 — 이제 실제 서비스들의 ERD 가 이 직관 위에 어떻게 서 있는지 들여다볼 차례입니다.