정규화
데이터의 정합성( 데이터의 정확성과 일관성을 유지하고 보장)을 위해 엔티티를 작은 단위로 분리 하는 과정 이다. 정규화를 할 경우 데이터 조회성능은 처리 조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만 입력, 수정, 삭제 성능은 일반적으로 향상된다고 볼 수 있다. 하지만 그렇다고 모든 엔티티를 무작정 분리하면 안되기때문에 정규화를 하기 위한 일정한 룰이 존재한다. 그렇다면 어떤 규칙들이 존재하고 어떤 상황에서 정규화가 필요한지 알아보 도록 하자
제 1 정규형
속성의 값은 반드시 하나의 값만 가져야한다.
제 2 정규형
엔티티의 모든 일반 속성은 반드시 모든 주식별자에 종속되어야한다. 주식별자가 단일식별자가 아닌 복합식별자 인경우 일반속성이 주식별자의 일부에만 종속 될 수 있는데 이런 경우 어떤 문제점이 발생하는지 알아보자.
주문 테이블에 음료코드와 음료명이 있을때 음료명이 바뀌면 음료코드도 같이 바뀌어야하나 하나의 테이블에 존재하기때문에 수정 이상현상이 발생한다. 또한 주문 하지 않은 음료는 존재 할 수 없으므로 데이터 이상현상이 발생 할 수 있다.
제 3 정규형
주식별자가 아닌 모든 속성 간에는 서로 종속 될 수 없다. 정리하자면 일반 속성이 다른 일반 속성에 종속되는 데이터가 발생할 경우 제 3 정규형이 필요하다.
주의사항
과유불급이란 말이 있듯이 적정한 정규화는 성능상 이롭지만 지나친 정규화는 오히려 성능을 저하 시킬 수 있다.
- 회원의 배송상태를 조회하려면 여러번 JOIN 해야 함
- 반정규화 → 회원 엔티티와 배송 엔티티 간의 관계를 생성하여 성능 개선
반정규화
데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하나 데이터를 그룹핑 하는 과정이다. 여기서 주의 해야 할점은 조회 성능은 향상 될 수 있으나 입력, 수정, 삭제 성능은 저하될 수 있으며 데이터 정합성 이슈가 발생 할 수 있다는 점이다. 반정규화의 과정은 정규화가 끝난 후에 거치게 되며 정규화와 마찬가지로 일정한 룰이 존재한다.
테이블 반정규화
테이블 병합 1:1 관계 테이블 병합
1:M 관계 테이블 병합 | |
슈퍼 서브 타입 테이블 병합 | |
테이블 분할 | 테이블 수직 분할(속성 분할) |
테이블 수평 분할(인스턴스 분할, 파티셔닝) | |
테이블 추가 | 중복 테이블 추가 |
통계 테이블 추가 | |
이력 테이블 추가 | |
부분 테이블 추가 |
테이블 병합
업무 프로세스상 JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려한다. 1:M 관계 테이블 병합의 경우 1쪽에 해당하는 엔티티의 속성 개수가 많으면 병합했을경우 중복 데이터가 많아지므로 테이블 병합에 적절하지 못하다.
테이블 분할
테이블 수직 분할 : 엔티티의 일부 속성을 별도의 엔티티로 분할(1:1 관계 성립)한다. 자주 사용하는 속성이 아니거나 대부분의 인스턴스가 NULL로 갖고있을때 고려
테이블 수평 분할: 엔티티의 인스턴스를 특정 기준으로 별도의 엔티티로 분할 한다. 파티션 기능을 사용하여 주문일자에 따라서 데이터를 물리적으로 분리 ( 주문일자에 따라 데이터를 물리적으로 분리)
테이블 추가
중복 테이블 추가 : 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔티티를 추가한다.
통계 테이블 추가 : 주문 데이터를 이용하여 월매출 테이블에 통계치를 미리 계산하여 저장
이력 테이블 추가 : 상품가격 이력 테이블에서 과거 상품가격에 대한 데이터를 관리
부분 테이블 추가 : 회원 대상 메일 발송건이 다량으로 생기는 경우 메일 발송에 필요한 정보만 부분 테이블로 생성
컬럼 반정규화
중복 컬럼 추가 : 업무 프로세스상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려한다.
파생 컬럼 추가 : 프로세스 수행시 부하가 엄려되는 계산을 미리 컬럼으로 추가하여 보관하는 방식으로 상품의 재고나 프로모션 적용 할인가 등이 이에 속한다.
이력 테이블 컬럼 추가 : 대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식이다. 최신 데이터 여부 등이 이에 해당 할 수 있다.
관계 반정규화(중복 컬럼 추가)
업무 프로세스상 JOIN이 필요한 경우가 많아 중복 관계를 추가하는 것이 성능 측면에서 유리할 경우 고려한다.
성능 데이터 모델링의 순서
- 데이터 모델에 맞게 정규화를 한다.
- 데이터베이스의 용량 및 트랜잭션 유형을 파악하여 성능 저하를 일으키는 부분이 없는지 검토한다.
- 용량과 트랜잭션 유형에 맞게 반정규화를 수행한다.
- 성능 향상을 위한 이력모델의 조정, PK/FK 조정, 슈퍼/서브타입 조정 등을 수행한다.
- 데이터 모델의 성능을 검증한다.
트랜잭션(Transaction)
데이터르 조작하기 위한 하나의 논리 작업 단위이다. 예를들어 온라인에서 퀴즈의 정답을 맞히면 쿠폰을 즉시 발행해주는 이벤트를 하고 있다고 가정해보자. 쿠폰은 선착순 100명에게만 지급된다. 이 경우 다음 작업은 논리적으로 하나의 단위로 묶어야한다.
- 이벤트 응모 이력을 저장한다.
- 쿠폰을 발행한다.
만약 퀴즈의 정답을 맞혀서 이벤트 응모 이력을 정상적으로 저장했으나 그 순간 선착순 100개의 쿠폰이 모두 소진되었다고 했을때 쿠폰 발행은 실패하게 되고 이벤트 응모 이력 또한 롤백되어야 바람직한 시스템이라고 볼 수 있다.
'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 |