본문 바로가기
Dev Talks/Database

[Database #9] 데이터베이스 정규화 개념 및 방법

by 곰씨네IT 2017. 3. 31.
** Responsive Ad **


1. 정규화 (DB normalization) 개념 

관계형 데이터베이스 설계 시 중복을 최소화하도록 데이터를 구조화 하는 작업을 정규화라고 하며, 정규화를 하는 이유는 이상(anomaly) 이 있는 관계를 재구성함으로써 바람직한 스키마로 만들어가는데 있다.



2. 정규화 방법

기본적으로 높은 차수의 정규형은 낮은 차수의 정규형을 모두 만족하여야 한다. 즉, 제3정규형은 제1,2 정규형의 조건을 모두 만족하여야 하며, BCNF는 1,2,3 정규형을 기본적으로 모두 만족하고 있어야 한다. 


(1) 제1정규형 (1NF = 1 Nomal Form)

 - 중복되는 항목이 없어야 한다 (도메인이 원자값만으로 되어 있어야 함)



위와 같이 설계하면 전화번호는 2개 이상일 수 있다. 따라서 전화번호 속성의 도메인에 555-861-2025, 511-123-4567 과 같은 형태의 값이 생긴다. (도메인이 원자값이 아님) 이는 제1정규형을 만족하지 않는다. 해결하는 방법으로,



이렇게 할 수 있으나 이런 방법은 다음과 같은 문제가 발생한다.


- 갯수 제한 : 어떤 고객이 4개의 전화번호를 가지고 있는다면?

- 테이블 질의 어려움 : 어떤 고객이 555-403-1659 전화번호를 가지고 있는가?

- 고객-전화번호 간의 유일성 확보가 안 됨 : 456고객의 전화번호 2개가 중복으로 들어가있음


따라서, 이를 해결하려면 다음과 같이 하면 된다.




(2) 제2정규형 (2NF)

 - 부분 함수적 종속 관계를 제거해야 함



위 테이블에서 후보키(기본키의 후보가 될 수 있는 키)는 "종업원 + 기술" 이다. 그런데 근무지는 종업원에만 종속적인 관계를 갖는다. 이처럼 키의 일부에만 종속적인 관계를 가지는 것을 부분 함수적 종속관계라 하며, 부분 함수적 종속 관계는 갱신이상 현상을 초래할 수 있다. 따라서,


위와 같이 테이블을 나누어 정규화 작업을 해야한다.



(3) 제3정규형 (3NF)

 - 이행 함수적 종속 (x -> y ->z) 제거



위 테이블에서 대회 + 연도를 키로 우승자가 결정되고 우승자에 따라 우승자 생년월일이 결정된다. 이처럼 x->y 이고 y-> z 인 관계를 이행 함수적 종속이라고 한다. 이런 경우 우승자를 변경하면 불필요하게 우승자 생년월일도 동시에 변경해야 하기 때문에 갱신이상 현상을 초래할 수 있다. 이를 해결하려면,

위처럼 테이블을 분리해서 해결한다. 대부분의 99%의 정규형 작업이 여기서 끝난다. 따라서 다음 정규화 작업은 추후에 검토해보기로 한다.


(4) BC(Boyce-codd) 정규형 (BCNF)

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


(5) 제4정규형

 - 다치 종속 제거


(6) 제5정규형

 - 조인 종속성 이용




** Big Qurdrangle Ad **



댓글