DATABASE

[정규화]란 무엇인가

Haksae 2022. 4. 1. 10:31

1. 정규화 (Normalization)

정규화란 관계형 데이터베이스의 설계에서 데이터 간의 중복을 최소화되게 데이터를 구조화하는 프로세스를 뜻한다.
  • 정규화는 함수적 종속성을 이용해서 연관성이 있는 속성들을 분류하고, 각 릴레이션들에서 이상현상이 생기지 않도록 하는 과정이다.
  • 이 과정은 큰 테이블을 연관이 있는 컬럼들만 쪼개서, 중복이 없는 형태로 작게 여러 테이블로 쪼개 나가는 과정을 가진다.

 

1.1. 정규화의 목적

  • 불필요한 데이터를 제거하고 데이터 중복을 최소화하기 위해서
  • 데이터베이스 구조 확장 시, 재 디자인을 최소화하기 위해서
  • 무결성 제약 조건의 시행을 간단하게 하기 위해서
  • 테이블 구성을 논리적이고 직관적으로 만들어, 이상현상을 방지하기 위해서

 

1.2 이상현상(Anomaly)

  • 삽입 이상(insertion anomaly) : 데이터를 저장할 때 원하지 않는 정보가 함께 삽입되는 경우 
  • 갱신 이상(update anomaly): 중복된 튜플 중 일부의 속성만 갱신시킴으로써 정보의 모순성이 발생하는 경우
  • 삭제 이상(delete anomaly): 튜플을 삭제함으로써 유지되어야하는 정보까지도 연쇄적으로 삭제되는 경우

⇒ 이상 현상이 발생하는 원인은 관련없는 속성들을 다 모아서 하나의 릴레이션으로 만들었기 때문

⇒ 이상 현상을 방지하기 위해 정규화를 하는 것

정규화를 통해 릴레이션을 관련이 있는 속성들로만 구성되는 작은 여러 개의 릴레이션으로 분해(decomposition)해야 한다.

 

1.3 함수적 종속성 (Functional Dependency)

  • 데이터베이스의 릴레이션에서 두 개의 속성(Attribute) 집합 간 제약의 일종
  • 데이터들이 어떤 기준 값에 의해서 항상 종속이 되는 현상을 뜻한다.

  • 정규화시, 일반적으로 속성들 간의 관련성을 판단하여, 하나의 릴레이션에는 하나의 함수적 종속성만이 존재하도록 정규화를 하게 된다.
<정규화가 꼭 답은 아니다>
- 3NF을 만족하면 정규화 되었다고 한다.
- 정규화가 잘 되면, IUD에서는 훨씬 좋은 모습을 보이지만, 분리된 테이블에 대한 통합적인 뷰를 보아야할 때 조인이 많이 이루어지므로 cost가 더욱 발생하고, 일부 쿼리에 대해서는 효율이 나빠질 수 있다.
- Analytic query를 주로 실행하는 OLAP 애플리케이션인 경우 성능 향상을 위해 낮은 수준의 정규화를 추구하기도 한다.
- Denormalization : 일부 쓰기 성능의 손실을 감수하고 데이터를 묶거나 데이터의 복제 사본을 추가함으로써 데이터베이스의 읽기 성능을 개선하려고 시도하는 과정
<기본 정규형과 고급 정규형>
- 기본 정규형으로는 제 1-3 정규형이 있고, 제 4 정규화 이후로는 고급 정규형으로 분류된다.
- 제 1-3 정규화가 데이터 속성들 간의 종속성을 고려한 정규화라면, 제 4 정규화 이후로는 튜플이 생성될 때 관계까지 고려하여 정규형 폼을 만드는 것이다. 그러나 제 1-3 정규화 만으로도 무리없이 데이터베이스 설계가 가능하다.

- 고급 정규형은 너무 복잡하므로 본 글에서는 제 1-3 정규화만 다루겠다.

 

2. 제 1 정규화 (1NF, First Normal Form)

