반응형
정규화(Normalization)란?
- 데이터의 정합성(데이터의 정확성과 일관성을 유지하고 보장)을 위해 엔터티를 작은 단위로 분리하는 과정이다.
- 정규화를 할 경우 데이터 조회성능은 처리조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만, 입력, 수정, 삭제 성능은 일반적으로 향상된다고 볼 수 있다.
- 적잘한 정규화는 성능상 이롭지만 지나친 정규화는 오히려 성능 저하를 일으킬 수 있다.
제1정규형
- 모든 속성은 반드시 하나의 값만 가진다.
- 유사한 속성이 반복되는 경우도 1차 정규화의 대상이 된다.
- 원자값이 아닌 도메인을 분해한다.
제2정규형
- 엔터티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 한다.
- 주식별자가 단일식별자가 아닌 복합식별자인 경우 일반속성이 주식별자의 일부에만 종속될 수 있는데 이런 경우 2차 정규화 대상이다.
- 일반속성이 주식별자의 일부 속성에 부분종속되는 경우 2차 정규화 대상이다.
- 부분 함수 종속성을 제거한다.
제3정규형
- 주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다.
- 일반속성이 다른 일반속성에 종속되는 경우 3차 정규화 대상이다.
- 이행 함수 종속성을 제거한다.
반정규화(De-Normalization)란?
- 데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정이다.
- 정규화를 했을 때 조회 성능이 심각하게 저하되는 경우 반정규화를 고려할 수 있다.
- 조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 수 있으며 데이터 정합성 이슈가 발생할 수 있다.
- 반정규화를 하면 데이터 무결성이 저해된다고 볼 수 있다.
- 정규화가 끝난 후 반정규화 과정을 거친다.
테이블 반정규화
- 테이블 병합
- 두 개 이상의 엔터티를 합체하는 것이다.
- 업무 프로세스상 JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려한다.
- 1:1 관계, 1:M 관계에서 모두 가능하지만, 1:M 관계 테이블 병합의 경우 1쪽에 해당하는 엔터티의 속성 개수가 많으면 병합했을 경우 중복 데이터가 많아지므로 테이블 병합에 적절하지 못하다.
- 테이블 분할
- 테이블 수직 분할
- 엔터티의 일부 속성을 별도의 엔터티로 분할(1:1 관계 성립)한다.
- 자주 사용하는 속성이 아니거나 대부분의 인스턴스가 해당 속성값을 NULL로 갖고 있을 때 고려한다.
- 테이블 수평 분할
- 엔터티의 인스턴스를 특정 기준으로 별도로 엔터티를 분할(파티셔닝)한다.
- 테이블 수평 분할의 기준은 주로 기간이지만 다른 속성이 될 수도 있다.
- 테이블 수형 분할을 할 경우 관계가 없는 다수의 테이블이 생성된다.
- 테이블 수직 분할
- 테이블 추가
- 중복 테이블 추가 : 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔터티를 추가한다.
- 통계 테이블 추가 : 성능 향상을 위해 데이터의 통계치를 미리 계산하여 저장한다.
- 이력 테이블 추가 : 과거 이력에 대한 데이터를 관리하는 테이블을 추가한다.
- 부분 테이블 추가 : 필요한 정보만 부분 테이블로 생성한다.
컬럼 반정규화
- 중복 컬럼 추가 : 업무 프로세스상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려한다.
- 파생 컬럼 추가 : 프로세스 수행 시 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식이다.
- 이력 테이블 컬럼 추가 : 대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식이다.
관계 반정규화(중복 관계 추가)
- 업무 프로세스상 JOIN이 필요한 경우가 많아 중복 관계를 추가하는 것이 성능 측면에서 유리할 경우 고려한다.
- 데이터 무결성을 깨뜨릴 위험성 없이 데이터 처리 성능을 향상시킬 수 있는 기법이다.
트랜잭션(Transaction)이란?
- 데이터를 조작하기 위한 논리적인 작업 단위이다.
- 데이터 모델로 표현할 수 있다.
- 데이터는 트랜잭션 범위로 묶일 수 있다.
- 트랜잭션은 하나의 커밋 단위로 묶어야 한다.
NULL
- NULL은 존재하지 않음, 즉 값이 없음을 의미하며, 아직 정의 되지 않은 값이다.
- NULL과 0, 'NULL'은 다른 데이터이다.
- NULL이 포함된 사칙연산과 비교 연산의 결과는 항상 NULL이다.
- WHERE COL IS NULL 조건은 COL 값이 NULL인 행을 반환하지만, COL = NULL의 결과는 항상 False이므로 아무 행도 반환하지 않는다.
- 컬럼끼리의 가로 연산에서 NULL이 포함되어 있으면 결과값은 NULL이고, 로우끼리의 세로 연산에서 NULL은 제외된다.
Reference
- 2024 SD에듀 유선배 SQL개발자(SQLD) 과외노트
반응형
'Data > Sql' 카테고리의 다른 글
[SQLD] SQL 활용 - 서브쿼리, 뷰, 집합연산자, 그룹함수, 윈도우함수, Top-N 쿼리, 계층쿼리 (0) | 2024.05.23 |
---|---|
[SQLD] SQL 기본 - Select, Where, Group by, Order by, Join, 함수들 (1) | 2024.05.23 |
[SQLD] 데이터 모델링의 이해 - ERD, 엔티티, 속성, 관계, 식별자 (1) | 2024.05.23 |
[SQL] With문 - With문 활용, 재귀 쿼리 (0) | 2023.06.19 |
[SQL] 조건 연산자 - Case, Coalesce, NullIf, Cast (0) | 2023.06.19 |