정규화 이론이란?

정규화란 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스다.

정규화 이론은 RDB 설계 이론의 왕도라고 알려져있다. 따라서 정규화 이론이 RDB의 일부라고 생각할 수 있지만 이는 사실이 아니다. 관계형 모델 자체는 정규화 되어있지 않아도 똑같이 릴레이션 연산을 처리할 수 있다. 하지만 정규화 되어있지 않은 RDB의 릴레이션 연산은 어려워질 수 있다.

그렇다면 데이터베이스를 정규화 했을 때 우리가 얻을 수 있는 장점은 무엇일까? 바로 모순을 방지할 수 있다는 것이다.

모순이란 데이터가 논리적으로 불일치가 일어나는 상태이며, 이런 모순이 일어난 상태를 **변칙(Anomalies)**라고 하기도 한다. 즉, 이 변칙을 방지할 수 있는 설계 이론이 바로 정규화 이론이다.

모순, 이상

그렇다면 실제로 정규화 되어있지 않은 데이터베이스는 어떤 문제가 발생할 수 있을까? 다음과 같은 예를 생각해보자.

이름 학과 등록금
이도환 경영학과 400
노종수 컴퓨터공학과 500
김명환 화학공학과 450

학생의 과, 등록금을 관리하기 위해서 다음과 같은 설계를 했다고 해보자. ‘학생이 다방면의 지식을 탐구하도록 장려’하기 위해 다전공 시스템이 적용되는 학교라면 어떨까?

이름 학과 등록금
이도환 경영학과 400
노종수 컴퓨터공학과, 전자공학과 500
김명환 화학공학과 450

이와 같은 설계는 어떨까? 만약 우리가 SQL로 “노종수”가 소속해있는 학과의 개수를 알아내는 것이 쉬울까? 아마 아닐 것이다. 이와 같은 설계는 DBMS의 장점을 전혀 누릴 수 없는 것과 같다.

이름 학과 등록금
이도환 경영학과 400
노종수 컴퓨터공학과 500
노종수 전자공학과 500
김명환 화학공학과 450

이와 같은 설계는 어떨까? 릴레이션은 명제가 참인 집합이므로 모든 문장이 참이 된다고 가정해야 한다.

예를 들어 “이도환은 경영학과에 다니며 등록금으로 400만원을 낸다”라는 문장과 “김명환은 화학공학과에 다니며 등록금으로 450만원을 낸다”라는 문자은 참이 되어야 하는 것이다.

그렇다면 “노종수”의 경우는 어떠할까? “노종수는 컴퓨터 공학과, 전자공학과에 다니며 등록금으로 500만원을 낸다”라는 문장은 참일까? 문장 자체는 참이 되지만 그렇다면 만약 전자공학과의 등록금이 올라간다면 노종수의 등록금 또한 올라가는 것이 맞는 것일까?라는 질문에는 대답하기가 쉽지 않다.

즉, 다음과 같이 어떠한 데이터베이스 설계에 연산을 적용할 때 모순이 생길 수 있다. 다른 말로는 중복이 생길 수 있으며 이를 방지하는 방법이 바로 정규화다.

예를 들어 새로운 학부가 신설되었지만 아직 소속된 학생이 없다면 “이름”에 NULL이 들어가야하므로 데이터를 삽입할 수 없다. 이와 같은 문제를 삽입 이상이라고 한다.

만약 이 대학이 다전공이 허용이 안된다고 해도 만약 전자공학과 등록금이 인상된 경우 학과가 전자공학과인 모든 학생들의 등록금을 수정하지 않으면 데이터 불일치가 발생한다. 이와 같은 문제를 수정 이상이라고 한다.

반대로 만약 “이도환” 학생이 학교를 자퇴하는 경우 경영학과에 대한 정보가 사라지게 된다. 이와 같은 문제를 삭제 이상이라고 한다.

이처럼 데이터베이스에 연산을 적용하면서 문제가 생기는 경우를 통틀어 **갱신 이상(Update Anomaly)**이라고 한다.

정규형의 종류

학문적으로 알려진 정규형의 종류는 다음과 같다.

  • 제1 정규형(1NF)
  • 제2 정규형(2NF)
  • 제3 정규형(3NF)
  • 보이스코드 정규형(BCNF)
  • 제4 정규형(4NF)
  • 제5 정규형(5NF)
  • 제6 정규형(6NF)

상위 정규형은 하위 정규형의 조건을 모두 만족한다. 즉, 2NF1NF를 만족하며 4NFBCNF, 3NF, 2NF, 1NF의 조건 모두를 만족한다.

DB 설계에서 가장 중요하게 여겨지는 종속성은 BCNF5NF이며 나머지를 목표로 정규화 하는 경우는 드물다