본문 바로가기

DB

정규화와 반정규화

    1. 제1정규화
    📌 한 속성에 여러 개의 속성이 포함되어 있거나 같은 유형의 속성이 여러 개로 나눠져있는 경우 해당 속성을 분리정규화는 함수적 종속성을 근거로 합니다. 함수적 종속성(Functional Dependency)이란 데이터들이 어떤 기준값에 의해 종속되는 현상을 의미합니다. 이때 기준값을 '결정자'라고 하고 종속값을 '종속자'라고 합니다.

 

  • 종속자는 함수 종속성을 갖게 되며 결정자에 의해 종속자가 결정되는 구조입니다.이름, 출생지, 주소는 주민등록번호에 대해 함수 종속성을 갖습니다. 여기서 이름, 출생지, 주소는 주민등록번호가 결정하기 때문에 '종속자'라고 볼 수 있고 주민등록번호는 이들을 결정하기 때문에 '결정자'라고 볼 수 있습니다.
    • 회원정보아이디 나이 성별 회원구분 연락처 
      justin 33 일반 010-1234-1234, justin@email.kr
      ed 45 일반 010-2456-1234, ed@email.kr
      chelsea 27 프리미엄 010-1256-7895, chelsea@email.kr
    위에서 발생한 문제를 해결하기 위해서는 아래와 같은 작업이 필요합니다.
    • 회원 정보아이디 나이 성별 회원구분
      justin 33 일반
      ed 45 일반
      chelsea 27 프리미엄
    • 회원 연락처아이디 연락처 구분 연락처
      justin 핸드폰 010-1234-1234
      justin 이메일 justin@email.kr
      ed 핸드폰 010-2456-1234
      ed 이메일 ed@email.kr
      chelsea 핸드폰 010-1256-7895
      chelsea 이메일 chelsea@email.kr
    우선 회원 정보 테이블에서 연락처 속성 삭제합니다. 회원 연락처 테이블에서 속성의 경우 연락처를 구분할 수 있는 칼럼과 그에 해당하는 연락처 칼럼을 따로 두어 구분하였습니다. 하나의 칼럼이 여러 개의 속성값을 갖기 때문에 이를 분리하였고 결과적으로 제1정규형을 만족한다고 할 수 있습니다.
      1. 제1정규화
      <aside> 📌 한 속성에 여러 개의 속성이 포함되어 있거나 같은 유형의 속성이 여러 개로 나눠져있는 경우 해당 속성을 분리정규화는 함수적 종속성을 근거로 합니다. 함수적 종속성(Functional Dependency)이란 데이터들이 어떤 기준값에 의해 종속되는 현상을 의미합니다. 이때 기준값을 '결정자'라고 하고 종속값을 '종속자'라고 합니다.종속자는 함수 종속성을 갖게 되며 결정자에 의해 종속자가 결정되는 구조입니다.이름, 출생지, 주소는 주민등록번호에 대해 함수 종속성을 갖습니다. 여기서 이름, 출생지, 주소는 주민등록번호가 결정하기 때문에 '종속자'라고 볼 수 있고 주민등록번호는 이들을 결정하기 때문에 '결정자'라고 볼 수 있습니다.
      • 회원정보아이디 나이 성별 회원구분 연락처
        justin 33 일반 010-1234-1234, justin@email.kr
        ed 45 일반 010-2456-1234, ed@email.kr
        chelsea 27 프리미엄 010-1256-7895, chelsea@email.kr
      위에서 발생한 문제를 해결하기 위해서는 아래와 같은 작업이 필요합니다.
      • 회원 정보아이디 나이 성별 회원구분
        justin 33 일반
        ed 45 일반
        chelsea 27 프리미엄
      • 회원 연락처아이디 연락처 구분 연락처
        justin 핸드폰 010-1234-1234
        justin 이메일 justin@email.kr
        ed 핸드폰 010-2456-1234
        ed 이메일 ed@email.kr
        chelsea 핸드폰 010-1256-7895
        chelsea 이메일 chelsea@email.kr
      우선 회원 정보 테이블에서 연락처 속성 삭제합니다. 회원 연락처 테이블에서 속성의 경우 연락처를 구분할 수 있는 칼럼과 그에 해당하는 연락처 칼럼을 따로 두어 구분하였습니다. 하나의 칼럼이 여러 개의 속성값을 갖기 때문에 이를 분리하였고 결과적으로 제1정규형을 만족한다고 할 수 있습니다.

 

 

