본문으로 바로가기
728x90
반응형

[MySQL] 48. 정규화(3) -제 2 정규화(2NF)

1. 제 2 정규화 (Second Normal Form)
2. 제 2 정규화의 조건들

3. 시나리오 코드

4. 예시 살펴보기


1. 제 2 정규화 (Second Normal Form)

: 1NF를 만족하며, 모든 비기본 키 속성이 전체 기본 키에 대해 완전 함수적 종속을 가져야 한다.

=> 즉, 기본 키의 일부에만 종속된 속성이 없어야 한다.


2. 제 2 정규화의 조건들

(1) 2NF의 조건을 만족하지 못하는 예시

학생ID 과목코드 과목명 담당교수
1 MAT101 수학 김교수
1 SCI101 과학 이교수
2 MAT101 수학 김교수
2 ENG101 영어 박교수

 

=> 위 테이블에서 과목명/담당교수는 과목 코드에 부분적으로 종속되어 있다.

==> 즉, 학생 ID와는 직접적인 관련이 없기 때문에, 2NF의 조건을 위반하는 데이터의 예시라고 할 수 있다.


3. 시나리오 코드

 

(1) 수강정보 테이블을 생성한다. 

-하지만 이는 부분적 종속을 포함하고 있고, 2NF를 위반하는 데이터의 형태이다.

->이 테이블을 2NF 정규화하려면?

use demo3;

-- 복합키 생성 방법 확인
create table 수강정보(
	학생ID int,
    과목코드 varchar(10),
    과목명 varchar(10),
    담당교수 varchar(10),
    primary key(학생ID,과목코드)
);

desc 수강정보;

 

 

 

(2) 수강정보 테이블을 2NF하기

-기존 수강정보 테이블을 분해해, 부분적 종속성을 제거할 수 있다.

 

-> 1. 학생 수강 정보 테이블: 학생 ID, 과목 코드

-> 2. 과목 정보 테이블: 과목 코드, 과목명, 담당교수

학생 ID 과목코드
1 MAT101
1 SCI101
2 MAT101
2 ENG101

 

과목코드 과목명 담당교수
MAT101 수학 김교수
SCI101 과학 이교수
ENG101 영어 박교수

 

* 학생 수강 정보 테이블(1)은 학생과 수강하는 과목의 관계만을 표현하며, 과목 정보 테이블은 각 과목의 세부 정보를 관리한다. 이런 분해는 각 테이블이 2NF 조건을 만족하게 하고, 데이터 중복을 줄이고 유지보수를 쉽게 할 수 있도록 만든다!

 


4. 예시 살펴보기:

아래의 테이블은 정규화를 만족했을까?

 

(1) 1NF(1정규화): O

(2) 2NF(2정규화): X

 

*정규화의 개념이 헷갈린다면, 하나의 정보를 수정해야 한다고 할 때 여러번 손이 가는지/아닌지를 따져보자.

위의 테이블은 제 1/2 정규화를 만족했을까?

-위의 테이블은 감독 이름/감독 주소가 제목에 부분적으로 종속되어 있어, 제 2정규화를 만족하지 못한다.

-감독의 주소 정보가 반복되어, 데이터 중복 및 업데이트 이상(Anomaly)을 초래할 수 있다. (ex: 감독의 주소가 변경될 경우, 여러 행을 수정해야 하는 문제가 생긴다.)

728x90
반응형