[DB/SQLD] 정규화, 반정규화, 분산 데이터베이스

4 분 소요

정규화(Normalization)

정규화는 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 방법이며 데이터를 분해하는 과정이다.

정규화는 데이터 중복을 제거하고 데이터 모델의 독립성을 확보하기 위한 방법이다.

정규화를 수행하면 비즈니스에 변화가 발생해도 데이터 모델의 변경을 최소화할 수 있다.

정규화는 1정규화부터 5정규화까지 있지만, 실질적으로 제3정규화까지만 수행한다.

정규화를 하지 않게되면 이상현상(Anomaly)가 발생할 수 있다.

정규화된 모델은 테이블을 분리한다.

정규화는 함수적종속성(Functional Dependency)를 근거로 한다.

정규화 절차

정규화 절차 설명
제1정규화 속성의 원자성을 확보하고 기본키를 설정한다.
제2정규화 기본키가 2개 이상의 속성으로 이루어진 경우, 부분 함수 종속성을 제거(분해)한다.
제3정규화 기본키를 제외한 칼럼 간에 종속성을 제거한다. 즉 이행 함수 종속성을 제거한다.
BCNF 기본키를 제외하고 후보키가 있는 경우, 후보키가 기본키를 종속시키면 분해한다.
제4정규화 여러 칼럼들이 하나의 칼럼을 종속시키는 경우 분해해 다중값 종속성을 제거한다.
제5정규화 조인에 의해서 종속성이 발생되는 경우 분해한다.

함수적 종속성

정규화는 함수적 종속성을 근거로 한다.

함수적 종속이란 어떤 릴레이션 R이 있을때 X와 Y를 각각 속성의 부분집합이라고 가정한다. 여기서 X의 값을 알면 Y의 값을 바로 식별할 수 있고, X의 값에 Y의 값이 달라질 때, Y는 X에 함수적 종속이라고 한다. 이 경우 X를 결정자, Y를 종속자라고 한다. 이를 기호로 표현하면 X→Y이다.

이런 함수적 종속관계에는 완전 함수적 종속과 부분 함수적 종속 및 이행적 함수 종속이 있다.

제1정규화

기본키를 잡는것이 제1 정규화이다.

제2정규화

부분함수 종석성과 관련된 것으로, 부분 함수 종속성이란 기본키가 2개 이상의 칼럼으로 이루어진 경우에 발생한다.

만약 기본키가 하나의 칼럼으로 이루어지면 제2정규화는 생략된다.

만약 부분함수 종속성이 발생하면 테이블을 분해해야 한다.

제3정규화

제3정규화는 이행 함수 종속성을 제거한다.

이행함수 종속성이란 기본키를 제외하고 칼럼간에 종속성이 발생하는 것이다.

BCNF(Boyce-Codd Normal Form)

BCNF는 복수의 후보키가 있고, 후보키들이 복합 속성이어야하며 서로 중첩되어야 한다.



정규화 성능

정규화는 테이블을 분해해서 데이터 중복을 제거하기 때문에 데이터 모델의 유연성을 높인다.

하지만 이렇게 분해된 테이블을 조회할 때 조인을 유발하기 때문에 CPU와 메모리를 많이 사용한다.

이러한 비효율을 해결하기위해 인덱스와 옵티마이저가 있다.

그럼에도 조인이 부하를 일으키는 건 사실이다.

이러한 정규화의 문제를 해결하기 위해 반정규화를 통해 하나의 테이블에 저장해 조인을 통한 성능 저하를 해결한다.

하지만 이러한 반정규화 역시 데이트 중복이라는 다른 문제점을 발생시킨다. 한 테이블에 너무 많은 칼럼이 추가되면 한 개 행의 크기가 데이터베이스 관리 시스템의 입출력 단위인 블록의 크기를 넘어서게 된다. 그렇게 되면 한 개의 행을 읽기 위해 여러개의 블록을 읽어야 한다. 한 행을 읽기 위해 여러 개의 블록을 읽게되면 디스크 입출력이 증가해 성능이 떨어진다. 반정규화는 이러한 문제점을 일으킬 가능성이 있다.

그래서 정규화는 입출력 데이터의 양을 줄여서 성능을 향상시킬 수 있다.



반정규화(De-Normalization)

데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법이다.

반정규화를 통해 조회 속도를 향상시키지만, 데이터 모델의 유연성은 낮아진다.

반정규화를 수행하는 경우

  • 정규화에 충실하면 종속성, 활용성이 향상되지만 수생 속도가 느려지는 경우.
  • 다량의 범위를 자주 처리해야 하는 경우
  • 특정 범위의 데이터만 자주 처리하는 경우
  • 요약/집계 정보가 자주 요구되는 경우

