Ch 2. 데이터 모델과 SQL
1. 정규화
💡 정규화는 데이터의 정확성과 일관성을 보장하기 위해 엔터티를 작은 단위로 분리하는 과정이다.
정규화를 할 경우 일반적으로 입력, 수정, 삭제 성능이 향상된다.
또한, 정규화에는 일정한 규칙이 존재한다.
✏ 제1정규형
- 모든 속성은 반드시 하나의 값만 가져야 한다. (도메인이 원자값이어야 한다)
- e.g. 하나의 속성에 여러 개의 값이 있는 경우, 유사한 속성이 반복되는 경우
✏ 제2정규형
- 모든 일반 속성은 모든 주식별자에 종속되어야 한다.
- e.g. 주식별자가 복합식별자인 경우(주문번호, 상품코드), 일반 속성인 상품명 속성은 상품코드에만 종속되므로 2차 정규화 대상이 된다.
✏ 제3정규형
- 주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다.
- e.g. 일반 속성에 상품코드와 상품명이 같이 존재하는 경우, 상품명이 상품코드(일반 속성)에 종속
지나친 정규화는 성능 저하를 일으킬 수 있다. 엔터티를 여러 테이블로 나누는 경우, 조회를 위해 JOIN을 여러 번 해야 한다. 이러한 부작용을 개선하기 위해 반정규화를 한다.
2. 반정규화
💡 데이터 조회 성능 향상을 위해 정규화된 테이블을 다시 조합하는 과정이다.
정규화 이후 반정규화 과정을 거치게 된다. 반정규화로 조회 성능을 향상시킬 수 있으나, 입력, 수정, 삭제 성능이 저하될 수 있다. 또한, 데이터 정합성(중복, 일관성)과 관련된 문제가 발생할 수 있다. 반정규화도 일정한 규칙이 존재한다.
✏ 테이블 반정규화 - 테이블 병합
업무 프로세스상 JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 이용한다.
- 1:1 관계 테이블 병합
- 1:1 관계를 가지는 두 개의 테이블을 하나로 합치는 것
- 판단하기 수월하며, 부작용이 적다.
- 1:M 관계 테이블 병합
- 1:M 관계를 가지는 두 개의 테이블을 하나로 합치는 것
- 1에 해당하는 속성 개수가 많을 경우, 중복 데이터가 많아진다.
- 슈퍼 서브 타입 테이블 병합
- 슈퍼 타입 테이블과 서브 타입 테이블을 병합하는 것
- 슈퍼 서브 타입 테이블: 상속 관계를 가진 엔티티들의 공통 속성을 슈퍼 타입 테이블에, 개별 속성을 서브 타입 테이블에 저장하는 방식
✏ 테이블 반정규화 - 테이블 분할
대규모 테이블의 데이터를 분할하여 처리 성능을 향상시키는 것을 말하고, 이를 위해 대개는 분산 데이터베이스나 병렬 처리 시스템에서 사용된다.
- 테이블 수직 분할
- 엔터티의 일부 속성을 별도의 엔터티로 분할(1:1 관계 성립)
- e.g. 데이터의 빈도 수가 낮은 열을 다른 테이블로 분리함으로써 처리 속도를 높인다.
- 테이블 수평 분할
- 엔터티의 인스턴스(row)를 특정 기준으로 별도의 엔터티로 분할(파티셔닝)
✏ 테이블 반정규화 - 테이블 추가
JOIN을 최소화하여 처리 속도를 향상시키기 위해 새로운 테이블을 추가하는 방법을 말한다.
- 중복 테이블 추가
- 성능 향상을 위해 데이터의 중복을 허용하는 것
- 데이터를 여러 테이블에 중복 저장하여 데이터 접근 속도를 높임
- 통계 테이블 추가
- 데이터를 집계하거나 통계 정보를 유지하기 위한 테이블을 추가하는 것
- 데이터가 변경될 때, 통계 테이블의 데이터도 업데이트해야 함
- 이력 테이블 추가
- 데이터 변경 이력을 저장하기 위한 테이블을 추가하는 것
- 데이터가 변경될 때, 이력 테이블에 데이터를 추가해야 함
- 부분 테이블 추가
- 특정 테이블의 일부 데이터를 따로 저장하는 테이블을 추가하는 것
- 자주 조회되는 일부 데이터를 별도의 테이블에 저장하여 빠르게 조회
✏ 컬럼 반정규화
- 중복 컬럼 추가
- JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 이용
- 파생 컬럼 추가
- 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관
- 이력 테이블 컬럼 추가
- 대량의 이력 테이블을 조회할 때, 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가하는 방식
✏ 관계 반정규화
- 업무 프로세스상 JOIN이 필요한 경우가 많아 중복 관계를 추가하는 것이 성능 측면에서 유리할 때 고려