타닥타닥/DB

DB ] 정규화(Normalization)와 반정규화(De-normalization) / 정규화 방법 (1NF, 2NF, 3NF, BCNF)

땅디 2023. 1. 9. 16:31

 

  정규화는 이상현상(Anomaly) 이 있는 릴레이션을 분해하여 이상현상을 없애는 과정입니다. 이번 포스팅에서는 정규화의 특징과 진행 방법에 대해 알아보겠습니다.

 

❗❗  이상현상과 함수종속성에 관해서는 아래 포스팅을 참고해 주세요. ❗❗ 

 

DB ] 이상현상(Anomaly)과 함수 종속성(Functional Dependency)

이번 포스팅에서는 이상현상(Anomaly)과 함수 종속성(Functional Dependency)에 대해 알아보겠습니다. 본 포스팅은 다음 순으로 작성되었습니다. 1. 이상현상(Anomaly) 2. 함수 종속성(Functional Dependency) 1. 이

dang-di.tistory.com

 

 

본 포스팅은 다음 순으로 작성되었습니다.

1.  정규화(Normalization), 반정규화(De-normalization)
2.  정규화 방법
 - 제1 정규형 (1NF)
 - 제2 정규형 (2NF)
 - 제3 정규형 (3NF)
 - BCNF

 

1.  정규화(Normalization), 반정규화(De-normalization)


  정규화를 진행할 때 이상현상이 존재하는 릴레이션을 분해하여 여러 개의 릴레이션을 생성하게 됩니다. 이를 단계별로 구분하여, 정규형이 높아질수록 이상현상이 줄어들게 됩니다.

 

◼ 정규화의 장점

  정규화의 장점으로는 이상현상의 제거가 있습니다. 테이블 간의 중복 데이터를 허용하지 않으므로 무결성(Integrity)을 유지할 수 있으며, 데이터베이스 저장 용량도 줄일 수 있습니다.

  그 외의 장점으로는 데이터베이스와 연동된 응용 프로그램에 최소한의 영향을 미치게 되기 때문에 프로그램 생명연장의 장점과, 새로운 데이터 형의 추가로 인한 확장의 경우 구조를 변경하지 않아도 되거나 일부만 변경해도 된다는 장점이 있습니다.

 

 

◼ 정규화의 단점

  정규화의 단점으로는 릴레이션이 분해되기 때문에 JOIN 연산이 많아진다는 단점이 있습니다. 응답 시간이 느려질 수도 있는데, 이 경우에는 반정규화를 적용할 수 있습니다.

 

 

◼ 반정규화

  반정규화는 시스템의 성능 향상을 위해 정규화된 데이터 모델을 통합하는 작업으로, 의도적으로 정규화 원칙을 위배하는 행위입니다.
  반정규화의 종류로는 테이블 통합/분할/추가, 중복 속성 추가 등이 있습니다. 반정규화를 수행하면 테이블이 단순해지고 관리 효율성이 증가하지만, 데이터의 일관성이나 무결성이 보장되지 않을 수 있습니다. 의도적으로 중복을 생성하여 검색 기능은 향상되지만, 갱신, 삭제 등의 성능은 낮아집니다.

 

반정규화의 대상이 되는 경우는 다음과 같습니다.  

  • 수행 속도가 많이 느린 경우 
  • 테이블의 조인(JOIN) 연산을 지나치게 사용하여 데이터를 조회하는 것이 기술적으로 어려운 경우
  • 테이블에 많은 데이터가 있고, 다량의 범위 혹은 특정 범위를 자주 처리해야 하는 경우

 

 

2.  정규화 방법


  정규화의 원칙은 크게 3가지가 있습니다.

 

  • 정보의 무손실
    - 분해된 릴레이션이 표현하는 정보는 분해되기 전의 모든 정보를 포함해야 합니다.

  • 최소 데이터 중복
    - 이상현상을 제거하고, 데이터 중복을 최소화해야 합니다.

  • 분리의 원칙
    - 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리하여 표현해야 합니다.

  또, 높은 차수의 정규형은 낮은 차수의 정규형을 모두 만족하여야 합니다. 이제 각각의 정규형에 대해 알아보겠습니다.

 


 

 

