(SQL) 데이터모델과 SQL

샘2·2023년 6월 9일
0

정규화(Normalization): 데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장)을 위해 엔터티를 작은 단위로 분리하는 과정이다. 정규화를 할 경우 데이터 조회성능은 처리조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만 입력, 수정, 삭제 성능은 일반적으로 향상된다. 하지만 모든 엔터티를 무작정 분리하면 안되기 때문에 일정한 룰이 존재한다.

  1. 제 1 정규형: 모든 속성은 반드시 하나의 값만 가져야 한다.(유사한 속성이 반복되는 경우도 포함)
  2. 제 2 정규형: 엔터티의 모든 일반 속성은 반드시 모든 주식별자에 종속되어야 한다. 주식별자가 단일식별자가 아닌 복합식별자인 경우 일반속성이 주식별자의 일부에만 종속될 수 있다.
  3. 제 3 정규형: 주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다.
  4. 주의 사항 : 적절하지 못한 정규화를 진행할 때 성능이 저하될 수 있다.
    1. 회원의 배송상태를 조회하려면 여러번 join을 해야한다.
    2. 회원 엔터티와 배송 엔터티 간의 관계를 생성하여 성능 개선

*유사한 속성이 반복되는 반복그룹이 있을 때는 1차 정규화를 진행하고 유사 속성에 모두 인덱스를 생성할 경우 조회 성능은 향상될지 모르나 입력, 수정, 삭제 성능은 오히려 저하되므로 무분별한 인덱스 생성은 지양해야한다.

반정규화: 데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정이다. 여기서 주의할 점은 조회성능은 향상시킬 수 있으나 입력, 수정, 삭제 성능은 저하될수 있으며 데이터 정합성 이슈가 발생할 수 있다. 반정규화의 과정은 정규화가 끝난 후 거치게 되며 정규화와 마찬가지로 일정한 룰이 존재한다.

  • 1:1 관계의 테이블 병합은 비교적 판단하기 수월하며 부작용도 적다.

컬럼 반정규화

  • 중복 컬럼 추가: 업무 프로세스상 join이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우
  • 파생 컬럼 추가: 프로세스 수행시 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식으로 상품의 재고나 프로모션 적용 할인가 등이 있다.
  • 이력 테이블 컬럼 추가: 대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식이다.

관계 반정규화(중복관계 추가)

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

트랜잭션(transaction): 테이터를 조작하기 위한 하나의 논리적인 작업 단위

오답노트

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

  • 정규화: 데이터의 무결성을 보장하기 위해 정규화를 수행한다.

  • 정규화가 항상 조회성능을 저하시키는 것은 아니며 반정규화를 함으로써 조회 성능이 확실히 좋아지는 상황에서만 반정규화를 하는 것이 바람직하다.

  • 반정규화 기법

    • 테이블 병합: 1:1 관계 테이블 병합, 1:M 관계 테이블 병합, 슈퍼/서브타입 테이블 병합
    • 테이블 분할: 수직 분할, 수평분할
    • 테이블 추가: 중복 테이블 추가, 통계 테이블 추가, 이력 테이블 추가
  • 성능 데이터 모델링의 순서

    1. 데이터 모델에 맞게 정규화를 수행한다.
    2. 데이터베이스의 용량 및 트랜잭션 유형을 파악하여 성능 저하를 일으키는 부분이 없는지 검토한다.
    3. 용량과 트랜잭션 유형에 맞게 반정규화를 수행한다.
    4. 성능 향상을 위한 이력모델의 조정, PK/FK 조정, 슈퍼/서브타입 조정등을 수행한다.
    5. 데이터 모델의 성능을 검증한다.
  • 엔터티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 하며 주식별자가 단일식별자가 아닌 복합식별자인 경우 일반속성이 주식별자의 일부에만 종속될 수 있는데 이런 경우 2차 정규화 대상이 된다.

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

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

    • 수직분할: 테이블의 일부 속성을 별도의 테이블로 분리하는 것
    • 수평분할: 테이블의 특정 인스턴스를 별도의 테이블로 분할하는 것
  • 이상현상

    • 삽입이상: 기본적으로 주문되지 않은 상품의 정보를 삽입할 수 없으며 강제로 삽입하기 위해서는 존재하지 않는 가짜 주문번호를 만들어 주어야한다.
    • 갱신이상: 중복된 데이터 중 일부만 업데이트되어 테이터의 불일치가 발생하게 되는 현상
    • 삭제이상: 데이터 삭제 시 삭제되면 안되는 데이터까지 덩달아 삭제되는 형상
  • 트랜잭션은 데이터를 조작하기 위한 논리적인 작업 단위로, 데이터 모델로 표현할 수 있으며 데이터는 트랜잭션 범위로 묶일 수 있다.

  • 정규화

    • 1차정규화: 원자값이 아닌 도메인을 분해한다.
    • 2차정규화: 부분 함수 종속성을 제거한다.
    • 3차정규화: 이행 함수 종속성을 제거한다.
    • 4차정규화: 다중값 종속성을 제거한다.
  • 공통 속성을 조회하는 빈도수가 개별 속성을 조회하는 빈도수보다 높기 때문에 공통 속성과 개별 속성을 별도로 관리하는 슈퍼-서브 타입의 설계가 적절하다.

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

profile
부지런한 개발자가 되고싶은

0개의 댓글