본문 바로가기
Computer-Sience/Database

[Database] 이상 / 정규화 / 반정규화

by dev_ss 2023. 4. 11.

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를 설계할 때, 정해진 답이 없고 사용될 의도에 따라 정규화와 반 정규화를 적절히 이용하여

가장 효과적으로 설계를 하는 것이 좋을 것 같다.

반응형

'Computer-Sience > Database' 카테고리의 다른 글

[Database] N + 1  (0) 2023.04.12
[Database] Index  (0) 2023.02.12
[Database] Transaction(트랜잭션)  (0) 2023.02.11