일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 요구사항 분석
- 정보 은닉
- 클라이언트 서버 패턴
- 정보처리기사
- 데이터 입출력
- baekjoon
- UML
- UML 다이어그램
- 요구사항 확인
- 동적 모델링
- 아키텍처 패턴
- 단계적 분해
- 파이프 필터 패턴
- 알고리즘 문제
- 언리얼엔진 함수
- 데이터베이스
- DBMS
- 기능 모델링
- 브로커 패턴
- UnrealEngine5
- 언리얼엔진5
- 백준
- 마스터 슬레이브 패턴
- 정보처리기사 실기
- C++
- 메타 데이터
- Unreal Engint4
- UnrealEngine
- 정처기
- 팬아웃
- Today
- Total
게임 개발자를 향해
정규화(Nomalization) 본문
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 정규형까지 정규화하여 손해볼 수도 있다고 한다. (캐바캐)

읽어주셔서 감사합니다!
정처기 화이팅!
'정보처리기사 > 2. 데이터 입출력 구현' 카테고리의 다른 글
시스템 카탈로그 (0) | 2022.09.08 |
---|---|
반정규화(Denormalization) (0) | 2022.09.08 |
이상 / 함수적 종속 (0) | 2022.09.06 |
관계대수 및 관계해석 (0) | 2022.09.05 |
관계형 데이터베이스의 제약조건 - 무결성(Integrity) (0) | 2022.09.05 |