본문 바로가기
Programming/SQL

데이터 정규화 (제 1차~5차 정규화)

by 제타 2018. 4. 24.
반응형


정규화의 목적

데이터를 효율적으로 저장하고 중복을 방지하여 저장 공간을 낭비를 줄이는 것이다. 하지만 테이블 갯수가 많아지니 쿼리문을 짤 때 join을 사용해야한다.

테이블 간의 관계에서 올바르지 못한 삽입, 삭제, 업데이트 이상이 발생하지 않도록 한다.

새로운 형태의 데이터가 삽입될 때 관계를 재구성할 필요성을 줄일 수 있다.



정규화는 제 1 정규화부터 제 5 정규화까지 존재하며 흔히 정규화 대상은 1~3 정규화까지만 한다..


제1 정규화

어떤 릴레이션에 속한 모든 도메인이 원자값을 갖도록 하여 더 이상 분해할 수 없도록 한다.


이름 

취미 

노블레스

컴퓨터, 게임

라이제르

축구, 야구


위와 같은 테이블의 경우 취미가 n개일 때 옆에다가 계속 써주던지, 아니면 취미1, 취미2, 취미3 컬럼을 계속 만들어주던지 해야하는 단점이 있다

따라서 이런 경우에 제 1정규화를 거치면 다음처럼 만들 수 있다.

 이름

 취미

 노블레스

 컴퓨터

 노블레스

 게임

 라이제르

 축구

 라이제르

 야구


이런식으로 중복을 제거하는 것이 제 1 정규화이다.


제2 정규화

기본 키가 복합키로 구성되어 있을 때 복합키 전체에 의존하지 않고 일부에 의존적인 열이 있으면 이를 제거하는 것이다.


이름 

 취미

 생년월일

 노블레스

컴퓨터

 19850101

 노블레스

게임

 19850101

 라이제르

축구 

 19890303

 라이제르

야구 

 19890303


예가 극단적이기는 한데 어쨌든 생년월일은 이름에 의존적인 컬럼이다.

따라서 이런 경우에는 생년월일 컬럼을 없애고 생년월일 테이블을 새로 만든다.


 이름 

 취미

 노블레스

 컴퓨터

 노블레스

 게임

라이제르

 축구 

 라이제르

 야구 

  

이름 

 생년월일

 노블레스

 19850101

 노블레스

 19850101

 라이제르

 19890303

 라이제르

 19890303


이런식으로 테이블을 나누면 된다. (예가 조금 극단적이긴 하다..;)


제3 정규화

주 식별자가 아닌 컬럼들 중에서 종속관계가 있는 속성을 제거하는 과정이다.


예를 들면 다음과 같다.

 이름

취미 

 부서코드

부서명 

 노블레스

 게임

D01

데이터베이스 

 라이제르

 야구 

D02 

빅데이터


이런 경우 부서명은 부서코드에 종속적이다. 따라서 부서코드만 두고, 부서코드+부서명만 갖고 있는 테이블을 하나 만들면 된다.


이름 

 취미 

 부서코드

 노블레스

 게임

 D01

 라이제르

 야구 

 D02


부서코드 

부서명 

 D01

 데이터베이스 

 D02

 빅데이터



보통 3차까지만 해도 충분히 정규화가 되었다고 본다. 솔직히 여기서 더 정규화를 하는 것은 이론적인 이야기일뿐 실무에서도 본적이 없다.

그래도 간단히 소개라도 하자면 다음과 같다.


제4 정규화

하나의 릴레이션에 두 개 이상의 다치 종속(MVD; Multi-Valued Dependency)이 발생하면 이를 제거 하는 과정이다.

일명 다가 종속을 분리하는 과정이다. 말이 어렵다.


제5 정규화

결합 종속(join dependency)을 분리하는 과정이다. 역시 말이 어렵다.



결론은 3차 정규화까지만 알면된다.

정리하면 1차정규화는 모든 도메인이 원자값을 갖도록 하는 것이고, 2차정규화는 복합키 전체에 의존하지 않고 일부에 의존하는 것 제거, 3차 정규화는 종속관계를 떨궈내는 것이다.


개인적으로 정규화보다 역정규화, 반정규화를 하는 것을 좋아하며 사실 정규화보다 역정규화, 반정규화를 잘 하는 것이 진짜 데이터 설계를 잘 하는 것이라고 생각한다. 물론 OLTP 상황에서는 정규화가 역정규화보다는 좋은 방법일 것이다.



반응형