[Database] 이상 / 정규화 / 반정규화
DB를 이용할 때, 특정 조건을 충족하면 여러 문제를 야기할 수 있다.
이를 이상이라고 하며, 아래 내용을 통해 그 종류를 알 수 있다.
1. 이상 (Anomaly)
이상이란 DB에서 중복된 데이터 구조로 인하여 예기치 못하게 발생하게 되는 현상이다.
이상의 종류에는 3가지가 있다.
삽입 이상 : 데이터를 DB에 Insert 할 때, 의도하지 않은 값들이 같이 입력이 되는 현상
- Ex : 특정 속성의 값만 추가하고자 할 때, 다른 속성 값이 비게 되며 부분이 Null 값으로 입력되거나 데이터의 삽입이 실패하는 현상을 볼 수 있다.
삭제 이상 : 하나의 튜플을 삭제할 때, 의도하지 않은 값들과 함께 삭제되는 현상
- Ex : 특정 속성 값을 기준으로 튜플을 삭제하면 다른 속성들과 함께 삭제가 돼버리는 현상
갱신 이상 : 특정 튜플의 속성 값을 갱신했을 때, 개념적으로 해당 튜플을 참조하는 다른 데이터와 서로 다른 값을 가질 수 있는 현상
- Ex : A 테이블에 사과의 가격은 3000원이고 B 테이블에서 사과라는 데이터를 개념적으로 참조하고 중복으로 사과가 3000원이라고 입력이 되어 있을 때, A 테이블의 사과 가격이 바뀌면 B 테이블과 개념적으로 같은 사과지만 가격이 다르게 된다.
이러한 이상 현상들을 해결하기 위해서 정규화라는 작업이 존재한다.
2. 정규화 (Normalization)
- 테이블의 분해를 통하여 데이터의 일관성을 보장하고, 중복을 최소화 시키며, 데이터의 유연성을 축소시킨다.
- 정규화된 모델은 중복된 데이터를 기준으로 테이블이 나뉘게 되고 외래키를 기준으로 테이블 간의 Join을 수행하며 데이터를 결합한다.
이렇게 테이블을 분리하면서 중복이 제거가 되고, 중복 데이터의 수정을 해야 하는 테이블이
하나로 줄어들기 때문에 데이터의 일관성을 보장할 수 있는 것이다.
위는 가장 기본적인 정규화의 예시이고, 정규화는 다음과 같은 단계로 구분된다.
- 제1 정규화 : 속성의 원자성을 확보하고, 중복값을 제거하여 기본키(PK)를 설정한다.
- 제2 정규화 : 기본키가 2개 이상인 속성의 부분 함수 종속성을 제거하고 복합 인스턴스의 종속적 중복을 삭제
- 제3 정규화 : 기본키를 제외한 컬럼 간의 종속성 제거(이행 함수 종속성 제거)
- BCNF(Boyce-Codd) 정규화 : 후보키가 있을 때, 복합 속성이어야 하며 기본키를 종속시키면 분해
- 제4 정규화 : 다수의 칼럼이 하나의 칼럼을 종속시킬 때, 분해하여 다치 종속성을 제거
- 제5 정규화 : 조인(Join)에 의해 종속성이 발생하면 분해
하지만 정규화로 인하여 생기는 문제점 또한 발생한다.
- 데이터 조회 시 많은 Join을 유발하기 때문에 CPU 및 메모리를 많이 사용
- 데이터 조회 시 많은 릴레이션 간 분리와 Join으로 인하여 느린 응답 시간
이 문제점을 해결하기 위해서 정규화의 반대되는 개념이 등장했고,
이를 반정규화 또는 비정규화라고 한다.
3. 반 정규화 (De-Normalization)
반 정규화는 말 그대로 정규화에 반대가 되는 개념이다.
데이터의 중복을 허용하고 Join을 줄이는 방향으로 DB를 설계하며,
이로 인한 데이터 조회의 성능을 끌어올릴 수 있다는 장점을 가지고 있다.
다음은 반 정규화를 사용하는 케이스이다.
- 정규화를 통한 설계로 수행 속도가 느려진 경우
- 많은(또는 특정) 범위의 데이터를 자주 다루는 경우
- 집계와 요약이 자주 요구되는 경우
반 정규화는 다양한 방식으로 처리할 수 있는데, 아래에서 반 정규화 기법을 알아볼 수 있다.
- 집계와 요약 중심의 칼럼을 추가
- 테이블 수직/수평 분할 (분할 시 다양한 기준으로 파티션을 수행할 수 있다)
- 테이블 병합 (1:1, 1:N 관계 테이블 병합, 슈퍼 타입과 서브 타입의 테이블을 통합)
DB를 설계할 때, 정해진 답이 없고 사용될 의도에 따라 정규화와 반 정규화를 적절히 이용하여
가장 효과적으로 설계를 하는 것이 좋을 것 같다.