제 1 정규화는 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다.
  • 같은 성격과 내용의 컬럼이 연속적으로 나타나는 컬럼이 존재할 때, 해당 컬럼을 제거하고 기본 테이블의 PK를 추가해 새로운 테이블을 생성하고, 기존의 테이블과 1:N 관계를 형성

  • 위의 제 1 정규화 예시를 살펴보자
    • 위의 테이블의 취미 필드를 보면, 여러 개의 값들이 존재하는 경우가 있다. 이는 제 1 정규형을 만족하지 못하고 있는 상황이다.
    • 그렇기 때문에 이를 제 1 정규화하여 두번째 그림과 결과를 만들어낸다.

  • 조금은 더 복잡한 제 1 정규화 예시를 살펴보자
    • 판매 테이블에는 여러 필드들이 존재하는데, 파란색 부분이 중복되어 있는 상태이다.
    • 이를 제 1 정규화 과정을 통해 다른 테이블로 구분해주고, FK값을 설정하고 1:N 관계를 설정한 것이다.

 

3. 제 2 정규화 (2NF, Second Normal Form)

제 2 정규화란, 제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
  • PK가 여러 키로 구성된 복합키(Composite Primary Key)로 구성된 경우가 2차 정규화의 대상이 된다.
  • 복합키 전체에 의존하지 않고 복합키의 일부분에만 종속되는 속성들이 존재할 경우 (즉, 부분적 함수 종속 관계) 이를 분리하는 것이다.

 

 

  • 위의 제 2 정규화 예시를 살펴보자
    • 첫 번째 사진을 보면 판매부서와 부서명이 불일치하는 상황임을 알 수 있다.
    • 두 번째 사진을 살펴보면, 이러한 불일치가 완전 함수 종속이 되지 않았기 때문임을 알 수 있다. (판매부서와 부서 명 간에)
    • 부서와 판매 테이블을 나눔으로 위의 문제를 해결해주는 것을 제 2 정규화라고 한다.

(출처: 망나니 개발자)
(출처: 망나니 개발자)

  • 제 2 정규화의 예시를 하나 더 살펴보자
    • 첫번째 사진의 수강강좌 테이블에서 기본키는 (학생번호, 강좌이름)으로 복합키이다. 그리고 (학생번호,강좌이름)인 기본키는 성적을 결정하고 있다. (학생번호,강좌이름) -> (성적)
    • 그런데 여기서 강의실이라는 컬럼은 기본키의 부분집합인 강좌 이름에 의해 결정될 수 있다. (강좌이름) -> (강의실)
    • 즉, 기본키(학생번호, 강좌이름)의 부분키인 강좌이름이 결정자이기 때문에, 수강강좌의 테이블의 경우 두번째 사진과 같이 기존의 테이블에서 강의실 테이블을 분해하여 별도의 테이블로 관리하여야한다.

 

4. 제 3 정규화 (3NF, Third Normal Form)

제 3 정규화란, 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분리하는 것이다.
  • 함수적 종속 관계가 슈퍼키에서 시작하거나 prime attribute(candidate key에 포함된 attribute)로 끝나야한다.
  • 제 3 정규화는 PK에 의존하지 않고 일반컬럼에 의존하는 컬럼들을 분리한다.

(출처: 망나니 개발자)
(출처: 망나니 개발자)

  • 제 3 정규화의 예시를 살펴보자
    • 첫번째 사진에서 계절학기 테이블에서 학생 번호는 강좌 이름을 결정하고 있고, 강좌 이름은 수강료를 결정하고 있다.
    • 그렇기 때문에 이를 두번째 사진과 같이 (학생번호, 강좌 이름) 테이블과 (강좌이름, 수강료) 테이블로 분해해야한다.
    • 왜 해야하죠? 이행적 종속을 제거하는 이유를 본 예시에서 찾아본다면.. 가령 501번 학생이 수강하는 강좌가 자료구조로 변경되면 수강료까지 변경해줘야한다. 물론 변경이 가능하지만 번거롭기 때문에 제 3 정규화를 하는 것이다.

 

5. BCNF (Boyce-Codd Normal Form) 정규화

BCNF 정규화란, 제 3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.
  • BCNF는 3NF에서 조금 더 강화된 버전 (3.5NF라고도 불림)
  • 모든 함수 종속 관계 (X → Y)에서 X로 가능한 집합의 속성이 모두 슈퍼 키이면 BCNF을 만족한다.

출처 : 망나니 개발자

 

출처 : 망나니 개발자

 

참고자료

https://inpa.tistory.com/entry/DB-%F0%9F%93%9A-%EC%A0%9C-1-2-3-%EC%A0%95%EA%B7%9C%ED%99%94-%EC%97%AD%EC%A0%95%EA%B7%9C%ED%99%94

https://mangkyu.tistory.com/110

https://myeonguni.tistory.com/210