게임 개발자를 향해

정규화(Nomalization) 본문

정보처리기사/2. 데이터 입출력 구현

정규화(Nomalization)

뿌단이 2022. 9. 6. 23:31

1. 정규화

정규화는 테이블의 속성들이 상호 종속적인 관계를 갖는 특성을 이용하여 테이블 무손실 분해하는 과정이다.

정규화의 목적은 가능한 한 중복을 제거하여 삽입,삭제, 갱신 이상의 발생 가능성을 줄이는 것이다.

 

<정규형의 종류>

  • 제1 정규형(1NF; First Nomal Form)
  • 제2 정규형(2NF; Second Nomal Form)
  • 제3 정규형(3NF; Third Nomal Form)
  • BCNP(Boyce - Codd Nomal Form)
  • 제4 정규형(4NF; Fourth Nomal Form)
  • 제5 정규형(5NF; Fifth Nomal Form)

 

<정규화 순서>

제 1 정규형 → 제 2 정규형 → 제 3 정규형 →  BCNP → 제 4 정규형 → 제 5 정규형

 

 

<여기서 Tip!>

이 챕터는 아주아주 중요하다.

문제도 자주 나오기 때문에 무조건 외우고 가자.

 

 

2. 제 1 정규형, 1NF

제 1 정규형은 릴레이션에 속한 모든 속성의 도메인이 원자값으로만 구성되어있는 정규형이다.

 

<여기서 Tip!>

말이 참 어렵다 아래 테이블을 보자.

 

<제 1 정규형에 반하는 테이블>

위 테이블에 이름의 값이 2개가 들어가있다. 

원자값 말 그대로 값이 하나여야 하는 것이다.

이벤트번호 고객아이디 당첨여부 등급 할인률
1001, 1002 apple12 Y, N gold 10%
1002 banana34 Y gold 10%
1001 orange45 N vip 20%
1003 lemon57 Y vip 20%
1001 carrot76 N silver 5%

 

<제 1 정규형으로 정규화된 테이블>

정규화를 해주면 아래와 같이 나타낼 수 있다.

이벤트번호 고객아이디 당첨여부 등급 할인률
1001 apple12 Y gold 10%
1002 apple12 N gold 10%
1002 banana34 Y gold 10%
1001 orange45 N vip 20%
1003 lemon57 Y vip 20%
1001 carrot76 N silver 5%

 

3. 제 2 정규형, 2NF

제 2 정규형은 테이블이 제 1 정규형이고 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족하는 정규형이다.

 

<여기서 Tip!>

말이 차아암 어렵다 아래 테이블을 보자.

 

<제 2 정규형에 반하는 테이블>

이벤트번호 고객아이디 당첨여부 등급 할인률
1001 apple12 Y gold 10%
1002 apple12 N gold 10%
1002 banana34 Y gold 10%
1001 orange45 N vip 20%
1003 lemon57 Y vip 20%
1001 carrot76 N silver 5%

 

일단 완전 함수적 종속을 만들기 위해선 부분 함수적 종속을 없애야 한다.

지금 이 테이블의 기본키는 ( [이벤트번호], [고객아이디] )이다.

부분 함수적 종속은 이 기본키를 구성하는 속성들이 별개로 다른 값을 결정할 수 있음을 의미한다.

 

( [이벤트번호], [고객아이디] ) → 당첨여부

( [이벤트번호][고객아이디] ) → 등급

( [이벤트번호], [고객아이디] ) → 할인률

 

위와 같이 기본키는 나머지 속성을 결정할 수 있다 하지만 오점이 있다.

 

이세돌이 알파고에게 이겼을 때 나온 드립이다.

이 개념은 위 이세돌과 같다.

[등급]과 [할인률]은 사실 [고객아이디]가 결정한 것이지 ( [이벤트번호], [고객아이디] )가 결정한 것이 아니다.

 

[이벤트번호], [고객아이디] 등급 (O)

[이벤트번호], [고객아이디]  할인률 (O)

 

[고객아이디]  등급 (O)

[고객아이디]  할인률 (O)

 

[이벤트번호]  등급 (X)

[이벤트번호]  할인률 (X)

 

 

고객아이디는 등급 할인률의 결정자가 될 수 있지만, 이벤트번호는 등급 할인률과는 전혀 관계가 없다.

이것이 바로 부분 함수적 종속이다.

부분 함수적 종속을 제거하기 위해서는 테이블을 분리하면 된다.

그럼 아래와 같이 분리할 수 있다.

 

 

<고객>

고객아이디 등급 할인률
apple12 gold 10%
apple12 gold 10%
banana34 gold 10%
orange45 vip 20%
lemon57 vip 20%
carrot76 silver 5%

 

<이벤트 참여 테이블>

이벤트번호 고객아이디 당첨여부
1001 apple12 Y
1002 apple12 N
1002 banana34 Y
1001 orange45 N
1003 lemon57 Y
1001 carrot76 N

 

4. 제 3 정규형, 3NF

