ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 함수
  • 알고리즘
  • 티스토리챌린지
  • 파이썬
  • SQL
  • 프로그래머스
  • Unity
  • 백준
  • string
  • C++
  • 그래픽스
  • 오블완
  • 배열
  • 포인터
  • 언리얼
  • 유니티
  • C
  • 문자열
  • 클래스
  • c#

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

[SQL] 정규화(Normalization)와 반정규화(De-Normalization)
프로그래밍 언어/SQL

[SQL] 정규화(Normalization)와 반정규화(De-Normalization)

2024. 7. 31. 12:43

정규화란?

  • 정규화는 데이터의 일관성, 최소한의 데이터 중복, 최소한의 데이터 유연성을 위한 방법이며 데이터를 분해하는 과정이다.
  • 정규화된 모델은 테이블이 분해된다. 테이블이 분해되면 직원 테이블과 부서 테이블 간에 부서코드로 조인(join)을 수행하며 하나의 합집합으로 만들 수 있다.
  • 정규화를 하면 불필요한 데이터를 입력하지 않아도 되기 때문에 중복 데이터가 제거된다.

절차

문제점

  • 정규화는 데이터 조회(select) 시에 조인(join)을 유발하기 때문에 CPU와 메모리를 많이 사용한다.
  • 아래 코드를 프로그램화 한다면 중첩된 루프(Nested Loop)를 사용해야 한다.
[ANSI JOIN}
select 사원번호, 부서코드, 부서명, 이름, 전화번호, 주소
from 직원, 부서
where 직원.부서코드 = 부서.부서코드;

select 사원번호, 부서코드, 부서명, 이름, 전화번호, 주소
from 직원 inner join 부서 on직원.부서코드=부서.부서코드;

정규화를 사용한 성능 튜닝

  • 조인으로 인하여 성능이 저하되는 문제를 반정규화로 해결할 수 있다.
  • 반정규화는 데이터를 중복시키기 때문에 또 다른 문제점을 발생시킨다.

반정규화란?

  • 데이터베이스의 성능 향상을 위하여, 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법이다.
  • 반정규화는 조회(select) 속도를 향상시키지만, 데이터 모델의 유연성은 낮아진다.

수행하는 이유

  • 정규화에 충실하여 종속성, 활용성은 향상 되었지만 수행속도가 느려진 경우
  • 다량의 범위를 자주 처리해야하는 경우
  • 특정 범위의 데이터만 자주 처리하는 경우
  • 요약/집계 정보가 자주 요구되는 경우

절차

 

클러스터링 인덱스라는 것은 인덱스 정보를 저장할 때, 물리적으로 정렬해서 저장하는 방법이다. 따라서 조회 시 인접 블록을 연속적으로 읽기 때문에 성능이 향상된다.

기법

계산된 컬럼 추가

  • 배치 프로그램으로 총판매액, 평균잔고, 계좌평가를 미리 계산하고 그 결과를 특정 칼럼에 추가한다.

테이블 수직 분할

  • 하나의 테이블의 두 개 이상의 테이블로 분할한다. 즉, 칼럼을 분할하여 새로운 테이블을 만드는 것이다.

테이블 수평분할

  • 하나의 테이블에 있는 값을 기준으로 테이블을 분할하는 방법이다.
[Partition]
- 데이터베이스에서 파티션을 사용하여 테이블을 분할할 수 있다. 
- 파티션을 사용하면 논리적으로는 하나의 테이블이지만, 여러 개의 데이터 파일에 분산되어 저장된다. 
- Range Partition: 데이터 값의 범위를 기준으로 파티션을 수행한다. 
- List Partition: 특정한 값을 지정하여 파티션을 수행한다. 
- Hash Partition: 해시 함수를 적용하여 파티션을 수행한다. 
- Composite Partition: 범위와 해시를 복합적으로 사용하여 파티션을 수행한다.

테이블 병합

  • 1:1 관계의 테이블을 하나의 테이블로 병합해서 성능을 향상시킨다.
  • 1:N 관계의 테이블을 병합하여 성능을 향상시킨다. 하지만 많은 양의 데이터 중복이 발생한다.
  • 슈퍼 타입과 서브 타입 관계가 발생하면 테이블을 통합하여 성능을 향상시킨다.
[Super type과 Sub type]
- 슈퍼타입과 서브타입의 관계는 배타적 관계와 포괄적 관계가 있는데, 
	배타적 관계는 고객이 개인이거나 법인고객인 경우를 의미한다.
- 포괄적인 관계는 고객이 개인고객일 수도 있고 법인고객일 수도 있는 것이다.

슈퍼 타입 및 서브 타입 변환 방법

 

https://sodayeong.tistory.com/106

저작자표시 (새창열림)

'프로그래밍 언어 > SQL' 카테고리의 다른 글

[SQL] 데이터 타입 CHAR, VARCHAR  (0) 2024.08.06
[SQL] 인덱스 힌트 / 옵티마이저 힌트 사용 방법 (주석, 튜닝)  (0) 2024.08.06
[SQL] GROUP BY 절 사용법 (그룹별 집계)  (0) 2024.07.29
[SQL] INSERT 문 사용법 3가지 (데이터 입력)  (0) 2024.07.29
[DB] 트랜잭션 (Transaction) 4가지 특성  (0) 2024.07.15
    '프로그래밍 언어/SQL' 카테고리의 다른 글
    • [SQL] 데이터 타입 CHAR, VARCHAR
    • [SQL] 인덱스 힌트 / 옵티마이저 힌트 사용 방법 (주석, 튜닝)
    • [SQL] GROUP BY 절 사용법 (그룹별 집계)
    • [SQL] INSERT 문 사용법 3가지 (데이터 입력)
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바