class_33.sql
2NF를 만족하지 못하는 데이터 예제
학생들이 수강하는 과목과 그 과목의 담당 교수에 대한 정보를 포함하는 테이블을 설계
여기서 pk는 학생ID, 과목코드의 복합 키 이다.
수강 정보 테이블
| 학생ID | 과목코드 | 과목명 | 담당 교수 |
| 1 | MAT101 | 수학 | 김교수 |
| 1 | SCI101 | 과학 | 이교수 |
| 2 | MAT101 | 수학 | 김교수 |
| 2 | ENG101 | 영어 | 박교수 |
위 테이블에서 '과목명'과 '담당 교수'는 과목코드에 부분적으로 종속되어 있습니다.
즉, 학생ID와는 직접 적인 관련이 없습니다.
2NF 문제 해결
2NF를 만족시키기 위해 부분 종속성을 제거해야 합니다.
이를 위해 위 테이블을 분해하여 부분적 종속성을 제거할 수 있습니다.
- 수강 정보 테이블: 학생ID, 과목코드
- 과목 정보 테이블: 과목코드, 과목명, 담당 교수
수강 정보 테이블
| 학생 | 과목코드 |
| 1 | MAT101 |
| 1 | SCI101 |
| 2 | MAT101 |
| 2 | ENG101 |
과목 정보 테이블
| 과목코드 | 과목명 | 담당교수 |
| MAT101 | 수학 | 김교수 |
| SCI101 | 과학 | 이교수 |
| ENG101 | 영어 | 박교수 |
수강 정보 테이블은 학생과 수강하는 과목의 관계만을 표현하며, 과목 정보 테이블은 각 과목의 세부 정보를 관리한다.
이러한 분해는 각 테이블이 2NF를 만족하도록 하며, 데이터 중복을 줄이고 유지보수를 쉽게 할 수 있습니다.
아래 테이블은 정규화를 만족했을까?
결과 도출 : 1NF 는 만족하였다. 하지만 2NF 는 만족하였는가?
| 영화ID | 제목 | 감독 이름 | 감독 주소 | 개봉일 | 장르 |
| 1 | 인셉션 | 크리스토퍼 놀란 | LA 엘름 스트리트 1234번지 | 2010-07-16 | 공상 과학 |
| 2 | 다크 나이트 | 크리스토퍼 놀란 | LA 엘름 스트리트 1234번지 | 2008-07-18 | 액션 |
| 3 | 타이타닉 | 제임스 카메론 | NY 메이플 애비뉴 5678번지 | 1997-12-19 | 로맨스 |
| 4 | 아바타 | 제임스 카메론 | NY 메이플 애비뉴 5678번지 | 2009-12-18 | 공상 과학 |
| 5 | 인터스텔라 | 크리스토퍼 논란 | LA 엘름 스트리트 1234번지 | 2014-11-07 | 공상 과학 |
테이블은 감독 이름과 감독 주소가 제목에 부분적으로 종속되어 있어 2정규화를 만족하지 못한다.
이는 각 감독에 대한 주소 정보가 반복되어 데이터 중복 및 업데이트 이상을 처리할 수 있다.
예를 들어, 감독의 주소가 변경될 경우 여러 행을 수정해야 하는 문제가 발생한다.
2정규화를 만족하도록 테이블을 재설계
1. 영화 테이블 : 영화 관련 정보 저장
2. 감독 테이블 : 감독 관련 정보 저장
영화 테이블
| ID | 영화이름 | 개봉일 | 장르 |
| 1 | 인셉션 | 2010-07-16 | 공상 과학 |
| 2 | 다크 나이트 | 2008-07-18 | 액션 |
| 3 | 타이타닉 | 1997-12-19 | 로맨스 |
| 4 | 아바타 | 2009-12-18 | 공상 과학 |
| 5 | 인터스텔라 | 2014-11-07 | 공상 과학 |


감독 테이블
| ID | 감독이름 | 감독주소 |
| 1 | 크리스토퍼 놀란 | LA 엘름 스트리트 1234번지 |
| 2 | 제임스 카메론 | NY 메이플 애비뉴 5678번지 |


-- 조별 실습코드
-- 영화에 관련된 데이터 베이스를 구축하자.
-- ex) 영화 제목, 개봉연도, 매출액, 평점, 관객수, 배우, 배우이름, 배우의정보, 영화에 누가 출연했는지
-- 영화, 배우, 출연 테이블을 만들어라
테이블
| 영화 제목 | 개봉년도 | 매출액 | 평점 | 관객수 | 배우이름 | 배우나이 | 키 |
| 인셉션 | 2023-04-19 | 32,635,195,500 | 9.5 | 5000000 | 레오나르도 디카프리오 | 49 | 181 |
| 다크나이트 | 2023-11-15 | 47,644,838,000 | 9.65 | 4000000 | 크리스찬 베일 | 50 | 183 |
| 올드보이 | 2013-11-21 | 20,100,000,000 | 9.03 | 3000000 | 최민식 | 62 | 177 |
| 살인의추억 | 2023-11-08 | 68,800,000,000 | 9.3 | 5000000 | 송강호 | 57 | 180 |
| 기생충 | 2023-11-01 | 196,200,000,000 | 9.2 | 10000000 | 박소담 | 32 | 165 |
영화 테이블
| ID | 영화제목 | 매출액 | 평점 | 관객수 |
| 1 | 인셉션 | 32,635,195,500 | 9.5 | 5000000 |
| 2 | 다크나이트 | 47,644,838,000 | 9.65 | 4000000 |
| 3 | 올드보이 | 20,100,000,000 | 9.03 | 3000000 |
| 4 | 살인의추억 | 68,800,000,000 | 9.3 | 5000000 |
| 5 | 기생충 | 196,200,000,000 | 9.2 | 10000000 |
배우 테이블
| ID | 이름 | 나이 | 키 |
| 1 | 레오나르도 디카프리오 | 49 | 181 |
| 2 | 크리스찬 베일 | 50 | 183 |
| 3 | 최민식 | 62 | 177 |
| 4 | 송강호 | 57 | 180 |
| 5 | 박소담 | 32 | 165 |
출연 테이블
| 영화ID | 배우ID | 영화줄거리 |
| 1 | 1 | ABCD |
| 2 | 2 | EEEEFF |
| 3 | 3 | GFGFGF |
| 4 | 4 | BNJGFGHT |
| 5 | 5 | ETRETRFDHD |
'MySQL' 카테고리의 다른 글
| 2024.07.08 MySQL 활용 UNION 연산자 - 13 (미완) (0) | 2024.07.08 |
|---|---|
| 2024.07.08 MySQL 활용 제 3정규형(Third Normal Form, 3NF) - 12 (0) | 2024.07.08 |
| 2024.06.13 MySQL 활용 제 1정규화(First Normal Form, 1NF) (0) | 2024.06.13 |
| 2024.06.13 MySQL활동 서브 쿼리란 (0) | 2024.06.13 |
| 2024.06.12 MySQL 활용 쇼핑몰과 카테고리 2단계 (0) | 2024.06.12 |