이전 포스팅에서 정규화 과정으로 쪼개 놓은 테이블을 사용하기 위해 Join을 사용한다는 것을 알게 되었다. 이전부터 정규화에 대해 알고 있었지만 이렇게 정리를 해놓으면 오래 기억되기 때문에 이번 포스팅에서는 정규화에 대해 알아보려고 한다.
정규화란?
정규화는 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 일컫는다.
정규화 과정을 통해 중복된 데이터를 허용하지 않음으로써 무결성을 유지할 수 있고, 또한 DB의 용량을 줄일 수 있다.
아래 그림은 정규화 과정을 그림으로 나타낸 것이다.
지금부터 1단계씩 알아보도록 하자.
1NF(제1 정규화)
제1 정규화는 테이블의 컬럼이 원자값을 갖도록 테이블을 분해하는 것이다. 즉, 아래와 같은 경우를 말할 수 있다.
이름 | 취미 |
김xx | 야구 |
이xx | 야구, 게임 |
전xx | 게임, 독서 |
박xx | 게임, 영화감상 |
최xx | 골프 |
위 테이블은 설명을 위해 임의로 만든 테이블이다. 테이블의 취미 값을 보면 여러 개의 취미를 가지고 있는 사람이 있는 것을 알 수 있다. 이 경우 제1 정규화를 만족시키지 못하고 있다. 왜냐하면 위에서 말했듯이 테이블의 컬럼이 원자값을 갖도록 테이블을 분해하는 것이라고 설명했다.
그러면 제1 정규화를 적용한 테이블을 보면 무슨 말인지 쉽게 알 것이다.
이름 | 취미 |
김xx | 야구 |
이xx | 야구 |
이xx | 게임 |
전xx | 게임 |
전xx | 독서 |
박xx | 게임 |
박xx | 영화감상 |
최xx | 골프 |
제1 정규화를 적용 전/후를 보면 이름이 중복되지만 취미를 원자값, 즉 하나의 값만 가지도록 해주었다. 이렇게 해주면 제1 정규화를 잘 지켰다고 할 수 있다.
2NF(제2 정규화)
제2 정규화는 제1 정규화를 만족한 테이블에 대해 완전 함수 종속을 만족하도록 하는 과정이다.
완전 함수 종속이란 ?
→ 기본키의 부분 집합이 결정자가 되어서는 안된다는 것이다.
비전공자 입장에서 봤을 때, 글로만 보고는 이해하기가 쉽지 않았다. 그래서 그림으로 이해하는 과정이 필요했다.
우선 아래같은 테이블이 있다고 가정하자.
이 테이블의 기본키는 (학생번호,강좌이름)으로 복합키이다. (학생번호,강좌이름)으로 성적이 결정된다.
그런데 강의실은 강좌이름 하나만 있어도 결정된다. 즉, 복합키 중 학생번호가 없어도 강의실이 결정되기 때문에 기본키의 부분 집합이 결정자가 되어 버린 것이다.
이렇게 되면 완전 함수 종속에 위배되어 제2 정규화를 어기게 되는 것이다.
그래서 위처럼 테이블을 두 개로 나누었다. 수강 테이블은 여전히 (학생번호,강좌이름)이 복합키로 성적을 결정한다. 하지만 강의실 테이블은 강좌이름이 기본키로 강의실을 결정하기 때문에 완전 함수 종속을 지키게 되었다.
여기서 잠깐....
갑자기 복합키에 대해 궁금해졌다. 그래서 복합키에 대해 찾아봤다. 혹시 필자처럼 복합키에 대해 궁금한 분이 있었다면 여기를 참조하면 좋을 것 같다.
복합키란 기본키가 되지 못한 컬럼들을 묶어서 기본키처럼 사용하는 것을 말한다.
수강 테이블을 보면 학생 번호만 있어도 성적을 알 수 있다. 그러면 굳이 복합키를 사용할 필요가 없지 않나?
근데 학생 번호로만 알아낸 성적이 하나가 아니라 여러 개다. 왜냐하면 한 학생이 여러 강좌를 듣기 때문이다.
그래서 이 학생의 어떤 강좌의 데이터를 알아내려면 (학생번호,강좌이름)으로 묶은 복합키를 활용해 성적을 결정하도록 한 것이다.
3NF(제3 정규화)
제3 정규화는 제2 정규화를 만족한 테이블에 대해 이행적 종속을 없앤 것이다.
이행적 종속이란 'A → B' , 'B → C'가 성립하면 'A → C'가 성립하는 것이다.
회원 번호 | 등급 | 할인율 |
101 | VIP | 50% |
201 | GOLD | 40% |
301 | SILVER | 30% |
401 | BRONZE | 15% |
위 테이블은 회원 번호를 알면 등급을 알 수 있다. 그리고 등급을 알면 할인율을 알 수 있고, 결국 회원 번호를 알면 할인율을 알 수 있게 된다.
근데 만약 101 회원의 등급이 GOLD가 되었는데 할인율은 여전히 50%이다. 물론 하나씩 할인율을 변경할 수 있지만 너무 비효율적인 작업이다. 그래서 제3 정규화를 해서 이행적 종속을 없애는 것이다.
제3 정규화를 적용하면 아래처럼 테이블을 나눌 수 있다.
BCNF 정규화
BCNF 정규화란 제3 정규화를 만족한 테이블에 대해 모든 결정자가 후보키가 되도록 하는 것이다.
위 테이블에서 (학생번호,특강이름)이 기본키이고 교수를 결정하고 있다. 그런데 교수는 특강 이름을 결정한다. 여기 문제가 발생하는데 교수는 특강 이름을 결정하는 결정자이지만 후보키가 아니다.
그래서 아래처럼 테이블을 분할할 수 있다.
보통 정규화는 BCNF까지만 하는 경우가 많다. 그 이상 정규화를 하게 되면 다른 문제가 발생할 수 있다.
▽ 도움을 주신 분들
'DataBase' 카테고리의 다른 글
[Oracle] ORA-01008 : not all variables bound (0) | 2023.02.13 |
---|---|
[MariaDB] Truncated incorrect decimal value '' (0) | 2023.02.02 |
[DataBase] 기본 키를 여러 개 설정한다고?? (2) | 2022.09.29 |
[DataBase] RDBMS VS NoSQL (0) | 2022.07.08 |
[DataBase] Join을 왜 써야 하지?(+ Join 종류) (0) | 2022.07.07 |