데이터베이스 설계는 데이터를 효과적으로 관리하고, 일관성 있게 유지하는 데 중요한 역할을 한다. 이 과정에서 정규화, 반정규화 두 개념은 데이터 구조를 정의하고, 쿼리 성능을 최적화하는 데 중요한 역할을 한다.
정규화는 데이터베이스를 설계하는 과정에서 관계형 데이터 모델에서 데이터의 중복성을 제거하여 이상현상을 방지하고, 일관성을 유지하기 위해 데이터를 무손실 분해하는 과정을 의미한다. 함수적 종속성(FD)의 성질을 이용해서 데이터베이스 정규화를 진행한다.
반정규화는 정규화된 데이터베이스 구조를 성능 향상, 개발 및 운영의 단순화 등의 이유로 일부러 중복을 허용하거나, 테이블을 병합하는 과정을 의미한다. 데이터베이스의 성능을 개선하는 데 초점을 맞추지만, 이는 데이터 중복과 데이터 무결성 문제를 불러올 수 있다.
이번 블로그 글에서는 두 가지 설계 방법에 대한 과정과 특징을 이해해보고자 한다.
정규화는 함수적 종속성의 성질을 제거하는 과정을 거친다. 그렇다면 함수적 종속성이란 무엇일까?
함수적 종속성이란 데이터가 가지고 있는 속성 간의 관계에 의해 결정되고 종속되는 현상을 의미한다. 데이터의 기준 값을 결정자(Determinant) 라고 하고, 종속되는 값을 종속자(Dependent)라고 한다.
이때 함수적 종속성의 유형은 크게 4가지로 나뉜다.
정규화는 제거하는 종속성에 따라 여러 단계로 이루어지며, 각 단계는 특정한 목적을 가지고 있다.
| 단계 | 설명 |
|---|---|
| 1차 정규화 | 테이블 내의 속성값을 원자값으로 구성하는 단계 |
| 2차 정규화 | 부분 함수 종속성을 제거하는 단계, 일반 속성은 모두 완전 함수적 종속성 관계 |
| 3차 정규화 | 이행 함수 종속성을 제거하는 단계 |
| BCNF | 결정자 함수 종속성을 제거하는 단계 |
아래 그림을 보면, 이벤트번호와 당첨여부 는 원자값으로 나타나지 않기 때문에 이를 무손실 분해하는 과정을 거친다.
하지만 이렇게 분할한다고 해도, 다음과 같이 갱신, 삭제, 삽입 이상 현상이 발생하게 된다.
(갱신 이상) 고객아이디 apple 인 사람의 등급이 두 가지 도메인 vip, gold 를 가지게 된다.
(삭제 이상) 고객아이디 orange 인 사람을 삭제하면 의도하지 않은 이벤트번호 E004도 같이 삭제된다
(삽입 이상) 이벤트번호 없이 삽입하고자 하면 삽입 불가하다.
1차 정규화 이후, 부분 함수 종속성을 제거하여 아래와 같이 2차 정규화를 진행한다.
하지만, 2차 정규화를 진행해도 이상 현상이 발생한다.
(갱신 이상) 등급 gold 에 대한 할인율을 15%로 임의 조정했을 때, 다른 곳에서는 아직 10%로 유지되어 있다.
(삭제 이상) 등급 vip를 삭제하게 되면 의도하지 않은 banana 도 삭제된다.
(삽입 이상) 필수로 들어가야 하는 고객아이디를 삽입하지 않았으므로, 삽입 이상이 발생한다.
현재 문제점은 고객 아이디를 알게 되면, 등급과 할인율을 알 수 있는데 사실 등급이 할인율을 결정하는 요소가 될 수 있는 이행적 함수 종속성을 가지고 있다.
이를 분해하기 위해 아래와 같은 방법이 사용된다.
3차 정규화까지 마무리되면 대부분의 종속 관계에서 발생하는 이상 현상을 방지할 후 있다. 하지만, 하나의 릴레이션에 여러 개의 후보키가 존재하는 경우, 3차 정규화도 이상 현상이 발생할 수 있는데 모든 결정자가 후보키가 되도록 만들기 위해 BCNF(강한 제 3정규형)을 적용하도록 해야 한다.
아래 그림을 보면, 담당강사번호가 후보키가 아님에도 인터넷강좌 속성을 결정한다는 문제가 발생한다. 후보키가 아닌 결정자로 인해 이상 현상이 발생하기 때문에, 이를 분해하려고 한다.
정규화를 통해 다음과 같은 장점을 가질 수 있다.
반면, 정규화를 하면 데이터 처리 조건에 따라 성능이 향상될 수도 있지만, 반대로 성능이 저하될 수 있다. 일반적으로 데이터 중복이 제거되어 입력, 수정, 삭제의 성능은 향상되지만,정규화로 인해 조인이 증가하는 경우 데이터 조회 성능이 저하될 수 있기 때문이다.
데이터베이스 설계 단계에서 정규화는 데이터의 일관성과 무결성을 보장하는 데 필수적이지만, 성능 요구 사항에 따라 반정규화를 고려해야 할 때가 존재한다. 최적의 설계를 위해 용도와 성능 요구 사항을 분석하여 필요에 따라 정규화를 진행하는 것이 좋을 것 같다.
이와 반대로 반정규화는 성능이 개선되는 방향으로 진행하는 것이기 때문에 다음 장에서 이해해보고자 한다.