정규화(Normalization) - 1차 2차 3차 BCNF

2021. 8. 16. 18:24DataBase

정규화

데이터베이스의 설계를 재구성하는 테크닉.

  • 불필요한 데이터(redundancy)제거.
  • 삽입/갱신/삭제 시 발생할 수 있는 각종 이상현상(Anamolies)들을 방지.
  • "논리적"로 데이터를 저장 - 데이터 테이블의 구성이 논리적이고 직관적


 


기본키: 관계형 DataBase에서 레코드의 식별자로 이용하기에 적합한 것

후보키: 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합

결정자: relation에서 다른 attribute를 고유하게 결정하는 attribute 

 

1차 정규화

테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것


 

사람 테이블

위의 테이블에서 "장영"은 좋아하는 음식이 2가지 이므로 컬럼이 원자값을 가지지 않아 1차 정규형을 만족하지 못하고 있다. 

따라서 아래와 같이 테이블을 분해하여, 칼럼이 원자값을 가지도록 한다. 

1차 정규화된 사람 테이블

1차 정규형은 만족하지만 data redundancy가 만족함을 볼 수 있다.


2차

제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것.

여기서 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다.

즉, 기본키 중에 특정 컬럼에만 종속된 컬럼이 없어야 된다는 것.


1차 정규화를 마친 테이블 사람 테이블

 

위 테이블의 기본키는 (이름, 좋아하는 음식)으로 복합키이다. 이 두 개가 합쳐져야 한 로우를 구분할 수가 있다.

근데 '나이'의 경우 이 기본키 중에 '이름'에만 종속되어 있다.

즉, '이름' 컬럼의 값을 알면 '나이'의 값을 알 수 있다. 따라서 '나이'가 두 번 들어가는 것은 불필요한 것이다.

 

2차 정규화를 통해 분리된 테이블

따라서 위의 표처럼 테이블을 분해하여 2차 정규형을 만족시킬 수 있다. 


3차

 

제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것. 

이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.
즉, 기본키 이외에 다른 컬럼이 그 외의 다른 컬럼을 결정할 수 없다는 것을 의미

 

 

위의 테이블을 보면 'zip code' 키를 통해 '도시'를 결정할 수 있다. 여러 사람들이 동일한 'zip code'를 가지면 '도시'가 결정되기 때문에, 이 컬럼들에는 중복된 데이터가 생길 수 있다. 

 

이를 해결하기 위해서, 테이블을 논리적인 단위(사람, 주소)로 분리한다.

redundancy 또한 감소함을 알 수 있다. 

3차 정규화를 마친 사람테이블과 주소 테이블


BCNF(Boyce-Codd Normal Form)

3차 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되어 테이블을 분해하는 것

즉, 함수 종속이 아닌 다중값 종속성 제거

위의 테이블에서 기본키는(이름, 과목)이다. 이 기본키(이름, 과목)은 '교수님'을 결정짓고, '교수님'은 '과목'을 결정짓는다. 하지만 여기서 '교수님'은 결정자지만 후보키가 아니다는 문제가 있다.  이 경우,  만약 '과목'이 변경되면, '교수님'도 변경해야 갱신 문제가 발생할 수 있다. 

 

아래와 같이 테이블을 2개로 분해하면 BCNF화를 할 수 있다.  

수강 테이블과, 교수 테이블로 분해

 


 

출처

https://3months.tistory.com/193

https://mangkyu.tistory.com/110

https://m.blog.naver.com/gkenq/220739794662

 

'DataBase' 카테고리의 다른 글

Replication(리플리케이션)  (0) 2021.08.25
효과적인 쿼리 저장  (0) 2021.08.25
Optimizer(최적화의 원리)  (0) 2021.08.24
Transaction(트랜잭션)  (0) 2021.08.17
Database Pool(데이터베이스 풀)  (0) 2021.08.16