본문으로 건너뛰기
데이터베이스 기초집LESSON 07

정규화 1~3정규형과 비정규화 판단

난이도초급 → 중급
예상 시간35분
선수지식이전 강의

7강. 정규화 1~3정규형과 비정규화 판단

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

경기 결과 행마다 플레이어 닉네임과 캐릭터 이름을 반복하면 이름을 바꿀 때 일부 행만 수정되는 이상 현상이 생깁니다. 1~3정규형으로 사실의 저장 위치를 정하고 비정규화가 필요한 조건을 분리합니다.

2. 학습 목표

3. 핵심 개념

1NF는 한 칸에 원자값을 두고 반복 그룹을 제거합니다. 2NF는 복합 키 일부에만 의존하는 속성을 분리하고, 3NF는 키가 아닌 속성에 의존하는 속성을 분리합니다. 정규화의 목표는 테이블 수 증가가 아니라 한 사실을 한 장소에 저장하는 것입니다. 비정규화는 조회 비용을 줄이는 대신 중복 동기화 책임을 만듭니다.

4. 단계별 예시

문서 경로: C:\dev\game-ranking-service\docs\database\07-normalization.md

docs/database/07-normalization.md
나쁜 결과 테이블:
(game_id, player_id, player_nickname, character_id, character_name, score)

함수 종속:
player_id → player_nickname
character_id → character_name
(game_id, player_id) → character_id, score

분해:
players(player_id, nickname)
characters(character_id, display_name)
match_results(game_id, player_id, character_id, score)
database/sql/07-normalization-check.sql
-- 중복 이름이 불일치하는지 점검하는 진단 쿼리
SELECT player_id, count(DISTINCT player_nickname) AS nickname_versions
FROM legacy_match_results
GROUP BY player_id
HAVING count(DISTINCT player_nickname) > 1;
PowerShell · 진단만 실행
psql -d game_ranking_dev -f .\database\sql\07-normalization-check.sql

5. 동작 원리

닉네임은 player_id에 의존하므로 경기 참가 사실과 같은 행에 저장할 이유가 없습니다. 분해 후 match_results는 참가 사실만, players는 플레이어 사실만 관리합니다. 과거 당시 닉네임 보존이 요구사항이라면 단순 중복이 아니라 시점 이력이라는 별도 모델로 설계해야 합니다.

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

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

정규화 1~3정규형과 비정규화 판단 미니 퀴즈

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

0 / 2
  1. 문제 1다음 중 “정규화 1~3정규형과 비정규화 판단”의 핵심 요약을 실제 상황에 맞게 적용한 것은 무엇인가요?
  2. 문제 2“정규화 1~3정규형과 비정규화 판단”의 작업 기준으로 ‘정규화를 테이블 쪼개기로 암기’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

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

7강. 정규화 1~3정규형과 비정규화 판단 미완료 상태