AI 시대 DB 모델링 & SQL 완벽 마스터4-6 연습 문제
테크타니 LEARN — 섹션 04 · 연습 문제

4-6 연습 문제 — 정규화 직관,
잘못된 설계를 두 직관으로 진단한다

이번 강의에서 배운 두 직관 — "같은 정보 두 번 적지 마라", "한 테이블에 한 종류만" — 을 무기로 잘못된 설계 3개를 직접 진단합니다. 눈으로 읽은 정규화는 금방 흐려지지만, 손으로 직접 진단해본 설계는 머리에 남습니다. 풀어본 뒤에는 AI에게 "이 진단이 맞나" 검증까지 해보세요.

문제3문제 (도전 1 포함)권장 소요15분재료잘못된 설계 3종 + shop DB도구눈 + AI 과외 선생님 (검증용)

이번 연습의 위치

4-1 ~ 4-5 관계·FK·ERD

완료 ✓

4-6 정규화 직관

강의 완료 ✓

4-6 연습 문제

지금 여기

4-7 실무 ERD 분석

진짜 서비스의 ERD

4-8 모델링 종합 실습

섹션 4 마무리 ⭐

AI 과외 선생님 활용법

2-4에서 만든 AI 과외 선생님 세션을 그대로 쓰세요. 막히면 정답이 아니라 힌트만 요청하고 — 다 푼 뒤에는 본인의 진단을 던지며 “이 진단이 맞나 검증해줘” 라고 물어보세요. 직접 진단하고 → 검증받는 순서가 설계 보는 눈을 만듭니다.

풀기 전에 — 두 직관 복습

이번 강의에서 배운 것

직관 1 — “같은 정보 두 번 적지 마라” · 직관 2 — “한 테이블에 한 종류만”. 아래 세 문제는 전부 이 두 문장만으로 풀립니다.

문제 1. 이 설계 — 어디가 잘못됐나?

다음 테이블 설계를 보고 — 두 직관 중 무엇을 어긴 건지 진단하세요.

진단 대상 — products (잘못된 설계?)
product_idproduct_namepricecategory_idcategory_name
1라운드 티셔츠190001의류
2슬림핏 청바지490001의류
3후드 집업650001의류

질문: 무엇이 문제인가? 어떻게 고쳐야 하나?

정답 보기

문제: 직관 1 위반“같은 정보 두 번 적지 마라”.

  • category_name (의류) 가 category_id = 1 인 모든 상품에 반복 적힘.
  • 카테고리명 의류 → 의류&잡화 로 바꾸려면 — 그 카테고리 상품 8 행 다 고쳐야 함. 한 군데 빼먹으면 사고.

해결: 카테고리명을 categories 테이블 한 곳에만 (shop 의 현재 설계). products 에는 category_id FK 만.

정규화 후 — categories + products
categories
category_id │ category_name
1 │ 의류
 
products (정규화 후)
product_id │ product_name │ price │ category_id
1 │ 라운드 티셔츠 │ 19000 │ 1
 
카테고리명은 categories 한 곳에만 — 수정도 한 곳만

조회 시 JOIN 으로 가져옴:

SELECT
  p.product_name,
  c.category_name
FROM
  products p
JOIN categories c
  ON p.category_id = c.category_id;
우리 DB는 이미 정규화 완료

shop init.sql 이 이미 이렇게 정규화되어 있습니다.

문제 2. 잘못 쪼개진 테이블 진단

다음 설계는 “너무 쪼갰다” 라고 비판받을 수 있어요. 이 설계가 어색한 이유는?

진단 대상 — 4개로 쪼개진 회원 정보
members
member_id │ member_name
 
member_genders (회원별 성별 별도 테이블)
member_id │ gender
 
member_ages (회원별 나이 별도 테이블)
member_id │ age
 
member_joined_at (회원별 가입일 별도 테이블)
member_id │ joined_at

힌트: 직관 2 — “한 테이블에 한 종류만”역방향 으로 너무 갔을 때.

정답 보기

문제: 과잉 분리 — 직관 1 / 2 모두 어기지는 않지만 “실용적이지 못한” 설계.

각각 별도 테이블로 만든 이유가 없음:

  • gender, age, joined_at 모두 회원에 1:1 속하는 정보. “한 회원의 한 성별, 한 나이, 한 가입일” — 분리할 이유 X.
  • 회원 정보 1 회 조회하려고 4 테이블을 JOIN 해야 함 — 비효율.
  • 새 회원 추가 시 4 테이블 모두에 INSERT 필요 — 트랜잭션 부담.

해결: 다시 한 테이블로.

정상 설계 — members 한 테이블
members (정상)
member_id │ member_name │ gender │ age │ joined_at
 
회원의 단순 속성은 회원 테이블에 함께 — JOIN 없이 1회 조회

핵심: 정규화는 “무한히 쪼개라” 가 아닙니다. “같은 정보 두 번 적지 마라”, “한 테이블에 한 종류만” 의 의미는 — 분리해야 “그 자체로 의미 있는 종류” 일 때만.

✕ 단순 속성이라면

함께 둔다

gender 가 회원의 속성 일 때는 함께 둡니다. 한 회원에 1:1로 붙는 정보를 굳이 떼어내면 — JOIN 비용과 INSERT 부담만 늘어납니다.

✓ 독립 엔티티라면

분리한다

단, gender 자체가 마스터 데이터 (예: 회사가 정의한 “성별 카테고리” 가 따로 있다) 일 때는 분리 — 그건 다른 종류입니다.

✓ 규칙

“이 컬럼이 독립적인 엔티티 라면 분리, 단순 속성 이라면 함께.”

문제 3 (도전). 주어진 잘못된 설계 → 어떻게 쪼갤지

다음은 “가입 양식이 그대로 들어간 테이블”. 어떻게 정규화해야 할지 직접 설계해보세요.

진단 대상 — registrations (너무 한 테이블에 다 박음)
registrations
reg_id │ name │ birth_date │ phone │ address
│ course1 │ course2 │ course3
│ course1_teacher │ course2_teacher │ course3_teacher
│ total_fee

문제 상황:

  • 한 학생이 최대 3 강의 수강 (course1, 2, 3 컬럼)
  • 4번째 강의 추가하려면 컬럼 추가 필요 — 유연성 0
  • 강의 정보가 강사명까지 같이 박혀있음

문제: 이 설계를 — 두 직관에 맞게 어떻게 쪼갤까요? 어떤 테이블들이 필요하고 어떤 FK 가?

정답 보기

다음 4 개 테이블로 분리:

근거:

  • students — 학생 정보만 (직관 2)
  • teachers — 강사는 독립 엔티티
  • courses — 강의 정보, 강사 FK
  • enrollments — 학생 ↔ 강의 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 와 비교해보기

AI 에게 “이 잘못된 설계를 정규화해줘” 라고 던지면 거의 비슷한 답이 나옵니다. 본인 답과 비교해보세요.

잘못된 설계 세 개를 두 직관만으로 진단해냈다면 — 이제 실제 서비스들의 ERD 가 이 직관 위에 어떻게 서 있는지 들여다볼 차례입니다.

NEXT LESSON4-7 실무 ERD 분석

쇼핑몰·게시판·SNS — 진짜 서비스의 ERD 를 지금까지 배운 눈으로 분석합니다.

GO ▸ 다음 강의 시작하기