본문 바로가기

DataBase

데이터베이스 정규화(Normalization)

데이터베이스 정규화 (NORMALIZATION)

관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화(Normalization)라고 한다.

 

1. 첫번째 정규화(FIRST NORMAL FORM) 1NF

    원자적 데이터를 가진 테이블, PK 컬럼이 있어야함

 

원자적 데이터란?

한 컬럼의 어떤 행에 하나의 데이터만 들어가있어야 함

 

1NF가 아닌 테이블 예)

1. skill 컬럼이 원자적 데이터 형태가 아님

2. PK컬럼이 없음


1NF 특징을 가진 테이블


 

2. 두번째 정규화 (SECOND NORMAL FORM) 2NF

   1NF 조건을 충족시키고, 부분적 함수 의존이 없어야함

 

부분적 함수 의존 (partial functional dependency) 이란?

-키가 아닌 컬럼의 값이 키 컬럼 일부에 종속되지 않아야한다.
-키의 일부가 변경되면 키가 아닌 컬럼이 변경되어야 하면 부분적 함수 의존

 

 

2NF가 아닌 테이블 예)

예를 들어 연세대가 학교 이전으로 주소지가 변경 됐다면?

모든 연세대의 주소지 값을 변경해줘야함 

이게 키가 아닌 컬럼의 값이 키 컬럼 일부에 종속된 케이스!

즉 ! 부분적 함수의존임

 

2NF 특징을 가진 테이블

1. 1NF 충족

2. 부분적 함수의존 없음

위 테이블을 보면 연세대가 이사를 가더라도 왼쪽 테이블에는 아무 영향이 없다.

왼쪽 테이블은 부분적 함수 의존을 하지 않는다.

우측 테이블도 보면 연세대가 이사가도 연세대 인건 변하지 않고 신촌 -> 이사주소로만 바꿔주면 된다.

 

그래서 두 테이블 모두 2NF 충족한 테이블이다.

 

그래서 2NF를 고려해서 만들 때 위 테이블 처럼 기존 1NF 테이블이  두개로 분리가 된다.

 

3. 세번째 정규화 (THIRD NORMAL FORM) 3NF
     2NF 조건을 충족시키고, 이행적 종속이 없어야 함

이행적 종속 (transitive depdendency)이란? 

-  키가 아닌 컬럼이 키가 아닌 다른 컬럼에 의존
-  키가 아닌 컬럼이 변경되면 다른 키가 아닌 컬럼이 변경 되어야 할때

 

이행적 종속의 예시,  3NF 테이블이 아닌 예시

만약 2NF 조건을 만족하고자 인적정보 테이블, 대학정보 테이블 나누었을 때

대학교 이름이 변경된다면 ? (연세대 -> 연세인재대로 변경)

인적 정보 테이블에도 모두 연세인재대로 바뀐 이름으로 전부 수정해줘야 한다.

이렇게 의존된 관계를 이행적 종속 관계라고 한다.

3NF 테이블이 아닌 예시

 

하나씩 뜯어보면

-  키가 아닌 컬럼이 키가 아닌 다른 컬럼에 의존

ㄴ school 컬럼이 키(id)가 아닌 컬럼에 의존(대학정보 테이블의 name 컬럼에 의존)

 

-  키가 아닌 컬럼이 변경되면 다른 키가 아닌 컬럼이 변경 되어야 할때

ㄴ대학정보의 name테이블은 키가 아니고 이 컬럼의 내용이 변경되면

    인적정보 테이블의 키(id)가 아닌 컬럼 즉  school컬럼의 내용이 변경된다.

 

 

3NF 특징을 가진 테이블

1. 2NF 충족

2. 이행적 종속이 없어야 함

3NF 특징의 테이블

두 테이블 모두 2NF를 만족하고

이행적 종속이 없다.

연세대의 이름이 변경되어도 인적정보 테이블에서 학교정보 테이블의 pk 값에 의존하기 때문에 아무 영향이 없다.

 

만약 이런식으로 인적정보 테이블의 school_id가 학교정보 테이블의 id를 참조한다면

외래키(FOREIGN KEY)로 둘을 묶어 참조시켜준다.

https://fuckingjava.tistory.com/102

ㄴ 해당 링크 맨 하단 외래키 참고

 

나중에 조회 할 때에는 JOIN을 이용해 조회 하면된다.

https://fuckingjava.tistory.com/104

ㄴ 해당 링크 참고


자! 여기서 궁금증이 생긴다.

2NF의 부분적 함수 의존이랑 3NF의 이행적 함수 의존이랑 결국 같은 말 아니야 ?!

둘의 차이점을 쉽게 설명하자면 인적정보 테이블을 보면된다.

인적정보 테이블보면 부분적 함수 의존이 없다.

그렇다면 2NF 충족하니깐 3NF 테이블인가? 그것도 아니다.

왜? 아직 이행적 종속이 해결이 안됐으니깐 !

이렇게 생각하면 둘의 차이점이 눈에 잘 들어온다.

 

반응형

'DataBase' 카테고리의 다른 글

서브쿼리 (SubQuery) (Maria DB)  (0) 2023.10.13
JOIN - 테이블 끼리 결합 (Maria DB)  (1) 2023.10.12
DATABASE, SCHMA / Table 생성하기 (Maria DB)  (0) 2023.10.12
Maria DB SQL 쿼리문  (0) 2023.10.06
MYSQL merge into (update, insert)  (0) 2023.05.17