본문으로 건너뛰기
SQL 기초집LESSON 22

정규화와 좋은 테이블 설계

난이도입문 → 초급
예상 시간30분
선수지식이전 강의

22강. 정규화와 좋은 테이블 설계

1. 이번 강의에서 해결할 문제

한 테이블에 username, region, game time, character를 반복 저장하면 사용자명 변경과 경기 수정 때 여러 행을 고쳐야 합니다. 중복과 갱신 이상을 줄이는 설계를 만듭니다.

2. 학습 목표

3. 핵심 개념

1NF는 열 값의 원자성과 반복 그룹 제거, 2NF는 복합 키 일부에만 의존하는 속성 분리, 3NF는 키가 아닌 속성 사이의 이행 의존 제거에 집중합니다. 정규화는 이론 점수가 아니라 사실의 저장 위치를 하나로 만드는 도구입니다.

4. 단계별 SQL 예시

대상: 잘못된 설계 비교 후 현재 네 테이블 조회, 데이터 변경 없음
파일 경로: C:\dev\game-ranking-db\sql\22-normalization.sql

sql/22-normalization.sql
-- 피해야 할 예: 플레이어와 경기 사실이 매 결과마다 반복됨
-- flat_results(username, region, game_started_at, mode,
-- character_name, score, result)

-- 정규화된 스키마의 책임 확인
SELECT 'players' AS table_name, '플레이어 계정과 지역' AS responsibility
UNION ALL
SELECT 'games', '경기 자체의 시간과 모드'
UNION ALL
SELECT 'match_results', '플레이어와 경기의 관계·결과'
UNION ALL
SELECT 'character_stats', '결과에 속한 캐릭터 전투 지표';

-- 중복 여부 검증
SELECT game_id, player_id, COUNT(*) AS duplicate_count
FROM match_results
GROUP BY game_id, player_id
HAVING COUNT(*) > 1;

PRAGMA foreign_key_check;
PowerShell · 실행 순서
sqlite3 -header -box .\data\game_ranking.db ".read .\sql\22-normalization.sql"
sqlite3 .\data\game_ranking.db ".schema"

5. 쿼리가 동작하는 이유

각 테이블이 한 종류의 사실만 저장하므로 region은 players 한 행에서만 바뀝니다. match_results의 UNIQUE와 외래 키가 관계 중복과 고아 행을 막습니다. 검증 쿼리 결과가 0행이면 중복 조합이 없습니다.

6. 자주 하는 실수와 안전한 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

정규화와 좋은 테이블 설계 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“정규화와 좋은 테이블 설계”의 역할과 의존성을 판단하는 올바른 기준은 무엇인가요?
  2. 문제 2“정규화와 좋은 테이블 설계”에서 ‘성능 이유로 먼저 중복 저장’ 문제가 생겼습니다. 가장 알맞은 진단 또는 대응은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

22강. 정규화와 좋은 테이블 설계 미완료 상태