-> 블로그 이전

[SQLD] 1-3. 정규화 & 반정규화

2021. 10. 26. 17:20Certificate`/SQLD

정규화 (Normalization)

- 데이터에 대한 중복성을 제거 / 데이터를 관심사별로 카테고리화 => 성능 향상

- 엔티티가 계속 발생 / SQL 문에서 조인이 많이 발생 => 성능 저하

- 정규화를 수행한다고 무조건 조회 성능이 저하되는 것은 아니다

- 함수적 종속성에 근거한 정규화 수행이 필요하다

 

단계

- 1NF : 모든 속성 값이 원자 값

- 2NF : 1NF + 완전 함수 종속

- 3NF : 2NF + 이행적 종속 제거

- BCNF : 3NF + 모든 결정자가 후보키

 

 

 

반정규화 (Denormalization)

정의

- 정규화된 엔티티, 속성, 관계에 대해 시스템 성능 향상 + 개발·운영 단순화를 목적으로 중복, 통합 , 분리 등을 수행하는 데이터 모델링 기법

 

수행 이유 (데이터 무결성이 깨질 수 있음에도 불구하고)

- 디스크 I/O량이 많아서 성능 저하

- 경로가 너무 멀어서 조인으로 인한 성능 저하

- 컬럼을 계산하여 읽을 때 성능 저하

≫ 이를 해결하기 위해 반정규화 수행

 

기술적으로 수행되지 않은 반정규화

- 성능이 저하된 DB 생성

- 구축·시험 단계에서 반정규화를 적용할 때 수정에 따른 노력비용↑

 

반정규화 절차

1. 반정규화 대상 조사 (범위 처리 빈도수 조사 / 통계성 프로세스 조사 / 테이블 조인 개수)

  • 자주 사용하는 테이블에 접근하는 프로세스 수 ↑ + 항상 일정 범위를 조사
  • 테이블에 대량의 데이터가 존재 + 대량의 데이터 범위를 자주 처리
  • 통계 정보가 필요할 때 별도의 통계 테이블(반정규화 테이블) 생성
  • 테이블에 너무 많은 조인이 걸려서 데이터 조회 작업이 기술적으로 힘들 때
  • sorting, ordery by는 반정규화 대상이 아니다

2. 다른 방법 유도 검토 (뷰 테이블 / 클러스터링 / 인덱스 조정 / 응용 애플리케이션)

  • 테이블에 너무 많은 조인이 걸려서 데이터 조회 작업이 힘들 때 를 사용한다 / 가 조회의 성능을 향상시키는 역할을 수행하는 것은 아니다
  • 대량의 데이터 처리 + 부분 처리에 의해 성능이 저하될 때 클러스터링 적용 or 인덱스를 조정한다
  • 클러스터링자주 사용하는 테이블 데이터디스크의 같은 블록에 저장하는 것이다
  • 인덱스가 많아지면 조회 성능은 향상되지만, 입력/수정/삭제 성능은 저하된다
  • 대량의 데이터는 파티셔닝 기법이 적용되어 성능 저하를 방지 (PK의 성격에 따라 부분적인 테이블로 분리)
  • 응용 애플리케이션에서 로직 구사 방법을 변경함으로써 성능 향상

3. 반정규화 적용 (테이블 반정규화 / 속성 반정규화 / 관계 반정규화)