포트폴리오를 작성하던 중, 프로젝트를 하며 내가 정규화를 한게 맞나하는 의심이 되어 다시 공부를 하게 됐다.
결론적으로는 정규화가 아닌 DB경량화가 맞았다.
정규화란?
정규화(Normalizaion)
: 테이블 간에 중복된 데이터를 허용하지 않는 것
=> 중복된 데이터를 허용하지 않음으로 무결성 유지 및 DB의 저장 용량 역시 줄일 수 있다
정규화는 단계에 따라 분해되는데 크게 3단계라고 할 수 있다.
1️⃣ [제1 정규화]
: 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것
이름 | 페이보릿 푸드 |
정비창 | 아메, 삼겹살 |
최형양 | 아메, 치킨 |
동솔 | 마라탕 |
신지일 | 떡볶이 |
조정수 | 떡볶이,마라탕 |
나푸운 | 아메, 양고기 |
위와 같이 정비창,최형양,조정수, 나푸운은 여러 개의 최애 음식이 있기에 제 1정규형에 만족하지 않는다.
위의 표를 제1정규화를 거치면 다음과 같다
이름 | 페이보릿 푸드 |
정비창 | 아메 |
정비창 | 삼겹살 |
최형양 | 치킨 |
최형양 | 아메 |
동솔 | 마라탕 |
신지일 | 떡볶이 |
조정수 | 떡볶이 |
조정수 | 마라탕 |
나푸운 | 아메 |
나푸운 | 양고기 |
2️⃣ [제2 정규화]
: 제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것
그럼 완전 함수 종속은 뭔데?
기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미
혹시 까먹었을 분들을 위해, 부분집합은 동물이란 범주를 a로 두고 사슴을 b로 둔다면 b를 a의 부분집합이라고 한다.
이 테이블에서 기본키는 (학생번호, 강좌이름)으로 복합키이다. 그리고 (학생번호, 강좌이름)인 기본키는 성적을 결정하고 있다. (학생번호, 강좌이름) --> (성적)
그런데 여기서 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다. (강좌이름) --> (강의실)
즉, 기본키(학생번호, 강좌이름)의 부분키인 강좌이름이 결정자이기 때문에 위의 테이블의 경우 다음과 같이 기존의 테이블에서 강의실을 분해하여 별도의 테이블로 관리하여 제2 정규형을 만족시킬 수 있다.
3️⃣ [제3 정규화]
: 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
이행적 종속은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미
회원번호 | 담당 업무 | 배급 |
24601 | 빵 만들기 | 85000 |
24602 | 빵 만들기 | 74000 |
24603 | 청소하기 | 20000 |
39045 | 커피만들기 | 15000 |
원래 테이블에서 회원 번호는 담당 업무를 결정하며, 담당 업무는 배급을 결정하고 있다.
그렇기에 이를 (회원번호, 담당 업무) 테이블과 (담당 업무, 배급) 테이블로 분해하면 된다.
이행적 종속 제거의 이유는 제3 정규화를 하기 위함이다.
회원번호를 통해 담당업무를 참조, 담당업무를 통해 배급을 참조하도록 테이블을 분해
회원번호 | 담당 업무 |
24601 | 빵만들기 |
24602 | 빵만들기 |
24603 | 청소하기 |
39045 | 커피만들기 |
담당 업무 | 배급 |
빵 만들기 | 85000 |
빵 만들기 | 74000 |
청소하기 | 20000 |
커피만들기 | 15000 |
4️⃣ BCNF (Boyce-Codd Normal Form) 정규화
: 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것
(= 릴레이션 R이 제 3정규형을 만족하고 모든 결정자가 후보키이어야 한다)
BCNF에 속하는 모든 릴레이션은 제3정규형에 속한다.
하지만, 제3정규형에 속하는 릴레이션이 모든 BCNF에 속하지는 않는다.
BCNF는 제3정규형보다 강력하다고 볼 수 있기에 BCNF를 강한 제3정규형(strong 3NF)이라고 한다.
모든 결정자가 후보키 집합에 속해야 한다는 뜻은, 후보키 집합에 없는 칼럼이 결정자가 되어서는 안 된다는 뜻이다.
위와 같은 테이블을 보자. (학생 번호, 과목)이 기본키로 지도교수를 알 수 있다. 하지만 같은 과목을 다른 교수가 가르칠 수도 있어서 과목-> 지도교수 종속은 성립하지 않는다. 하지만 지도교수가 어떤 과목을 가르치는지는 알 수 있으므로 지도교수-> 과목 종속이 성립한다.
이처럼 후보키 집합이 아닌 칼럼이 결정자가 되어버린 상황을 BCNF를 만족하지 않는다고 한다.
(참고로 위 테이블은 제3 정규형까지는 만족하는 테이블이다 )
BCNF를 만족하기 위해서는 아래와 같이 분해하면 된다.
참고자료 :
https://ko.wikipedia.org/wiki/%EB%B6%80%EB%B6%84%EC%A7%91%ED%95%A9.
참고 서적 : 개념을 콕콕 잡아주는 데이터베이스
'I LEARNED > TIL' 카테고리의 다른 글
[TIL] VirtualBox, VMware에서 Ubuntu 설치 시 버튼 안보일 때 (0) | 2023.04.12 |
---|---|
[TIL] gcc로 C언어 컴파일 (1) | 2023.04.11 |
[TIL] 클래스, 객체, 인스턴스 개념 다시 한 번 보기 (0) | 2022.10.18 |
[TIL] 최종프로젝트 ERD설계 (0) | 2022.10.10 |
[TIL] 참여하기와 게시물2 (1) | 2022.10.10 |
댓글