제 3 정규형은 테이블이 제 2 정규형이고 이행적 함수 종속을 제거하면 된다.

 

<여기서 Tip!>

이행적 함수 종속은 또 뭘까?

제 2정규형에서 다룬 고객 테이블을 보자.

 

<제 3 정규형에 반하는 테이블>

고객아이디 등급 할인률
apple12 gold 10%
apple12 gold 10%
banana34 gold 10%
orange45 vip 20%
lemon57 vip 20%
carrot76 silver 5%

 

[고객 아이디]  [등급]

[등급]  [할인률]

[고객아이디]  [할인률]

 

[고객 아이디]는 [등급]을 결정하고,[등급]은 [할인률]을 결정하는데,[고객아이디도] [할인률]을 결정할 수 있다.

 

"넌 내꺼야. 그러니까 네 물건도 다 내꺼야 ㅇㅋ?" 라는 논리이다.

 

이것도 마찬가지로 테이블을 분리시키면 그만이다.

 

<고객>

고객아이디 등급
apple12 gold
apple12 gold
banana34 gold
orange45 vip
lemon57 vip
carrot76 silver

 

<등급>

등급 할인률
gold 10%
gold 10%
gold 10%
vip 20%
vip 20%
silver 5%

 

주의※

저번 무결성 파트에서 키 무결성을 인지해야 한다.

한 테이블에는 무조건 기본키가 존재해야 한다.

 

5.  보이스/코드 정규형, BCNF

BCNF는 모든 결정자후보키이면 보이스/코드 정규형에 속한다.

반대로 얘기하자면 후보키가 아니면 결정자가 되면 안된다는 것이다.

 

 

<여기서 Tip!>

말이 참 어렵다. 아래 테이블을 보자

 

<보이스/코드에 반하는 "강좌신청" 테이블>

고객아이디 개설강의 담당강사
apple12 기초토익 김갑환
apple12 영어회화 엠마왓슨
orange56 기초토익 테일러조이
lemon74 물리학 아인슈타인

강좌신청 테이블에 [고객아이디], [개설강의]가 기본키이며 담당강사를 결정한다.

하지만 여기서 [담담강사]도 [개설강의]를 결정할 수가 있다.

 

( [고객아이디], [개설강의] )  [담당강사]

[담당강사]  [개설강의]

 

이는 기본키로 지정되지 않은 속성이 다른 속성을 결정하고있다는 것이다.

이는 BCNF에 위반되므로 BCNF로 정규화하려면 어떻게 해야할까?

위반하는 속성을 기본키로 새로운 테이블을 만들어 분리시켜주면 된다.

 

 

<고객 담당강사>

고객아이디 담당강사
apple12 김갑환
apple12 엠마왓슨
orange56 테일러조이
lemon74 아인슈타인

 

<강의담당>

담당강사 개설강의
김갑환 기초토익
엠마왓슨 영어회화
테일러조이 기초토익
아인슈타인 물리학

 

( [고객아이디], [개설강의] )  [담당강사]

[담당강사]  [개설강의]

 

위 구조에서 기본키의 [개설강의]를 [담당강사]로 바꾸어 준다.이후 [담당강사], [개설강의]의 속성을 가진 강의담당 테이블을 만들고, [담당강사]를 기본키로 사용한다.

 

설명을 보면 후보키를 얘기하고 있는데 설명만 보면 기본키를 얘기하는 것 같다.

 

 

6. 제 4 정규형, 4NF

제 4 정규형은 테이블이 BCNF를 만족하면서 다중값 종속(다치종속, MVD; Multi Valued Dependency)을 제거한 정규형이다.

 

7. 제 5 정규형, 5NF

제 5 정규형은 테이블이 제 4 정규형을 만족하면서  조인 종속(JD; Join Dependency)을 제거한 정규형이다.

 

 

<여기서 Tip!>

위 개념을 간단히 하면 이렇다.

아래 과정을 꼭 외워두자.

 

 

[ 비정규 릴레이션 ]

     ↓   ↓   ↓   도메인이 원자값

[ 제 1 정규형 ]

     ↓   ↓   ↓   부분적 함수 종속 제거

[ 제 2 정규형 ]

     ↓   ↓   ↓   이행적 함수 종속 제거

[ 제 3 정규형 ]

     ↓   ↓   ↓   결정자이면서 후보키가 아닌 것 제거

[     BCNF     ]

     ↓   ↓   ↓   다치 종속 제거

[ 제 4 정규형 ]

     ↓   ↓   ↓   조인 종속 제거

[ 제 5 정규형 ]

 

 

정보처리기사에서 정규형은 BCNF까지만 다루고 이후 다치, 조인 종속 제거는 개념에 없다.

DB를 배울 때 4, 5 정규형까지는 잘 만들지 않는다고 했다.

BCNF 까지만 해도 잘 사용할 수 있고 오히려 4, 5 정규형까지 정규화하여 손해볼 수도 있다고 한다. (캐바캐)

 

 

 

 

읽어주셔서 감사합니다!

정처기 화이팅!