반정규화 절차

  1. 대상 조사 및 검토 : 데이터 처리 범위, 통계성 등을 확인해 반정규화 대상을 조사.
  2. 다른 방법 검토 : 반정규화를 수행하기 전에 다른 방법이 있는지 검토. 예로 들어 클러스터링, 뷰, 인덱스 튜닝, 응용 프로그램, 파티션 등을 검토.
  3. 반정규화 수행 : 테이블, 속성, 관계 등을 반정규화 한다.
  • 클러스터링 : 클러스터링 인덱스라는 것은 인덱스 정보를 저장할 때 물리적으로 정렬해서 저장하는 방법으로 조회시에 인접한 블록을 연속적으로 읽기 때문에 성능이 향상된다.

반정규화 기법

  1. 계산된 칼럼 추가 : 배치 프로그램으로 총판매액, 평균잔고, 계좌평가 등을 미리 계산하고, 그 결과를 특정 칼럼에 추가한다.

  2. 테이블 수직분할 : 하나의 테이블을 두 개 이상의 테이블로 분해한다. 즉, 칼럼을 분할해 새로운 테이블을 만든다.

  3. 테이블 수형분할 : 하나의 테이블에 있는 값을 기준으로 테이블을 분할하는 방법.

  • 테이블 파티션 기법에는 Range, List, Hash, Composite Partition 기법이 있다. 파티션 테이블의 장점은 데이터 조회 시에 엑세스 범위가 줄어들어 성능이 향상되고, 데이터가 분할되어 있어 I/O의 성능이 향상된다. 또 각 파티션을 독립적으로 백업 및 복구가 가능하다.
  1. 테이블 병합 : 1대1 관계의 테이블을 하나의 테이블로 병합해서 성능을 향상시킨다. 1대N 관계의 테이블을 병합해 성능을 향상시킨다. 하지만 많은 양의 데이터 중복이 발생한다. 슈퍼 타입과 서브 타입 관계가 발생하면 테이블을 통합해 성능을 향상시킨다.
  • super type과 sub type : 부모와 자식 간의 관계가 나타나는 것으로 고객엔터티는 개인고객과 법인 고객으로 분류될때, 고객 엔터티는 슈퍼 타입이고 개인고객과 법인고객은 서브타입이 된다. 슈퍼 타입과 서브 타입의 관계는 배타적 관계와 포괄적 관계가 있는데, 베타적 관계는 고객이 개인고객이거나 법인고객인 경우를 의미하고, 포괄적 관계는 고객이 개인고객일 수도 있고 법인고객이 수도 있는 것이다.

  • 슈퍼타입과 서브타입 변환 방법

변환방법 설명
OneToOne Type 슈퍼타입과 서브타입을 개별 테이블로 도출. 테이블의 수가 많아서 조인이 많이 발생하고 관리가 어렵다.
Plus Type 슈퍼타입과 서브타입 테이블로 도출. 조인이 발생하고 관리가 어렵다.
Single Type 슈퍼타입과 서브타입을 하나의 테이블로 도출. 조인 성능이 좋고 관리가 편하지만, 입출력 성능이 나쁘다.



분산 데이터베이스

데이터베이스 시스템 구축 시 한대의 물리적 시스템에 데이터베이스 관리 시스템을 설치하고 여러명의 사용자가 접속해 데이터베이스를 사용하는 것을 중앙 집중형 데이터베이스라고 한다.

물리적으로 떨어진 데이터베이스에 네트워크로 연결해 단일 데이터베이스 이미지를 보여 주고 분산된 작업 처리를 수행하는 데이터베이스를 분산 데이터베이스라고 한다.

분산 데이터베이스는 사용자는 시스템이 네트워크로 분산되어 있는지의 여부를 인식하지 못한다. 이처럼 데이터베이스는 투명성을 제공해야 하는데 투명성은 분산데이터베이스에 중요한 요소이며 투명성의 종류에는 분할, 위치, 지역사상, 중복, 장애 및 병행 투명성이 있다.

분산 데이터베이스를 구축하거나 운영할 때 동일한 데이터베이스 관리 시스템으로 분산 데이터베이스를 구축하는 것은 크게 어렵지 않다. 하지만 기업에 여러 종류의 데이터베이스 관리시스템이 있으면 이기종 데이터베이스 관리 시스템으로 연동해야 한다. 이기종 데이터베이스 시스템으로 연동하기 위해서는 데이터베이스 미들웨어(ODBC, JDBC)를 사용해야 한다.

  • 장점 : 데이터베이스 신뢰성과 가용성이 높고 병렬처리를 수행해 빠른 응답이 가능하다. 또 분산 데이터베이스를 추가해 시스템 용량 확장이 쉽다.
  • 단점 : 데이터베이스가 여러 네트워크를 통해 분리되어 있어 관리와 통제가 어렵고 보안관리가 어렵다. 데이터 무결성 관리가 어렵다. 데이터베이스 설계가 복잡하다.



분산 데이터베이스 설계방식

  1. 상향식 설계 방식 : 지역 스키마 작성 후 전역 스키마를 작성.

  2. 하향식 설계 방식 : 전역 스키마 적성 후 지역 사상 스키마를 작성.