본문으로 건너뛰기
데이터베이스 기초집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정규형과 비정규화 판단 미완료 상태