정규화 & 역정규화 정리
목차
1. 정규화(Normalization) 개념
2. 단계별 정규화
3. 역정규화(또는 비정규화, Denormalization)
1. 정규화(Normalization) 개념
정규화란?
데이터 중복을 최소화하고 무결성을 향상시키기 위한 목적으로 릴레이션을 분해하는 과정을 의미한다. 쉽게말하면, 정리되지 않은 큰 테이블을 효율적으로 관리하기 위해 여러 개의 테이블로 분리하는 작업을 말한다.
정규화란?
>> 데이터 중복 최소화 및 무결성 향상을 위해 정리되지 않은 테이블을 여러 개의 테이블로 분리하는 작업
목적
1. 데이터 중복 최소화
2. 이상 현상(Anormly) 방지
2. 데이터 무결성 향상
이상현상(Anormly)
이상현상이란 테이블을 잘못 설계해서 데이터 삽입, 수정, 삭제에서 발생하는 논리적인 오류를 말한다. 각각의 이상 현상을 간단하게 요약하면 아래와 같으며, 구체적으로 어떤 경우를 말하는지 그림으로 확인해보자.
1. 삽입 이상 - 데이터 삽입 시 의도하지 않은 데이터도 같이 삽입해야하는 현상
2. 갱신 이상 - 데이터 갱신 시 일부만 갱신되어 데이터에 모순이 발생하는 현상
3. 삭제 이상 - 데이터 삭제 시 의도하지 않은 다른 정보도 연쇄적으로 삭제되는 현상
1. 삽입 이상
아래 왼쪽 그림을 보면 정규화가 되지 않은 테이블에 회원 정보를 삽입하려 한다. 회원이 수강할 강좌는 아직 정해져있지 않은 상태이다. 이런 상황일 경우, 테이블에 회원 정보를 추가하기 위해 아직 정해지지 않은 강좌의 정보도 임의의 값(eg. NULL) 을 넣어야 테이블에 추가할 수 있다. 이러한 오류를 '삽입 이상'이라 한다.
2. 갱신 이상
아래 왼쪽 그림처럼 테이블이 존재하고, '수영' 강좌의 금액을 44000원으로 인상하려 한다. 아래 테이블에서 수영 강좌를 수강한 사람들의 금액을 모두 변경해야하는데 오류가 생겨서 일부만 갱신되는 경우 데이터에 모순이 발생한다. 이러한 오류를 '갱신 이상' 이라고 한다.
3. 삭제 이상
체육센터에서 탁구 강좌 인기가 없어서 폐강을 하려고 한다. 이를 위해 DB에서 삭제하려고 하는데 테이블 분리가 안되어 있다보니 해당 튜플을 삭제해야한다. 이때, 의도하지 않게 회원 정보도 같이 삭제되는데 이러한 오류를 '삭제 이상' 이라고 한다.
2. 단계별 정규화
정규화는 여러 단계를 통해 이뤄지며, 각 단계는 특정 유형의 문제를 해결한다. 이론상으로 제 5 정규화까지 존재하나, 실무에서는 제 3정규화까지 진행한다.
개념 | |
제 1 정규화 | 한 칸에 하나의 값만 존재하도록 만드는 과정 |
제 2 정규화 | 기본키 중 특정 컬럼에 종속된 컬럼을 분리하는 과정 |
제 3 정규화 | 일반 컬럼(기본키 X)에 종속된 컬럼을 분리하는 과정 |
제 1 정규화
모든 데이터 값을 원자적으로 만드는 과정이다.
쉽게 말하면 한 칸에 하나의 데이터만 들어가도록 만드는 과정이다. 만약 한 칸에 데이터가 2개 이상이라면, 해당 데이터를 분해한다.
제 2 정규화
제 1 정규형을 만족하는 테이블에서 기본키 중 일부에 종속되는 컬럼을 분리해주는 과정이다.
기존 테이블에서 특정 컬럼을 조합해서 각 튜플을 구분하는 기본키를 만들 수 있는 상황에서, 기본키 외의 컬럼이 기본키의 컬럼중 하나에 종속된다면 해당 컬럼을 분리해준다.
예시를 통해 살펴보자. 아래 수강신청 테이블에서 '회원 이름' 과 '프로그램'을 조합하면 각 튜플을 구분할 수 있는 기본키를 만들 수 있다. 그런데 다른 컬럼을 살펴보면 '가격' 과 '강사'는 기본키의 '프로그램'에 종속되는 것을 알 수 있다. 이러한 컬럼들을 '프로그램' 테이블로 분리해준다.
이렇게 테이블의 기본키 중 한 컬럼에 기본키 외의 컬럼이 종속되는 것을 Partial Dependency(부분적 종속) 라고 하며, 제 2정규화는 이러한 Partial Dependency를 제거하는 과정이다. 이러한 제 2 정규화의 의미는 해당 테이블 주제와 관련이 없는 컬럼들을 분리하는 것으로 이해하면 된다.
제 3 정규화
제 2정규형을 만족하는 테이블에서 기본키 외의 컬럼 사이에서 종속성이 존재하는 경우 관련 컬럼을 분리하는 과정이다.
예를 들어, 이전 제 2정규화에서 분리한 프로그램 테이블에 '강사'의 '출신 대학' 이 적힌 컬럼이 존재한다고 가정해보자. 이 경우 '출신 대학'이라는 컬럼이 '강사'에 종속되는 것을 알 수 있고, 해당 테이블에서의 기본키가 '프로그램' 이기 때문에 기본키와 무관한 일반 컬럼에 종속되어 있는 것을 알 수 있다. 이러한 컬럼들을 아래 오른쪽 그림과 같이 강사 테이블로 분리를 해주면 제 3 정규형을 만족하는 테이블을 만들 수 있다.
3. 역정규화(또는 비정규화, Denormalization)
역정규화란 정규화를 통해 만든 이상적인 테이블을, 성능 및 개발 편의성을 위해 조작하는 과정을 말한다. 정규화를 하면 완벽한 테이블이 아닌가 싶겠지만 정규화에는 단점이 존재한다. 테이블을 분리했기 때문에 값을 읽을 때 테이블간 조인이 수행되며, 이 조인 연산은 비용이 비싸다는 특징이 있다.
실제 서비스에서 가장 많은 부분을 차지하는 것은 읽기 연산이기 때문에 비용을 줄이기 위해 정규화로 만든 이상적인 테이블 조작하는 역정규화 과정이 필요하다.
역정규화는 정규화와 다르게 별도의 규칙이 존재하지 않고, 상황에 따라 컬럼을 조작한다. 정규화를 통해 테이블을 분리했는데 무조건 조인을 해서 가져오는 상황 밖에 없다면 두 테이블을 합치는 것이 합리적일 수도 있다. 또한, 테이블에서 특정 컬럼만 읽기 기능이 수행된다면 읽기를 많이 수행하는 컬럼과 다른 컬럼을 분리할 수도 있다. 역정규화는 이와 같이 상황에 따라 진행된다.
정리
1. 정규화 개념
정규화: 데이터 중복성 최소화 및 이상 현상 방지 등을 위해 릴레이션을 분리하는 과정
** 이상현상: 잘못된 테이블 설계로 삽입,갱신, 삭제 연산 시 발생하는 오류
삽입이상: 의도하지 않은 데이터를 함께 삽입해야하는 오류
갱신이상: 일부만 수정되어 데이터 모순이 발생하는 오류
삭제이상: 의도하지 않은 데이터도 같이 삭제되는 오류
2. 단계별 정규화
1. 제1 정규화: 한칸에 하나의 값만 존재하도록 분리
2. 제2 정규화: 기본키 중 하나의 컬럼에 종속되는 다른 컬럼들을 분리
3. 제3 정규화: 일반컬럼에 종속되는 다른 컬럼들을 분리
3. 역정규화
- 읽기 성능 향상을 위해 정규화된 테이블의 컬럼을 조작하는 과정
- 정규화를 한 후, 필요시 역정규화를 진행
[참고 링크]
https://coding-factory.tistory.com/872#google_vignette
https://dev-coco.tistory.com/63
https://www.youtube.com/watch?v=qx0m1YXGel4
https://www.youtube.com/watch?v=Y1FbowQRcmI