정규화에 대해서 알아보자.
728x90

정규화란?

정규화(Normalization)는 관계형 데이터베이스에서 데이터 구조를 체계적으로 정리하는 과정이다.

그러면 왜 정규화가 필요할까?

  • 중복 데이터 제거: 중복 데이터를 최소화하여 저장 공간 절약 및 데이터 일관성 유지.
  • 데이터 무결성 보장: 데이터 이상 현상을 방지하고 데이터 간 논리적 관계를 보장.
  • 데이터 이상(Anomaly) 방지:
    • 삽입 이상: 데이터를 추가할 수 없는 상태 방지.
    • 삭제 이상: 데이터 삭제 시 관련 정보가 유실되는 상황 방지.
    • 갱신 이상: 데이터가 불필요하게 중복되어 일관성이 깨지는 현상 방지.

 

그러면 정규화를 통해 데이터가 깔끔해지긴 하지만, 모든 경우에 항상 정규화가 최선일까라는 의문이 들 수 있다. 최선이 아닌 경우 우리는 반정규화 개념을 사용할 수 있다.

반정규화(De-normalization)란?

반정규화는 데이터베이스 성능 향상을 위해 정규화를 일부 해제하는 과정으로, 조회 성능이 중요한 시스템에서 사용되며, 데이터 중복을 허용하는 대신 읽기 속도를 개선할 수 있다.

상황에 따라 데이터 중복을 허용하는 것이 시스템 전체의 성능을 높이는 열쇠가 될 수 있기에, 적재적소에 반정규화를 활용해야 한다.

 

정규화는 그러면 어떤 과정으로 이루어질까?

정규화 과정은 1에서 5까지 있다. 하나하나 살펴보겠다.

 

정규화 과정

 

제1정규형 (1NF)

  • 테이블의 모든 속성 값이 원자값(Atomic Value)으로 이루어져야 합니다.
  • 예시:
    • 비정규형: 주문(주문ID, 고객명, 주문품목)에서 주문품목이 여러 값을 포함.
    • 1NF: 주문(주문ID, 고객명, 주문품목)에서 각 주문품목을 개별 행으로 나눔.

 

  • 비정규형
    주문ID 고객명 주문품목
    1 존 스미스 노트북, 스마트폰
    1NF 후
    주문ID 고객명 주문품목
    1 존 스미스 노트북
    1 존 스미스 스마트폰

 

데이터의 최소 단위를 명확히 정의하는 것이 1NF의 핵심이다.

 

제2정규화 (2NF)

  • 1NF를 만족해야 한다. (모든 속성 값이 원자값이어야 함)
  • 기본 키에 대해 부분 함수 종속성이 없어야 한다.
    • 즉, 기본 키의 일부만을 기준으로 다른 속성이 종속되지 않도록 해야 한다.
  • 예시:
    • 1NF: 주문(주문ID, 고객명, 제품ID, 제품명)에서 제품명제품ID에만 종속.
    • 2NF: 주문(주문ID, 고객명)제품(제품ID, 제품명)으로 분리.

 

1NF

주문ID 고객명 제품ID 제품명
1 존 스미스 A1 노트북
1 존 스미스 A2 스마트폰

2NF

주문 테이블

주문ID 고객명
1 존 스미스

제품 테이블

제품ID 제품명
A1 노트북
A2 스마트폰

주문-제품 테이블

주문ID 제품ID
1 A1
1 A2

 

2NF는 데이터를 논리적으로 분리함으로써 중복성을 더 줄일 수 있다.

 

제3정규화 (3NF)

2NF를 만족하고, 이행적 함수 종속성을 제거해야 한다.

  • 이행적 함수 종속성이란, A → B, B → C 관계가 존재할 때 A → C가 되는 상황이다.
  • 예시:
    • 2NF: 학생(학번, 학과, 학과위치)에서 학과위치학과에 종속.
    • 3NF: 학생(학번, 학과)학과(학과, 학과위치)로 분리.

 

2NF

학번 학과 학과위치
1001 컴퓨터공학 3층
1002 전자공학 2층

3NF

학생 테이블

학번 학과
1001 컴퓨터공학
1002 전자공학

학과 테이블

학과 학과위치
컴퓨터공학 3층
전자공학 2층

 

 

이행적 종속성을 제거하면 데이터가 더욱 명료해진다.

 

BCNF (Boyce-Codd Normal Form)

