1. 데이터 정규화 (Normalization)
정규화는 데이터의 정합성을 위해 작은 단위로 엔티티를 분리하는 과정이다. 데이터 정규화를 하면 조회 성능이 좋아지는 것은 보장할 수 없지만, 데이터가 삽입, 수정, 삭제의 성능은 향상된다.
- 데이터 정합성: 데이터의 정확성과 일관성이 유지 및 보장되는 것으로, 데이터 정규화의 목적!
2. 데이터 정규화의 단계
1. 제1 정규형
rule: "모든 속성은 반드시 하나의 값만 가져야 한다"
제1 정규형의 대상 (아래 조건들이 해소되면, 제1 정규형이 완료된 상태라고 한다)
- 한 속성에 한번에 여러 개의 값을 가지는 경우
➡️ 속성 당 하나의 값만 갖도록 여러 개의 인스턴스로 분리
- 유사한 속성 (논리적으로 같은 유형의 데이터)이 반복되는 경우
➡️ 한 테이블에 (이름(주식별자), 나이, 연락처1, 연락처2, 연락처3) 과 같이 속성이 있었다면 (이름(주식별자), 나이, 연락처1), (이름(주식별자), 나이, 연락처2), (이름(주식별자), 나이, 연락처3) 과 같이 3개의 테이블로 분리한다.
2. 제2 정규형
rule: "엔티티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 한다."
제2 정규형의 대상 (아래 조건이 해소되면, 제2 정규형이 완료된 상태라고 한다)
- 주식별자가 복합식별자일 때, 일반속성이 주식별자의 일부에만 종속되는 경우
➡️ 한 테이블에 (주분번호(복합식별자1), 음료코드(복합식별자2), 주문수량, 음료명) 과 같이 속성이 있을 때, 주문수량 속성은 두 식별자에 모두 종속되지만 음료명은 음료코드 식별자에만 종속된다. 이런 경우 (주분번호(복합식별자1), 음료코드(복합식별자2), 주문수량), (음료코드(단일식별자), 음료명)와 같이 테이블을 분리한다.
3. 제3 정규형
rule: "주식별자가 아닌 모든 속성 간에는 종속관계가 있으면 안된다."
제3 정규형의 대상 (아래 조건들이 해소되면, 제3 정규형이 완료된 상태라고 한다)
- 일반 속성 간에 종속관계가 있는 경우
➡️ 한 테이블에 (아이디(주식별자), 생년월일, 국가코드, 국가)와 같이 있을 때, 주식별자가 아닌 국가코드, 국가 속성 사이에 종속관계가 있다. 이런 경우, (아이디(주식별자), 생년월일, 국가코드), (국가코드, 국가)와 같이 테이블을 분리한다.
3. 반정규화 (De-Normalization)
데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정이다. 반정규화는 모든 정규화를 마친 후 성능상 이슈가 있을 때만 고려하는 것이 원칙이다. 정규화와 반대로 조회 성능은 향상될 수 있으나, 삽입, 삭제, 수정 성능은 저항될 수 있으며, 데이터 정합성 이슈가 발생할 수 있다.
1. 테이블 반정규화
1. 테이블 병합
- 1:1 관계 테이블 병합
i.e. 회원 테이블 & 회원 상세 테이블
- 1:M 관계 테이블 병합 (중복된 데이터가 생길 수 있음)
i.e. 주문 테이블 & 주문 상세 테이블(주문건 내 상품 별 수량과 가격 나타냄)
- 슈퍼 서브 타입 테이블 병합
2. 테이블 분할
- 테이블 수직분할 (속성분할)
i.e. 기존 회원정보와 회원 배우자 정보까지 함께 있던 테이블 => 회원테이블 & 회원배우자 테이블
- 테이블 수평분할==파티셔닝 (인스턴스분할): 엔티티의 인스턴스를 특정 기준으로 별도의 엔티티로 분할
i.e. 주문 테이블 => 주문 2020 테이블 & 주문 2021 테이블 (주문년도 기준으로 인스턴스 분리)
3. 테이블 추가
- 중복 테이블 추가: 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우
- 통계 테이블 추가: 통계치를 별도 테이블에 미리 계산하여 저장
- 이력 테이블: 데이터의 과거 변천사 확인을 위해 이력 테이블을 별도로 생성하여 데이터 변경 시 마다 이력 추가하여 관리
- 부분 테이블 추가: 특정 속성만 가지는 엔티티를 따로 생성
i.e. 회원(회원번호, 아이디, 회원명, 이메일) => 회원 (회원번호, 아이디, 회원명, 이메일), 회원이메일(회원번호, 이메일) -- 회원을 대상으로한 메일 발송건이 다량으로 생기는 경우 등에 필요!
2. 컬럼 반정규화
- 중복 컬럼 추가: JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 상 유리한 경우
- 파생 컬럼 추가: 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관
i.e. 상품의 프로모션 할인가
- 이력 테이블에서의 컬럼 추가: 대량의 이력 테이블 조회 시 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해놓음
i.e. 최신 데이터 여부 ("Y", "N")