SQL/SQLD

#7 반정규화(De-Normalization)

sundori 2025. 4. 6. 23:19

목차

     

     

    반정규화

    데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정이다.

    반정규화 과정은 거치면 조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 수 있으며 데이터 정합성 이슈가 발생할 수 있다는 점이다.

     

    정합성(整合性, Data Integrity)

    데이터가 일관성 있고, 정확하며 신뢰할 수 있는 상태를 유지하는 것을 말한다.
    즉, 데이터베이스에 저장된 데이터들이 논리적으로 모순 없이 서로 잘 들어맞고, 데이터의 상태가 시스템이 기대하는 규칙과 조건들을 잘 만족하고 있다는 뜻이다.

    만약 정합성이 무너진다면???

    - 고객의 계좌 잔액이 실제보다 더 많거나 적게 표시됨.
    - 주문 내역은 있는데 사용자 정보가 없음.
    - 중복 데이터, 누락된 데이터 발생.
    - 잘못된 통계를 바탕으로 비즈니스 의사 결정이 이루어질 수 있음.

      테이블 반정규화

      테이블 병합 1:1 관계 테이블 병합
      1:M 관계 테이블 병합
      슈퍼 서브 타입 테이블 병합
      테이블 분할 테이블 수직 분할(속성 분할)
      테이블 수평 분할(인스턴스 분할, 파티셔닝)
      테이블 추가 중복 테이블 추가
      통계 테이블 추가
      이력 테이블 추가
      부분 테이블 추가
      1:1 관계 테이블 병합
      회원 + 회원상세 = 회원
      회원번호(PK)
      아이디
      회원이름
      집번호
      회원번호(FK)
      생년월일
      이메일
      주소
      기혼여부
      회원번호(PK)
      아이디
      회원이름
      집번호
      생년월일
      이메일
      주소
      기혼여부
      1:M 관계 테이블 병합
      주문 + 주문상세 = 주문
      주문번호
      주문일자
      회원번호
      결제수단
      주문번호(FK)
      주문상품코드
      주문수량
      상품가격
      주문번호
      주문상품코드
      주문수량
      상품가격
      주문일자
      회원번호
      결제수단


      중복된 데이터가 생길 수 있음(주문일자, 회원번호, 결제수단)

       

      테이블 수직 분할
      회원 / 회원 회원가족
      회원번호
      아이디
      회원명
      핸드폰번호
      가족명
      가족번호
      회원번호
      아이디
      회원명
      핸드폰번호
      회원번호(FK)
      가족명
      가족번호


      자주 사용되는 속성이 아니거나 대부분의 인스턴스가 NULL로 갖고 있을 경우.
      테이블 수평 분할
      주문   주문(2024) 주문(2025)
      주문번호
      주문일자
      회원번호
      결제가격
      배송지
      / 주문번호
      주문일자
      회원번호
      결제가격
      배송지
      주문번호
      주문일자
      회원번호
      결제가격
      배송지
        파티션 기능을 사용해 주문일자에 따라 데이터를 물리적으로 분리.
      테이블 추가
      1.중복 테이블 추가 : 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔터티 추가.  
       
      2.통계 테이블 추가
      주문 -> 지점별 월매출
      주문번호
      주문일자
      지점코드
      회원번호
      결제가격
      지점코드
      매출년월
      매출액

       
      3.이력 테이블 추가
      상품   상품가격 이력
      상품코드
      상품명
      상품가격
      카테고리코드
      -> 상품코드
      변경일자
      상품가격
      변경관리사원번호

      (과거 상품가격에 대한 이력 데이터)
       
      4. 부분 테이블 추가
      회원 -> 회원 회원이메일
      회원번호
      아이디
      회원명
      핸드폰번호
      주소
      이메일
      회원번호
      아이디
      회원명
      핸드폰번호
      주소
      이메일
      회원번호(FK)
      회원명
      이메일

      (회원 대상 다량 메일 발송건으로 메일 발송에 필요한 정보만 부분 테이블로 생성)

      컬럼 반정규화

      1. 중복 컬럼 추가
         업무 프로세스상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측며네서 유리한 경우 고려.

      2. 파생 컬럼 추가

         프로세스 수행 시 부하가 염려되는 계산 값에 대해 미리 컬럼을 추가하여 보관해두는 방식(상품의 재고, 프로모션 할인)

      3. 이력 테이블 컬럼 추가

         대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회의 기준이 될 것으로 보이는 컬럼을 미리 추가해 놓는 것.

       

      관계 반정규화(중복 관계 추가)

      업무 프로세스상 JOIN이 필요한 경우가 많다. 그더라보니 중복 관계를 추가하는 것이 성능 측면에서 유리할 경우 고려한다.

      728x90

      'SQL > SQLD' 카테고리의 다른 글

      #9 SQL  (0) 2025.04.07
      #8 트랜잭션과 NULL  (0) 2025.04.07
      #6 정규화(Normalization)  (2) 2024.12.06
      #5 데이터 모델링(식별자)  (0) 2024.07.15
      #4 데이터 모델링(관계)  (0) 2024.07.09