[SQLD] 1-3. 정규화 & 반정규화
2021. 10. 26. 17:20ㆍCertificate`/SQLD
정규화 (Normalization)
- 데이터에 대한 중복성을 제거 / 데이터를 관심사별로 카테고리화 => 성능 향상
- 엔티티가 계속 발생 / SQL 문에서 조인이 많이 발생 => 성능 저하
- 정규화를 수행한다고 무조건 조회 성능이 저하되는 것은 아니다
- 함수적 종속성에 근거한 정규화 수행이 필요하다
단계
- 1NF : 모든 속성 값이 원자 값
- 2NF : 1NF + 완전 함수 종속
- 3NF : 2NF + 이행적 종속 제거
- BCNF : 3NF + 모든 결정자가 후보키
반정규화 (Denormalization)
정의
- 정규화된 엔티티, 속성, 관계에 대해 시스템 성능 향상 + 개발·운영 단순화를 목적으로 중복, 통합 , 분리 등을 수행하는 데이터 모델링 기법
수행 이유 (데이터 무결성이 깨질 수 있음에도 불구하고)
- 디스크 I/O량이 많아서 성능 저하
- 경로가 너무 멀어서 조인으로 인한 성능 저하
- 컬럼을 계산하여 읽을 때 성능 저하
≫ 이를 해결하기 위해 반정규화 수행
기술적으로 수행되지 않은 반정규화
- 성능이 저하된 DB 생성
- 구축·시험 단계에서 반정규화를 적용할 때 수정에 따른 노력비용↑
반정규화 절차
1. 반정규화 대상 조사 (범위 처리 빈도수 조사 / 통계성 프로세스 조사 / 테이블 조인 개수)
- 자주 사용하는 테이블에 접근하는 프로세스 수 ↑ + 항상 일정 범위를 조사
- 테이블에 대량의 데이터가 존재 + 대량의 데이터 범위를 자주 처리
- 통계 정보가 필요할 때 별도의 통계 테이블(반정규화 테이블) 생성
- 테이블에 너무 많은 조인이 걸려서 데이터 조회 작업이 기술적으로 힘들 때
- sorting, ordery by는 반정규화 대상이 아니다
2. 다른 방법 유도 검토 (뷰 테이블 / 클러스터링 / 인덱스 조정 / 응용 애플리케이션)
- 테이블에 너무 많은 조인이 걸려서 데이터 조회 작업이 힘들 때 뷰를 사용한다 / 뷰가 조회의 성능을 향상시키는 역할을 수행하는 것은 아니다
- 대량의 데이터 처리 + 부분 처리에 의해 성능이 저하될 때 클러스터링 적용 or 인덱스를 조정한다
- 클러스터링은 자주 사용하는 테이블 데이터를 디스크의 같은 블록에 저장하는 것이다
- 인덱스가 많아지면 조회 성능은 향상되지만, 입력/수정/삭제 성능은 저하된다
- 대량의 데이터는 파티셔닝 기법이 적용되어 성능 저하를 방지 (PK의 성격에 따라 부분적인 테이블로 분리)
- 응용 애플리케이션에서 로직 구사 방법을 변경함으로써 성능 향상
3. 반정규화 적용 (테이블 반정규화 / 속성 반정규화 / 관계 반정규화)