◼ 제1 정규화 (1NF)

  각 칼럼이 하나의 속성만을 가지며, 한 칼럼은 같은 타입의 값을 가져야 합니다. 중복되는 값을 가져선 안되며, 칼럼의 순서가 상관없어야 합니다.

 

번호 이름 취미
1 A 음악
2 B 쇼핑
3 C 게임, 음악

  예를 들면 위 테이블은 '각 칼럼은 하나의 속성만을 가진다'는 조건을 불만족하므로 아래와 같이 분해하여 제1 정규형을 만족하게 할 수 있습니다.

 

번호 이름 취미
1 A 음악
2 B 쇼핑
3 C 음악
3 C 게임

 


 

◼ 제2 정규화 (2NF)

  제1 정규형을 만족하고, 부분 함수적 종속 관계를 제거해야 합니다. 즉, 모든 칼럼이 완전 함수 종속을 만족해야 합니다.

 

학번 강의이름 강의실 성적
1 C++ 14-414 3.5
2 자료구조 14-415 4.0

  위 테이블에서 기본키는 학번, 강의 이름으로 복합키입니다. 이 기본키는 성적을 결정하고 있습니다. 

(학번, 강의이름) -> (성적)

 

  하지만 여기서 강의실이라는 칼럼은 강의 이름에 의해서만 결정될 수 있습니다.

(강의이름) -> (강의실)

  

  제2 정규형은 부분 함수적 종속 관계를 제거해야 하기 때문에 아래와 같이 테이블을 나누어 제2 정규형을 만족시킬 수 있습니다.

학번 강의이름 성적
1 C++ 3.5
2 자료구조 4.0

 

강의이름 강의실
C++ 14-414
자료구조 14-415

 


 

◼ 제3 정규화 (3NF)

  제2 정규형을 만족하고, 이행 함수적 종속을 제거해야 합니다.

 

 

학번 강의이름 수강료
1 C++ 20000
2 자료구조 25000
3 자료구조 25000

  위의 테이블에서 학번은 강좌이름을, 강좌이름은 수강료를 결정합니다. 

 

(학번) -> (강의이름)

(강의이름) -> (수강료)

(학번) -> (수강료)

 

  이런 상황에서 학번이 1인 학생이 수강하는 강의가 자료구조로 바뀐다면 수강료에 이상이 생기게 되고, 데이터를 변경해야 하는 번거로움이 생기게 됩니다. 이러한 번거로움을 해결하기 위해 제3 정규화를 거쳐 테이블을 다음과 같이 분해해야 합니다.

학번 강의이름
1 C++
2 자료구조
3 자료구조

 

강의이름 수강료
C++ 20000
자료구조 25000

 


 

◼ BCNF 정규화

  제3 정규형을 만족하고, 모든 결정자가 후보키가 되도록 테이블을 분해해야 합니다.

 

학번 강의이름 교수
1 C++ A
2 자료구조 B
3 C++ A
4 C++ C

  위 테이블에서 기본키는 (학번, 강의이름)입니다. 그리고 기본키는 교수를 결정하고 있는데, 교수 또한 강의이름을 결정하고 있습니다.

 

(학번, 강의이름) -> (교수)

(교수) -> (강의이름)

 

  문제는 교수가 강의이름을 결정하는 결정자이지만, 후보키는 아닙니다. 그렇기 때문에 BCNF 정규화를 거쳐 다음과 같이 테이블을 분해해야 합니다.

학번 교수
1 A
2 B
3 A
4 C

 

강의이름 교수
C++ A
자료구조 B
C++ C

 


 

  그 이상의 정규형이 있지만, 보통 정규화는 BCNF 까지만 하는 경우가 대다수입니다. 그 이상 정규화를 한다면 위에서 살펴보았던 정규화의 단점이 나타나기 때문입니다.

 

 


 

이렇게 정규화와 정규화하는 방법에 대해서 알아보았습니다.

 

짠!