huginn muninn

[SQL] 정규화 (Normalization) 본문

데이터베이스/SQL

[SQL] 정규화 (Normalization)

_maddy 2024. 5. 2. 23:48

정규화 (Normalization)

 

  • 데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장)을 위해 엔터티를 작은 단위로 분리하는 과정. 
  • 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 과정. 
  • 데이터의 중복을 제거하고 데이터 모델의 독립성을 확보
  • 정규화를 할 경우 데이터 조회 성능은 처리 조건에 따라 향상되는 경우도 저하되는 경우도 있지만 입력, 수정, 삭제 성능은 일반적으로 향상된다. 
  • 제1정규화부터 제 5정규화까지 존재하지만 실질적으로는 제 3정규화까지만 수행한다. 
  • 정규화 수행시 조회성능이 낮아질 수 있다. 

 

1. 제 1 정규형

 

  • 모든 속성은 반드시 하나의 값만 가져야 한다. 

 

 

 

  • 유사한 속성이 반복되는 경우도 1차 정규화의 대상이 된다. 

 

 

 

2. 제 2 정규형

  • 엔터티의 모든 일반속성은 반드시 모든 주식별자 전체에 종속되어야 한다.
  • 주식별자가 단일식별자가 아닌 복합식별자인 경우 일반속성이 주식별자의 일부에만 종속되는 경우 제 2 정규형에 위반된다. 

 

 

 

3. 제 3 정규형

  • 주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다. 

 

 

 

 

반정규화(De-Normalization)

  •  데이터의 조회성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정. 
  • 조회성능은 향상될 수 있으나, 입력, 수정, 삭제 성능은 저하될 수 있으며, 데이터 정합성 이슈가 발생할 수 있다. 
  • 반정규화는 정규화가 끝난 후 할 수 있다. 

 

1. 테이블 반정규화

 

테이블 병합 1:1 관계 테이블 병합
1:M 관계 테이블 병합
슈퍼 서브 타입 테이블 병합
테이블 분할 테이블 수직 분할(속성 분할)
테이블 수평 분할(인스턴스 분할, 파티셔닝)
테이블 추가 중복 테이블 추가
통계 테이블 추가
이력 테이블 추가
부분 테이블 추가

 

 

1. 테이블 병합

 

업무 프로세스 상 join이 필요한 경우가 많아 테이블을 병합하는 것이 성능 측면에서 유리할 경우 고려한다. 1:M 관계 테이블 병합의 경우 1 에 해당하는 엔터티 속성 개수가 많으면 병합했을 때 중복 데이터가 많아지므로 테이블 병합에 적합하지 않다. 

 

 

 

 

 

2. 테이블 분할

 

2.1 테이블 수직 분할 : 엔터티의 일부 속성을 별도의 엔터티로 분할(1:1 관계 성립)

 

 

 

 

 

2.2 테이블 수평 분할 : 엔터티의 인스턴스를 특정기준으로 별도의 엔터티로 분할(파티셔닝)

 

 

 

 

3. 테이블 추가

 

3.1 중복 테이블 추가 : 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔터티를 추가한다.

3.2 통계 테이블 추가 

 

 

3.3 이력 테이블 추가

 

 

3.4 부분테이블 추가

 

 

 

2. 컬럼 반정규화

1. 중복 컬럼 추가

업무 프로세스상 join이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려

 

2. 파생컬럼 추가

프로세스 수행 시 부하가 염려되는 계산값을 미리 컬럼으로 추가해 보관하는 방식으로 상품의 재고나 프로모션 적용 할인가 등이 이에 해당할 수 있다. 

 

3. 이력 테이블 컬럼 추가

대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비해 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식. 최신 데이터 여부 등이 이에 해당

 

3. 관계 반정규화

업무 프로세스상 join이 필요한 경우가 많아 중복 관계를 추가하는 것이 성능 측면에서 유리할 경우 고려.