본문 바로가기
개발/Database

정규화, 트랜잭션

by BellOne4222 2024. 3. 6.

정규화(Nomarization)

  • 데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장)을 위해 엔터티를 작은 단위를 분리하는 과정
  • 일반적으로 입력, 수정, 삭제 성능은 일반적으로 향상된다.
  • 정규화를 하면 엔터티가 계속 증가하므로 JOIN으로 인한 조회 성능 저하가 발생 할 수 있다.
  • 데이터의 중복성을 제거한다.
  • 정규화를 할수록 엔터티는 증가한다.

 

1차 정규화 : 원자값이 아닌 도메인을 분해
2차 정규화 : 부분 함수 종속성을 제거
3차 정규화 : 이행 함수 종속성을 제거
4차 정규화 : 다중값 종속성을 제거

 

제 1정규형

  • 모든 속성은 반드시 하나의 값만 가져야한다.
  • 유사한 속성이 반복되는 반복그룹이 있으면 1차 정규화 대상
  • 중복된 속성을 별도의 엔터티로 분리하면 속성 1개에만 인덱스를 생성할 수 있으므로 성능상 향상이 된다.

 

제 2정규형

  • 엔터티의 모든 일반 속성은 반드시 모든 주식별자에 종속되어야 한다.
  • 주식별자가 단일식별자가 아닌 복합식별자인 경우 일반속성이 주식별자의 일부에만 종속 될 수 있다.
  • 주식별자에 대한 부분종속이 없도록 엔터티를 분리한다.

 

제 3정규형

  • 주식별자가 아닌 모든 속성간에는 서로 종속될 수 없다.
  • 다른 일반 속성에 종속되지 않도록 엔터티를 분리한다.

 

정규화 주의사항

  • 지나친 정규화는 오히려 성능 저하를 일으킬 수 있다.
    • 여러번의 JOIN
      • 반정규화를 통해 성능을 개선해야한다.
  • 엔터티 간의 관계를 생성하여 성능 개선해야한다.
  • 유사 속성에 대한 무분별한 인덱스 생성은 입력, 수정, 삭제 성능은 오히려 저하되므로 지양해야한다.

 

반 정규화(De-Normalization)

  • 데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정
  • 조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 수 있고, 데이터 정합성 이슈가 발생 할 수 있다.
  • 모든 정규화를 마친 후 성능상 이슈가 있을 때만 고려
  • 테이블 반정규화
    • 테이블 병합 : JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려, 두 개 이상의 엔터티를 합체
      • 1:M 관계 테이블 병합 : 엔터티의 속성개수가 많으면 병합했을 경우 중복 데이터가 많아져서 테이블 병합에 적절하기 못하다, 중복된 데이터가 생길 수 있다.
      • 1:1 관계의 테이블 병합은 비교적 판단하기 수월하며 부작용도 적다.
      • 1:M 관계에서의 테이블 병합은 1쪽에 해당하는 테이블의 속성 개수가 적어야 유리하다.
      • 테이블의 관계가 강결합이어서 같이 조회되는 경우가 대부분일 경우 비정규화를 고려한다.
    • 테이블 분할
      • 테이블 수직 분할 : 엔터티의 일부 속성을 별도의 엔터티로 분할(1:1 관계 성립)한다.
        • 자주 사용하는 속성이 아니거나 대부분의 인스턴스가 해당 속성값을 NULL로 갖고 있을 때 고려
        • 테이블을 수직 분할 하면 한 개의 블록에 더 많은 인스턴스를 저장할 수 있게 된다.
      • 테이블 수평 분할 : 엔터티의 인스턴스를 특정 기준으로 별도의 엔터티로 분할(파티셔닝)한다.
        • 관계가 없는 다수의 테이블이 생성된다.
        • 분할 기준은 주로 기간이지만 다른 속성이 될 수도 있다.
      • 테이블 추가
        • 중복 테이블 추가 : 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔터티를 추가한다.
        • 통계 테이블 추가 : 통계치를 미리 계산하여 추가
        • 이력 테이블 추가
        • 부분 테이블 추가
        • 테이블 추가하는 경우
          • 단순히 같은 데이터를 여러 테이블에 저장하는 것은 데이터 정합성에 위배되는 상황을 발생시킬 수 있다.
          • 특정 범위의 많은 데이터를 자주 처리해야하는 경우
          • 정규화로 인한 성능 감소가 발생한 경우
          • 미리 계산된 값을 저장해둠으로써 애플리케이션 성능을 향상시키려는 경우
    • 컬럼 반정규화
      • 중복 컬럼 추가 : 업무 프로세스상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리 할 경우 고려
      • 파생 컬럼 추가 : 프로세스 수행 시 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식으로 상품의 재고나 프로모션 적용 할인가 등이 해당
      • 이력 테이블 컬럼 추가 : 대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식, 최신 데이터 여부 등이 이에 해당
    • 관계 반정규화(중복 관계 추가)
      • 업무 프로세스상 JOIN이 필요한 경우가 많아 중복 관계를 추가하는 것이 성능 측면에서 유리 할 경우 고려
      • 데이터 무결성 보장 가능
      • 데이터 무결성은 데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미합니다. 여기서 정확성이란 중복이나 누락이 없는 상태를 뜻하고, 일관성은 원인과 결과의 의미가 연속적으로 보장되어 변하지 않는 상태

 