2) 제2정규화

 

제 1정규화를 만족시키고 PK가 아닌 모든 칼럼은 PK 전체에 종속

 

만약 PK에 종속되지 않거나 PK 중에서 일부의 칼럼에만 종속되는 칼럼이 있다면 이는 분리시켜야 합니다.

PK 값은 해당 테이블의 어떤 속성과도 종속관계를 갖는다는 사실을 알고 있습니다. 아래 고객 주문 테이블에서 PK는 고객 아이디와 주문 순번의 복합 속성으로 구성되어 있습니다. 복합 식별자(PK)를 기준으로 놓고 볼 때 '고객 이름'과 '고객 등급' 속성은 '고객 아이디' 속성에는 종속되지만 '주문 아이템'이라는 속성에는 종속되지 않습니다. 고객 이름과 고객 등급의 값을 결정하는 기본키를 구성하는 칼럼은 고객 아이디 하나이고 '주문 순번'은 이에 영향을 주지 않습니다.

이러한 경우의 문제점은 특정한 데이터를 갱신하려고 할 때 갱신 이상(Modification Anomaly) 현상이 발생할 가능성이 큽니다. 또한 고객 정보를 모르면 주문 할 수 없는 경우가 생길 수 있습니다.

 

 

참고 - 갱신 이상(Modification Anomaly) 반복되는 데이터 중에서 일부를 갱신할 때 데이터가 일치하지 않는 문제를 의미합니다. 특정한 값을 갖는 행을 수정 할 경우에 해당 값을 공유하는 모든 행을 변경해 주지 않으면 업데이트 된 내용이 일치하지 않게 됩니다. 이런 경우를 갱신 이상이 발생했다고 표현합니다.

 

 

 

 

 

 

 

테이블을 분리하여 고객 정보를 위한 식별자를 추가하여 문제를 해결할 수 있습니다. 테이블을 2개로 분리하고 고객 정보는 고객 아이디 식별자에 종속될 수 있도록 구성하여 복합 식별자의 일부 칼럼에만 종속되는 문제를 해결 했음을 확인할 수 있습니다. 이렇게 제 2정규화 작업을 수행할 수 있습니다.

 

 

정규화

 

제1정규화
- 모든 속성은 반드시 하나의 값을 가져야 합니다. - 한 속성에 여러 속성값을 부여하거나 같은 유형의 속성이 여러 개인 경우 해당 속성을 분리합니다. (속성의 원자성 확보)
제2정규화
주식별자에 완전하게 함수 종속되지 않은 속성을 분리하여 종속 관계를 구성합니다. (부분종속 속성을 분리)
제3정규화
일반 속성간의 함수 종속성이 발생하지 않도록 분리합니다. (이전종속 속성을 분리)
보이스 - 코드 정규화 (BCNF)
결정자 안에 함수 종속을 가진 주식별자 속성을 분리합니다.
제4정규화
다치 종속성(Multi-Valued Dependency)을 제거합니다.
제5정규화
조인 속성(Join Dependency)을 제거합니다.

 

 

 

 

 

반정규화

