STUDY/SQL
[SQL] 1. 데이터 모델링의 이해 - Chapter 2. 데이터 모델과 SQL
JUNGY00N
2023. 3. 4. 23:51
2023 유선배 SQL개발자(SQLD) 과외노트 를 읽고 내용을 정리한 글입니다.
성능 데이터 모델링
성능 데이터 모델링
: 데이터베이스의 성능을 향상시키기 위해 설계 단계부터 성능과 관련된 사항들이 모델링에 반영될 수 있도록 하는 것
- 정규화
- 반정규화
- 테이블 통합
- 테이블 분할
성능 데이터 모델링 순서
- 데이터 모델에 맞게 정규화를 수행한다.
- 데이터베이스의 용량 및 트랜잭션 유형을 파악하여 성능 저하를 일으키는 부분이 없는지 검토한다.
- 용량과 트랜잭션 유형에 맞게 반정규화를 수행한다.
- 성능 향상을 위한 이력모델의 조정, PK/FK 조정, 슈퍼/서브타입 조정 등을 수행한다.
- 데이터 모델의 성능을 검증한다.
정규화(Normaalization)
정규화
: 데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장)을 위해 엔티티를 작은 단위로 분리하는 과정
- 정규화를 할 경우 데이터 조회성능은 처리조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만 입력, 수정, 삭제 성능은 일반적으로 향상된다고 볼 수 있다.
- 그렇다고 모든 엔티티를 무작정 분리하면 안되기 때문에 정규화를 하기 위한 일정한 룰이 존재한다.
제 1정규형
- 모든 속성은 반드시 하나의 값만 가져야 한다.
- 유사한 속성이 반복되는 경우도 1차 정규화 대상이 된다.
- 하나의 속성이 다중값을 가지는 경우 어플리케이션에서 데이터를 꺼내 쓸 때 불필요한 Split을 사용해야 하는 식의 번거로움이 생길 수 있다.
- 원자값이 아닌 도메인 분해
제 2정규형
- 엔티티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 한다.
- 주식별자가 단일 식별자가 아닌 복합식별자일 경우 일반속성이 주식별자의 일부에만 종속될 경우 문제점이 발생할 수 있다.
- 부분 함수 종속 제거
제 3정규형
- 주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다.
- 이행 함수 종속 제거
반정규화(De-Normalization)
반정규화
: 데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정
- 조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 수 있으며 데이터 정합성 이슈가 발생할 수 있다
- 반정규화의 과정은 정규화가 끝난 후 거치게 되며 정규화와 마찬가지로 일정한 룰이 존재한다.
- 테이블 반정규화
- 컬럼 반정규화
- 관계 반정규화 (중복 관계 추가)
테이블 반정규화
테이블 병합
: 업무 프로세스상 JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려한다.
- 1:1 관계 테이블 병합
- 1:M 관계 테이블 병합
- 1쪽에 해당하는 엔티티의 속성 개수가 많으면 병합했을 경우 중복 데이터가 많아지므로 테이블 병합에 적절하지 못하다.
- 슈퍼 서브 타입 테이블 병합
: 공통 속성과 개별 속성을 별도로 관리
- 공통 속성을 조회하는 빈도수가 개별 속성을 조회하는 빈도수보다 높을 경우
테이블 분할
- 테이블 수직 분할 (속성 분학)
: 엔티티의 일부 속성을 별도의 엔티티로 분할 (1:1 관계 성립) - 테이블 수평 분할 (인스턴스 분할, 파티셔닝)
: 엔티티의 인스턴스를 특정 기준으로 별도의 엔티티로 분할 (파티셔닝)
테이블 추가
- 중복 테이블 추가
: 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔티티를 추가한다. - 통계 테이블 추가
- 이력 테이블 추가
- 부분 테이블 추가
컬럼 반정규화
중복 컬럼 추가
: 업무 프로세스상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려한다.
파생 컬럼 추가
: 프로세스 수행 시 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식
- 상품의 재고, 프로모션 적용 할인가 등
이력 테이블 컬럼 추가
: 대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식
- 최신 데이터 여부 등
관계 반정규화 (중복관계 추가)
: 업무 프로세스상 JOIN이 필요한 경우가 많아 중복 관계를 추가하는 것이 성능 측면에서 유리할 경우 고려한다.
- 데이터 무결성을 깨뜨릴 위험성 없이 데이터 처리의 성능을 향상시킬 수 있다.
트랜잭션(Transaction)
트랜잭션
: 데이터를 조작하기 위한 하나의 논리적인 작업 단위
NULL
NULL
: 존재하지 않음, 값이 없음
- 가로 연산 : NULL이 포함되어 있으면 결과값은 NULL이 된다.
- 세로 연산 : 다른 인스턴스의 데이터와 연산할 때는 NULL값을 제외한다.
- NULL이 포함된 집계 함수는 NULL을 제외하고서 계산된다.
- WHERE COL IS NULL 조건은 COL 값이 NULL인 행을 반환한다.
- WHERE COL = NULL 조건은 결과가 항상 false이므로 아무 행도 반환하지 않는다.