본문 바로가기

CS/데이터베이스

데이터 모델과 SQL

728x90

정규화

데이터의 정합성( 데이터의 정확성과 일관성을 유지하고 보장)을 위해 엔티티를 작은 단위로 분리 하는 과정 이다. 정규화를 할 경우 데이터 조회성능은 처리 조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만 입력, 수정, 삭제 성능은 일반적으로 향상된다고 볼 수 있다. 하지만 그렇다고 모든 엔티티를 무작정 분리하면 안되기때문에 정규화를 하기 위한 일정한 룰이 존재한다. 그렇다면 어떤 규칙들이 존재하고 어떤 상황에서 정규화가 필요한지 알아보 도록 하자

제 1 정규형

속성의 값은 반드시 하나의 값만 가져야한다.

제 2 정규형

엔티티의 모든 일반 속성은 반드시 모든 주식별자에 종속되어야한다. 주식별자가 단일식별자가 아닌 복합식별자 인경우 일반속성이 주식별자의 일부에만 종속 될 수 있는데 이런 경우 어떤 문제점이 발생하는지 알아보자.

주문 테이블에 음료코드와 음료명이 있을때 음료명이 바뀌면 음료코드도 같이 바뀌어야하나 하나의 테이블에 존재하기때문에 수정 이상현상이 발생한다. 또한 주문 하지 않은 음료는 존재 할 수 없으므로 데이터 이상현상이 발생 할 수 있다.

제 3 정규형

주식별자가 아닌 모든 속성 간에는 서로 종속 될 수 없다. 정리하자면 일반 속성이 다른 일반 속성에 종속되는 데이터가 발생할 경우 제 3 정규형이 필요하다.

주의사항

과유불급이란 말이 있듯이 적정한 정규화는 성능상 이롭지만 지나친 정규화는 오히려 성능을 저하 시킬 수 있다.

  1. 회원의 배송상태를 조회하려면 여러번 JOIN 해야 함
    1. 반정규화 → 회원 엔티티와 배송 엔티티 간의 관계를 생성하여 성능 개선

반정규화

데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하나 데이터를 그룹핑 하는 과정이다. 여기서 주의 해야 할점은 조회 성능은 향상 될 수 있으나 입력, 수정, 삭제 성능은 저하될 수 있으며 데이터 정합성 이슈가 발생 할 수 있다는 점이다. 반정규화의 과정은 정규화가 끝난 후에 거치게 되며 정규화와 마찬가지로 일정한 룰이 존재한다.

테이블 반정규화

테이블 병합 1:1 관계 테이블 병합

  1:M 관계 테이블 병합
  슈퍼 서브 타입 테이블 병합
테이블 분할 테이블 수직 분할(속성 분할)
  테이블 수평 분할(인스턴스 분할, 파티셔닝)
테이블 추가 중복 테이블 추가
  통계 테이블 추가
  이력 테이블 추가
  부분 테이블 추가

테이블 병합

업무 프로세스상 JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려한다. 1:M 관계 테이블 병합의 경우 1쪽에 해당하는 엔티티의 속성 개수가 많으면 병합했을경우 중복 데이터가 많아지므로 테이블 병합에 적절하지 못하다.

테이블 분할

테이블 수직 분할 : 엔티티의 일부 속성을 별도의 엔티티로 분할(1:1 관계 성립)한다. 자주 사용하는 속성이 아니거나 대부분의 인스턴스가 NULL로 갖고있을때 고려

테이블 수평 분할: 엔티티의 인스턴스를 특정 기준으로 별도의 엔티티로 분할 한다. 파티션 기능을 사용하여 주문일자에 따라서 데이터를 물리적으로 분리 ( 주문일자에 따라 데이터를 물리적으로 분리)

테이블 추가

중복 테이블 추가 : 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔티티를 추가한다.

통계 테이블 추가 : 주문 데이터를 이용하여 월매출 테이블에 통계치를 미리 계산하여 저장

이력 테이블 추가 : 상품가격 이력 테이블에서 과거 상품가격에 대한 데이터를 관리

부분 테이블 추가 : 회원 대상 메일 발송건이 다량으로 생기는 경우 메일 발송에 필요한 정보만 부분 테이블로 생성

컬럼 반정규화

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

파생 컬럼 추가 : 프로세스 수행시 부하가 엄려되는 계산을 미리 컬럼으로 추가하여 보관하는 방식으로 상품의 재고나 프로모션 적용 할인가 등이 이에 속한다.

이력 테이블 컬럼 추가 : 대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식이다. 최신 데이터 여부 등이 이에 해당 할 수 있다.

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

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

성능 데이터 모델링의 순서

  1. 데이터 모델에 맞게 정규화를 한다.
  2. 데이터베이스의 용량 및 트랜잭션 유형을 파악하여 성능 저하를 일으키는 부분이 없는지 검토한다.
  3. 용량과 트랜잭션 유형에 맞게 반정규화를 수행한다.
  4. 성능 향상을 위한 이력모델의 조정, PK/FK 조정, 슈퍼/서브타입 조정 등을 수행한다.
  5. 데이터 모델의 성능을 검증한다.

트랜잭션(Transaction)

데이터르 조작하기 위한 하나의 논리 작업 단위이다. 예를들어 온라인에서 퀴즈의 정답을 맞히면 쿠폰을 즉시 발행해주는 이벤트를 하고 있다고 가정해보자. 쿠폰은 선착순 100명에게만 지급된다. 이 경우 다음 작업은 논리적으로 하나의 단위로 묶어야한다.

  • 이벤트 응모 이력을 저장한다.
  • 쿠폰을 발행한다.

만약 퀴즈의 정답을 맞혀서 이벤트 응모 이력을 정상적으로 저장했으나 그 순간 선착순 100개의 쿠폰이 모두 소진되었다고 했을때 쿠폰 발행은 실패하게 되고 이벤트 응모 이력 또한 롤백되어야 바람직한 시스템이라고 볼 수 있다.

728x90

'CS > 데이터베이스' 카테고리의 다른 글

SQL 활용  (1) 2024.04.14
SQL 기본 및 활용  (0) 2024.04.14
데이터 모델의 이해  (1) 2024.04.14
윈도우 함수 (Window Function)  (0) 2024.04.11
Redis란?  (0) 2023.08.18