반정규화 (혹은 역정규화)에서 '반'이 갖는 의미는 '절반'이 아닌 '반대'입니다. 정규화를 수행하지 않은 모델을 지칭할 때 사용합니다. 반정규화는 성능 향상에 그 목적이 있습니다. 정규화는 성능 향상을 목적으로 중복된 데이터를 지우는 과정이었습니다. 반정규화는 정규화와 동일하게 '성능 향상'이라는 목적을 갖지만 데이터의 중복을 통해 목적을 달성한다는 측면에서 다른 의미를 지닙니다.

데이터의 정확성과 일관성을 의미하는 '데이터 무결성'의 측면에서 바라보면 반정규화는 있어서는 안 될 일이지만 그럼에도 데이터를 중복하여 반정규화를 적용하는 상황을 아래와 같이 정리해 볼 수 있습니다.

  1. 데이터를 조회할 때 디스크 I/O량이 많아서 성능이 저하되는 경우입니다.
  2. 테이블 간 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되는 경우입니다.
  3. 칼럼을 계산하여 읽을 때 성능이 저하될 것이라고 예상하는 경우입니다.

 

 

 

 

반정규화 기법

1) 테이블 반정규화 2) 칼럼의 반정규화 3) 관계에서의 반정규화

 

1. 테이블 반정규화

테이블 반정규화는 테이블 병합, 테이블 분할, 테이블 추가 이렇게 3가지로 나눠집니다.

1) 테이블 병합 : 여러개의 테이블을 하나로 합치는 과정, 테이블을 병합하면 데이터를 중복 저장하게 되지만 조회 과정의 성능 향상을 위해서 수행

 

 

2) 테이블 분할 : 특정 테이블을 여러 개의 테이블로 나누는 것을 의미

3) 테이블 추가 : 특정 테이블을 추가하는 것을 의미, 데이터의 중복 저장의 비효율이 발생하더라도 조회의 성능을 높이기 위해 사용

 

2. 칼럼 반정규화

 

 

참고 - 복합키(Composite Key) 기본키로 사용할 수 있는 칼럼이 없을 때 2개 이상의 키를 합쳐 하나의 기본키로 활용하는 것을 의미합니다. 데이터를 대표하는 키가 여러 개의 칼럼으로 구성된 것을 의미합니다. 복합키를 사용하는 경우 SELECT 문을 사용하여 WHERE을 통해 조건을 건 조회를 할 때 어떻게 조회하는지에 따라서 쿼리 성능이 많이 달라집니다.

 

칼럼의 반정규화는 특정 칼럼을 추가하여 데이터 모델 내에서 중복으로 데이터가 저장됨에도 성능을 향상시킬 수 있는 방법입니다.

중복 칼럼을 추가하여 조인 연산을 제거, 추가 칼럼을 만들어 계산된 값을 미리 만들어 놓고 보여주는 형태로 연산 감소, 이력 테이블에 특정 칼럼을 추가해서 조회 성능 향상, PK 칼럼 내에 특정한 규칙에 의해 데이터가 저장되어 있지만 일반 칼럼으로 만드는 방법, 응용 시스템의 오작동을 위해 칼럼을 추가시키는 방법이 있습니다.

 

 

3. 관계 반정규화

여러 경로에 걸쳐 테이블 조인을 하는 경우 조인 연산 자체를 줄여서 조회 성능을 향상시키는 방법입니다. 만약 A → B → C 형태로 테이블 조인이 발생한다면 A → C로 줄이는 것이 관계 반정규화의 목적입니다. 관계 반정규화는 데이터 무결성을 위반하더라도 데이터 처리를 할 때 성능을 향상시키기 위해 사용하는 반정규화 기법입니다.

'DB' 카테고리의 다른 글

UML (Unified Modeling Language)  (0) 2024.02.25
컬럼의 Key속성 - FK와 MUL  (0) 2023.11.16
[Redis] 1. AWS elasticache  (0) 2023.07.15
29. DB 파티셔닝, 샤딩, 레플리케이션  (0) 2023.07.09
25. DB 인덱스  (0) 2023.07.06