트랜잭션(Transaction)

  • 데이터를 조작하기 위한 논리적인 작업 단위

 

NULL

  • NULL은 존재하지 않음, 값이 없음을 의미
  • 아직 정의되지 않은 값
  • 값의 부재
  • NULL과  0은 다른 값
  • 가로 연산 : NULL이 포함되어 있으면 결과값은 NULL
  • 세로 연산 : 다른 인스턴스의 데이터와 연산 할 때는 NULL 값을 제외
  • NULL과의 비교 연산 결과는 NULL
  • NULL이 포함된 집계 함수는 NULL을 제외하고서 계산된다.

 

성능 데이터 모델링 : 데이터 베이스의 성능을 향상시키기 위해 설계 단계부터 성능과 관련된 사항들이 모델링에 반영될 수 있다.
성능 데이터 모델링 방법 : 정규화, 반정규화, 테이블 통합, 테이블 분할

정규화를 하는 이유 : 데이터의 무결성을 보장하기 위해
반정규화를 하는 이유
1. 여러 번의 조인으로 인해 성능이 저하되는 것을 방지하기 위해 정규화를 수행
2. 모델링의 마지막 단계에서 성능을 향상시키는 목적으로 정규화 수행
3. 런타임에 컬럼 계산으로 인한 속도 저하가 우려될 경우 정규화를 수행

하나의 속성이 여러개의 속성값을 갖는 데이터 모델은 제 1정규화 대상이 된다.
테이블 병합은 반정규화 기법 중 하나
정규화가 항상 조회 성능을 저하 시키는 것은 아니며 반 정규화를 함으로써 조회 성능이 확실히 좋아지는 상황에서만 반 정규화를 하는 것이 바람직하다.

유사한 속성이 반복 -> 1차 정규화 대상 -> 엔터티를 따로 분리하여 유사한 속서잉 반복되지 않도록 정규화

반정규화 기법
1. 테이블 병합
2. 테이블 분할
3. 테이블 추가

성능 데이터 모델링의 순서
1. 데이터 모델에 맞게 정규화를 수행
2. 데이터베이스의 용량 및 트랜잭션 유형을 파악하여 성능 저하를 일으키는 부분이 없는지 검토
3. 용량과 트랜잭션 유행에 맞게 반정규화를 수행
4. 성능 향상을 위한 이력모델의 조정, PK/FK 조정, 슈퍼/서브타입 조정 등을 수행
5. 데이터 모델의 성능을 검증

엔터티의 모든 일반 속성은 반드시 모든 주식별자에 종속되어야 하며 주식별자가 단일 식별자가 아닌 복합식별자인 경우 일반 속성이 주식별자의 일부에만 종속 될 수 있는데 이런 경우 2차 정규화 대상이 된다.

한 테이블의 속성의 개수가 과도하게 많은 경우 조회 성능을 향상시키기 위해 자주 쓰이는 속성과 그렇지 않은 속성을 나누어 수직 분할 할 수 있다.
수직 분할은 반정규화 기법 중 하나이며 분할된 테이블은 1:1 관계를 이루게 된다.

함수 종속성을 고려하여 이상 현상이 생기기 않도록 테이블을 분할하는 것은 정규화 기법

데이터 모델에서 생길 수 있는 이상현상
1. 삽입 이상 : 기본적으로 없는 정보를 삽입 할 수 없다. 강제로 삽입하려면 가짜 정보를 만들어주어야 한다.
2. 갱신 이상 : 중복된 데이터 중 일부만 업데이트되어 데이터의 불일치가 발생하게 되는 현상
3. 삭제 이상 : 데이터 삭제 시 삭제되면 안되는 데이터까지 덩달아 삭제되는 현상

트랜잭션은 데이터를 조작하기 위한 논리적인 작업 단위로 데이터 모델로 표현할 수 있으며 데이터는 트랜잭션 단위로 묶일 수 있다.
데이터는 트랜잭션 범위와는 무관하고 데이터가 트랜잭션 범위로 묶일 수 있다.

NULL이 포함된 사칙연산의 결과는 항상 NULL
데이터를 집계할 때 NULL은 집계 대상에서 제외된다.
WHERE COL IS NULL은 COL이 NULL인 행 반환
WHERE COL = NULL은 COL=NULL은 항상 FALSE이므로 아무 행도 반환 하지 않는다.

수평 계산 : NULL이 포함되어 있으면 결과는 NULL
수직 계산 : NULL이 포함되어 있으면 NULL인 행은 제외

1차 정규화 : 원자값이 아닌 도메인을 분해
2차 정규화 : 부분 함수 종속성을 제거
3차 정규화 : 이행 함수 종속성을 제거
4차 정규화 : 다중값 종속성을 제거

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

슈퍼-서브 타입의 설계 : 공통 속성과 개별 속성을 별도로 관리

중복 관계 추가 : 관계의 반정규화 기법중 하나로 데이터 무결성을 깨드릴 위험성 없이 데이터 처리 성능을 향상시킬 수 있는 기법

 

 

 

 

 

 

 

 

 

 

 

 

'개발 > Database' 카테고리의 다른 글

데이터 모델링  (0) 2024.03.02
윈도우 함수  (1) 2024.02.25
PK FK UK CK  (0) 2024.02.15
트랜잭션, 뷰, Date  (0) 2024.02.07
사용자 권한 주기 (GRANT)  (0) 2024.02.07