정규화 vs 반 정규화

leverest96·2023년 7월 19일
0

Database

목록 보기
1/1
post-thumbnail

1. 정규화

특징

  1. 테이블 간에 중복된 데이터를 최소화

    • 저장 용량의 최적화 가능

    • 데이터의 무결성 유지

    • 쿼리 내의 Join을 많이 사용하게 되어, 응답시간 저하를 초래할 수 있음


반정규화

정의

  1. 시스템의 성능 향상, 개발과정의 편의성, 운영의 단순화를 위해 사용

  2. 정규화 원칙에 위배되는 행위를 의도적으로 수행하게 되는 일련의 과정

  3. 정규화 이후에 수행하는 것 (반정규화부터 수행하는 것은 아님)

고려대상

  1. 대량의 범위를 자주 처리해야 하는 경우

  2. 특정 범위의 데이터만 자주 처리하는 경우

  3. 요약/집계 정보가 자주 요구되는 경우

  4. Join으로 인한 성능 저하가 예상되는 경우

예시

  • 1:1 관계의 테이블 병합

    • 1:1은 거의 대부분이 고려 대상
  • 1:N 관계의 테이블 병합

    • 1:2, 1:3 등 명확하게 구분되어질 경우
  • 수퍼/서브 타입 테이블 병합

  • 수직 분할(집중화된 일부 컬럼을 분리)

  • 수평 분할(행으로 구분하여 구간별 분리)

  • 테이블 추가(중복테이블, 통계테이블, 이력테이블, 부분테이블)

Sharding과 Partitioning

  • 공통접 : 큰 데이터를 여러 서브셋으로 나누어 저장하는 기술

  • 사용 이유 : 성능 향상과 확장성

Partitioning

  • 하나의 인스턴스의 여러 테이블에 나누어 저장

    • 하나의 컴퓨터에 저장한다는 의미
  • 인덱스 크기가 작아짐으로 조회시간을 줄임

  • 큰 테이블을 제거하여 관리에 용이

  • 종류

    • Horizontal Partitioning

      • 데이터의 개수를 기준으로 Partitioning

      • 동일한 스키마를 가진 데이터를 분산

      • Sharding도 Horizontal Partitioning의 한 종류로 볼 수 있다.

    • Vertical Partitioning

      • 테이블의 컬럼을 기준으로 데이터 분할

      • 정규화된 데이터를 분리하는 과정

      • 자주 사용하는 컬럼을 분리하여 성능 향상

        • 필요없는 컬럼을 조회하지 않아도 되기 때문

Sharding

  • 여러 인스턴스로 나눠서 저장

    • 여러 대의 컴퓨터 혹은 여러 개의 DB에 분산하여 저장한다는 의미

    • 쿼리 성능 향상과 더불어 부하가 분산된다는 이점이 있다.

  • 여러 샤드 노드로 데이터가 분산 저장

  • 적절한 샤드키를 지정하여 해당 데이터가 존재하는 인스턴스를 찾을 수 있게 해야 한다.

    • 유저가 많은 경우에 사용

    • 주의점

      1. 샤드키를 잘못 선정할 경우 한쪽으로 치우치게 될 수 있음

        • 치울칠 경우 데이터가 몰려 Hot Spot이 되어 성능 저하가 생긴다.
        • 이름의 성씨를 기준으로 나눌 경우 위험이 존재한다.
      2. 데이터베이스 서버간의 연결 과정이 많아져 비용이 증가할 수 있다.

      3. 하나의 서버가 고장나면 데이터의 무결성이 깨질 수 있다.

공통 코드 테이블

  • 테이블의 개수가 많아지고 조인이 빈번하게 일어날 경우 반정규화를 통해 하나의 테이블로 합쳐 관리

    • group_seq와 같은 칼럼을 통해 구분
  • 예시

    code_seqgroup_seqcode_nameis_use
    11무기1
    21방패1
    31갑옷1
    42그린1
    52옐로우1
    62레드1
    73일반회원1
    83관리자0
    ............
profile
응애 난 애기 개발자

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

유익한 정보를 얻을 수 있어서 기쁩니다.

답글 달기