[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
정규화 문제 정답 | ✅저자: 이유정(박사)
📝 문제 1: 고객 주문 관리 시스템
고객명 | 전화번호 | 주문상품1 | 주문상품2 |
---|---|---|---|
홍길동 | 010-1234-5678 | 키보드 | 마우스 |
이영희 | 010-9876-5432 | 모니터 | (비었음) |
❌ 정규화 전 테이블 (초기 상태) |
1정규형 (1NF) – 반복 컬럼 제거
2정규형 (2NF) – 부분 종속 제거 "고객명 / 전화번호"는 주문상품과 직접 관계 없음 → 따로 분리
3정규형 (3NF) – "이행 종속 제거"
만약 주문상품
이 특정 카테고리
를 가지고 있다면?
✅ 정규화 단계별로 나누기
◽ 1정규형 (1NF) – 반복 컬럼 제거
고객명 | 전화번호 | 주문상품 |
---|---|---|
홍길동 | 010-1234-5678 | 키보드 |
홍길동 | 010-1234-5678 | 마우스 |
이영희 | 010-9876-5432 | 모니터 |
◽ 2정규형 (2NF) – 부분 종속 제거 "고객명 / 전화번호"는 주문상품과 직접 관계 없음 → 따로 분리
고객(Customer)
고객ID | 고객명 | 전화번호 |
---|---|---|
1 | 홍길동 | 010-1234-5678 |
2 | 이영희 | 010-9876-5432 |
주문(Order)
고객ID | 주문상품 |
---|---|
1 | 키보드 |
1 | 마우스 |
2 | 모니터 |
◽ 3정규형 (3NF) – "이행 종속 제거"
만약 주문상품
이 특정 카테고리
를 가지고 있다면?
상품명 | 카테고리 |
---|---|
키보드 | 주변기기 |
마우스 | 주변기기 |
모니터 | 모니터류 |
상품(Product)
상품명 | 카테고리 |
---|---|
키보드 | 주변기기 |
마우스 | 주변기기 |
모니터 | 모니터류 |
주문(Order)
고객ID | 상품명 |
---|---|
1 | 키보드 |
1 | 마우스 |
2 | 모니터 |
📝 문제 2: 회사 프로젝트 관리 시스템
❌ 정규화 전 테이블 (초기 상태)
직원명 | 부서명 | 참여프로젝트1 | 참여프로젝트2 |
---|---|---|---|
김대리 | 마케팅부 | 로고 리뉴얼 | 홈페이지 개선 |
박과장 | 개발부 | 앱 개발 |
1정규형 (1NF)
2정규형 (2NF) 부서명은 직원과만 관련 있음 → 분리 필요 3정규형 (3NF) 프로젝트명이 속한 분야가 있다면 → 이행 종속 제거
◽ 1정규형 (1NF) 원자값만 허용
직원명 | 부서명 | 프로젝트명 |
---|---|---|
김대리 | 마케팅부 | 로고 리뉴얼 |
김대리 | 마케팅부 | 홈페이지 개선 |
박과장 | 개발부 | 앱 개발 |
◽ 2정규형 (2NF) 부분 종속 제거 부서명은 직원과만 관련 있음 → 분리 필요 "프로젝트명과는 상관없는 정보(부서명)는 따로 빼야 해요"
직원 테이블 Employee 직원 정보를 따로 분리
직원ID | 직원명 | 부서명 |
---|---|---|
1 | 김대리 | 마케팅부 |
2 | 박과장 | 개발부 |
참여 테이블 Participation
직원ID | 프로젝트명 |
---|---|
1 | 로고 리뉴얼 |
1 | 홈페이지 개선 |
2 | 앱 개발 |
◽ 3정규형 (3NF) 이행 종속 제거
프로젝트명이 속한 분야가 있다면 → 이행 종속 제거
"직원이 아닌 일반 컬럼에 의존하는 정보도 따로 빼야 해요"
예: 프로젝트명 → 분야
프로젝트와 분야를 따로 테이블로 만듭니다.
프로젝트 테이블 Project
프로젝트명 | 분야 |
---|---|
로고 리뉴얼 | 디자인 |
홈페이지 개선 | 웹 |
앱 개발 | 모바일 |
최종적으로 3개의 테이블로 구성
- 직원 정보 테이블 (Employee)
- 프로젝트 정보 테이블 (Project)
- 직원 참여 테이블 (Participation)