3NF를 만족하며 모든 결정자가 후보 키여야 한다.

  • 결정자란 다른 속성 값을 고유하게 결정하는 속성이다.
  • 예시: 수업(교수ID, 강의실, 시간)에서 강의실시간이 결정자.

 

3NF

교수ID 강의실 시간
1 A101 10시
1 A102 11시

BCNF 교수 테이블

강의실 교수ID
A101 1
A102 1

강의실 테이블

시간 강의실
10시 A101
11시 A102

 

 

BCNF는 후보 키와 결정자의 관계를 명확히 정리해준다.

 

제4정규화 (4NF)

  • 다치 종속성을 제거하여 데이터 중복을 최소화해야 한다.
    • 다치 종속성이란 하나의 속성이 다른 두 속성에 독립적으로 종속되는 경우를 말한다.
  • 예시: 프로젝트(학생, 팀)에서 학생이 여러 팀에 속할 수 있는 구조를 분리.

 

3NF (다치 종속성 포함)

  • {식당} ↠ {음식 종류}
  • {식당} ↠ {배달 지역}
  • 음식 종류와 배달 지역은 관계가 없는 독립적인 관계이다. 하지만 같은 테이블 식당 컬럼에 다치 종속되어 중복이 발생한다.
식당 음식 종류 배달 지역
A 치킨 후라이드 하남
A 치킨 후라이드 용인
B 치킨 후라이드 안성
B 치킨 양념치킨 하남
B 치킨 양념치킨 용인
C 치킨 간장치킨 용인

4NF

식당-음식 종류 테이블

식당 음식 종류
A 치킨 후라이드
B 치킨 후라이드
B 치킨 양념치킨
C 치킨 간장치킨

식당-배달지역 테이블

식당 배당 지역
A 치킨 하남
A 치킨 용인
B 치킨 하남
B 치킨 용인
B 치킨 안성
C 치킨 용인

 

다치 종속성을 해결하면 테이블 구조가 더 깔끔해진다.

 

제5정규화 (5NF)

  • 중복을 제거하기 위해 분해할 수 있을 만큼 전부 분해하는 것으로,
    • 제 4정규형을 만족하고
    • 조인 종속성을 제거하여 복합 키 조인 시 데이터 중복 방지 해야 한다.
      • 조인 종속성이란 다중 관계를 분리했을 때 테이블을 다시 조인 하여도 원래 데이터가 유지되는 경우를 말한다.
    • 그리고, 조인 연산을 했을 때 손실이 없어야 한다.
4NF 한것을 조인 연산하면 처음 4NF 한 것보다 더 많은 데이터가 생기는 것을 알 수 있다.
  • 원래 데이터에서는 음식 종류와 배달 지역이 독립적이었지만, 조인 후에는 음식 종류와 배달 지역 간 관계가 있는 것처럼 보이는 중복 데이터가 생성되었다.
식당 음식 종류 배달 지역
A 치킨 후라이드 하남
A 치킨 후라이드 용인
B 치킨 후라이드 하남
B 치킨 후라이드 용인
B 치킨 후라이드 안성
B 치킨 양념치킨 하남
B 치킨 양념치킨 용인
B 치킨 양념치킨 안성
C 치킨 간장치킨 용인
 
5NF를 적용하여 음식 종류-배달 지역 테이블과 같은 독립된 관계를 추가로 분리하면 

식당-음식 테이블


식당 음식 종류
A 치킨 후라이드
B 치킨 후라이드
B 치킨 양념치킨
C 치킨 간장치킨

식당-지역 테이블


식당 배달 지역
A 치킨 하남
A 치킨 용인
B 치킨 하남
B 치킨 용인
B 치킨 안성
C 치킨 용인

음식-지역 테이블


음식 종류 배달 지역
후라이드 하남
후라이드 용인
양념치킨 하남
양념치킨 용인
간장치킨 용인

5NF로 정규화하면 조인 종속성을 제거하여 데이터 중복 없이 원래 데이터를 복원할 수 있다.

\5NF는 데이터베이스 설계의 최종 정돈 단계라고 할 수 있다.

728x90
반응형

'Database' 카테고리의 다른 글

클러스터링과 리플리케이션에 대하여  (2) 2024.12.27
RDBMS vs NoSQL  (0) 2024.12.26
데이터베이스의 특징에 대해서 알아보자.  (2) 2024.12.24