공부해봅시당

[DATABASE] 정규화와 반정규화 본문

STUDY/DATABASE

[DATABASE] 정규화와 반정규화

tngus 2024. 3. 8. 09:30

1. 정규화란?

`정규화`란 이상 문제를 해결하기 위해 속성들 끼리의 종속 관계를 분석하여 여러개의 릴레이션으로 분해하는 과정이다.
일반적으로 테이블을 여러개로 분해하면 속도는 상대적으로 느려질 수 있지만, 분해하지 않으면 `이상 문제`들이 발생하게 된다.

 

아래에서 어떤 `이상 문제`들이 발생할 수 있는지 살펴보자.

 

* 정규화? 정규형? 뀨? 뭐지?
여기서 정규화와 정규형이라는 용어가 혼동될 수 있는데, 정규화를 하면 정규형이 달성되는 것이다.
정규화는 과정이고, 정규형은 그 과정을 통해 도달하는 목표 상태 또는 단계를 지칭한다.

따라서 `제1정규형을 만족하기 위해 제1정규화를 진행한다`는 표현이 나오는 것이다.

 

2. 이상(Anomaly)

정규화를 거치지 않아 데이터베이스내에 데이터들이 불필요하게 중복되어 릴레이션 조작 시 예기치 못하게 발생하는 곤란한 현상

 

2-1. 삽입 이상(Insertion Anomaly)

릴레이션에 데이터를 삽입할 때 의도와 상관없이 원하지 않은 값들도 함께 삽입되는 현상

 

예를 들어 2101 학번 홍길동 학생의 연락처만 추가하고 싶을 때, 과목코드가 비게되므로 NULL 값을 가져 문제가 발생하게 된다.

 

2-2. 삭제 이상(Deletion Anomaly)

릴레이션에서 한 튜플을 삭제할 때 의도와는 상관없는 값들도 함께 삭제되는 현상


예를 들어 2101 학번의 홍길동 학생이 ST01 과목을 수강 취소할 경우, 취소 사유를 물을 수 있는 유일한 정보인 연락처마저 잃게 된다.

 

2-3. 갱신 이상(Update Anomaly)

릴레이션에서 튜플에 있는 속성 값을 갱신할 때 일부 튜플의 정보만 갱신되어 정보에 모순이 생기는 현상


예를 들어 홍길동 학생이 연락처를 바꿨을 경우에 ST01, ST02 모두 갱신해야 하는데 ST01만 갱신할 경우 발생한다.

 

3. 정규화 과정

 

 

3-0. 용어정리와 요약

1) 함수적 종속 (Functional Dependency)

X의 값에 따라 Y값이 결정될 때 X -> Y로 표현하는데, 이를 Y는 X에 대해 함수적 종속이라고 한다.

 

에를 들어 학번을 알면 이름을 알 수 있는데, 이 경우엔 학번이 X가 되고 이름이 Y가 된다.
X를 결정자라고 하고, Y는 종속자라고 한다.

 

함수적 종속에는 완전함수종속, 부분함수종속, 이행적함수종속이 있다.

 

(1) 부분함수종속 -> 부분함수종속을 제거한 것이 제2 정규형

`기본키가 단일키`일 경우 부분함수종속은 `일어날 수 없다.`
`기본키가 복합키`일 경우 `X1, X2 중 하나만으로도 Y의 값을 결정할 때` 부분 함수적 종속이라고 한다.

 

(2) 완전함수종속 -> 완전함수종속을 만족하는 것이 제2 정규형

`기본키가 단일키`일 경우 `X -> Y` 일 경우 완전함수적 종속이라고 한다.
`기본키가 복합키`일 경우 `{X1,X2} -> Y` 일 경우 완전함수적 종속이라고 한다.

 

(3) 이행적함수종속 -> 이행적함수종속을 제거한 것이 제3 정규형

X -> Y인데, Y -> Z

결국 X -> Z인 것을 알 수 있는 경우

 

 

2) 요약

 

 

3-1. 제1 정규형(First Normal Form, 1NF)

테이블(Relation)이 제 1정규형을 만족했다는 것은 아래 세 가지 조건을 만족했다는 것을 의미

1. 어떤 Relation에 속한 모든 Domain이 원자값만으로 되어있어야한다.
2. 모든 attribute에 반복되는 그룹이 나타나지 않아야 한다.
3. 기본키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할수 있어야 한다.

 

아래 릴레이션을 보면 여러 개의 전화번호를 가지고 있기 때문에 위 조건중 1번 조건인 원자값이 아니므로 제 1정규형에 위반된다.

 

아래 그림은 전화번호 그룹이 반복되어 2번조건을 위반한 사례이다.

 

3-2. 제2 정규형(Second Normal Form, 2NF)

기본키가 아닌 모든 속성이 기본키에 대해 완전 함수적 종속을 만족하는 정규형 (부분적 함수 종속을 제거한 정규형)

1. 1정규형을 만족해야 한다.
2. 모든 컬럼이 부분적 종속(Partial Dependency)이 없어야 한다. == 모든 칼럼이 완전 함수 종속을 만족해야 한다.

 

여기서 `완전 함수 종속`이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다.

 

아래와 같은 수강 강좌 테이블을 살펴보자.

 

- (학생번호, 강좌이름)

이 테이블에서 기본키는 (학생번호, 강좌이름)으로 복합키이다.

- (학생번호, 강좌이름) --> 성적

그리고 (학생번호, 강좌이름)인 기본키는 성적을 결정하고 있다.

- (강좌이름) --> (강의실)

그런데 여기서 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다.

 

즉, 기본키(학생번호, 강좌이름)의 부분키(강좌이름)가 결정자이기 때문에

위 테이블의 경우 아래와 같이 기존의 테이블에서 강의실을 분해하여 별도의 테이블로 관리해야 한다.

 

이를 통해 제2 정규형을 만족시킬 수 있다.

 

 

3-3. 제3 정규형(Third Normal Form, 3NF)

제2 정규형을 만족하는 테이블에서 이행적 함수종속을 제거한 정규형

1. 2 정규형을 만족해야 한다.
2. 기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 한다.

 

여기서 `이행적 함수종속`이라는 것은 A -> B, B -> C가 성립할 때, A -> C가 성립되는 것을 의미한다.

 

- (학생 번호) --> (강좌 이름), (강좌 이름) --> (수강료)
기존의 테이블에서 `학생 번호`는 `강좌 이름`을 결정하고 있고, `강좌 이름`은 `수강료`를 결정하고 있다.

그렇기 때문에 이를 (학생 번호, 강좌 이름) 테이블과 (강좌 이름, 수강료) 테이블로 분해해야 한다. 

 

이행적 종속을 제거하는 이유는 비교적 간단하다. 

예를 들어 501번 학생이 수강하는 강좌가 스포츠경영학으로 변경되었다고 하자. 

이행적 종속이 존재한다면 501번의 학생은 스포츠경영학이라는 수업을 20000원이라는 수강료로 듣게 된다. 

물론 강좌 이름에 맞게 수강료를 다시 변경할 수 있지만, 이러한 번거로움을 해결하기 위해 제3 정규화를 하는 것이다. 

 

즉, 학생 번호를 통해 강좌 이름을 참조하고, 강좌 이름으로 수강료를 참조하도록 테이블을 분해해야 하며 그 결과는 다음의 그림과 같다.

이를 통해 제3 정규형을 만족시킬 수 있다.

 

3-4. BCNF 정규형(Boyce-Codd Normal Form)

제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해한 정규형

1. 3정규형을 만족해야 한다.
2. 모든 결정자가 후보키 집합에 속해야 한다.

 

 

- (학생번호, 특강이름)

특강수강 테이블에서 기본키는 (학생번호, 특강이름)이다.

그리고 기본키(학생번호, 특강이름)는 교수를 결정하고 있다.

여기서 교수는 특강이름을 결정하고 있다.

 

그런데 문제는 교수가 특강이름을 결정하는 결정자이지만 후보키가 아니라는 점이다.

그렇기 때문에 BCNF 정규형을 만족시키기 위해 아래와 같이 테이블을 분해해야 한다.

 

이를 통해 BCNF 정규형을 만족시킬 수 있다.

 

3-5. 제4 정규형(Fourth Normal Form, 4NF)

BCNF 정규화를 진행한 테이블에 대해 다치 종속을 제거한 정규형

 

1. BCNF를 만족해야 한다.
2. 다치 종속(Multi-valued Dependency)이 없어야 한다.

 


여기서 `다치 종속`이란 다음과 같은 조건들을 만족할 때를 뜻한다.
1. A->B 일 때 하나의 A값에 여러 개의 B값이 존재하면 다치 종속성을 가진다고 하고 A↠B라고 표시한다
2. 최소 3개의 칼럼이 존재한다.
3. R(A, B, C)가 있을 때 A와 B 사이에 다치 종속성이 있을 때 B와 C가 독립적이다.

위와 같은 테이블을 보자. 101번 학생은 자바와 C++ 과목을 수강하고, 노래와 게임을 취미로 가진다. 


이렇게 되면 학생 번호 하나에 과목 여러 개와 취미 여러 개가 종속된다. 이런 경우 학생 번호를 토대로 값을 조회하면 아래와 같이 중복이 발생하게 된다.


과목과 취미는 관계가 없는 독립적인 관계이다. 하지만 같은 테이블의 학생 번호라는 칼럼에 다치 종속되어버려 중복이 발생하는 문제가 생겼다.


4NF를 만족하기 위해서는 아래와 같이 분해하면 된다.

위 2개의 테이블은 여전히 다치 종속성을 가지지만, 2개 이상의 칼럼이 하나의 칼럼에 다치 종속되지는 않기 때문에 제4 정규형을 만족한다.

 

3-6. 제5 정규형(Fifth Normal Form, 5NF)

제5 정규형은 중복을 제거하기 위해 분해할 수 있을 만큼 전부 분해하는 것이다. 이러한 5NF는 Project Join Normal Form(PJNF)라고도 불린다. 이러한 제 5정규형은 다음과 같은 규칙을 만족해야 한다.

1. 4NF를 만족해야 한다.
2. 조인 종속(Join dependency)이 없어야 한다.
3. 조인 연산을 했을 때 손실이 없어야 한다.

 


조인 종속은 다치 종속의 좀 더 일반화된 형태이다. 만약 하나의 릴레이션을 여러 개의 릴레이션으로 무손실 분해했다가 다시 결합할 수 있다면 조인 종속이라고 한다. 

 

예를 들어 A라는 릴레이션을 B와 C로 분해했다가 다시 조인했을 때 그대로 A가 된다면, A는 조인 종속성이 있다고 한다.
 

제4 정규형을 만족하는 아래 테이블을 보자.

 

위 테이블을 조인 연산한 결과는 다음과 같다.

 

 

제4 정규형에서 조인연산 후 결과이고 여기서 나타나는 조인 종속성을 제거해주는 작업을 해야한다.

제4 정규형에서 조인 연산 실행 시

 

제5 정규화를 진행한 결과는 아래와 같다.

 


 
일반적으로 현실의 데이터베이스에서는 5 정규형을 사용하지 않는다.

제5 정규형에 대해 더 자세히 알고 싶다면 링크을 참고하자.

 

4. 정규화의 문제점

정규화는 데이터 조회 시에 조인을 유발하기 때문에 CPU와 메모리를 많이 사용한다.

 

이를 해결하기 위해 의도적으로 정규적 원칙을 위배하는 반정규화를 진행하기도 한다.

 

5. 반정규화

`반정규화`는 정규화의 일부를 되돌려, 데이터의 중복을 의도적으로 허용하고, 데이터베이스의 성능을 향상시키는 과정이다.

반정규화를 통해 데이터를 더 빠르게 조회할 수 있게 되지만, 데이터 중복으로 인해 데이터 무결성이 저하될 수 있으므로, 신중하게 결정해야 한다.

[데이터 무결성]
데이터의 정확성, 일관성, 신뢰성을 유지하는 것을 의미

- 도메인 무결성

   필드의 값이 정의된 도메인(유효한 값의 집합)에 속해야 한다는 것을 보장해야 함
- 개체 무결성
   각 행(레코드)이 고유함을 보장하며, 주 키 값이 유일하고, null이 아니어야 함
- 참조 무결성
   외래 키 값이 참조하는 테이블의 기본 키 값과 일치해야 하며, 관계의 일관성을 유지해야 함

 

5-1. 반정규화를 고려할 수 있는 상황

- 데이터베이스의 읽기 성능을 최적화해야 할 때
- 복잡한 쿼리를 단순화해야 할 때
- 시스템의 응답 시간을 단축시켜야 할 때

 

 

5-2. 반정규화 적용방법

 

 

5-3. 반정규화 기법

1) 테이블 반정규화

2) 컬럼 반정규화

3) 관계 반정규화

 


참조

https://sodayeong.tistory.com/106

 

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

정규화란? 정규화는 데이터의 일관성, 최소한의 데이터 중복, 최소한의 데이터 유연성을 위한 방법이며 데이터를 분해하는 과정이다. 정규화된 모델은 테이블이 분해된다. 테이블이 분해되면

sodayeong.tistory.com

https://wookcode.tistory.com/186

 

[데이터베이스] 정규화, 반정규화

정규화 정규화란 이상 문제를 해결하기 위해 속성들 끼리의 종속 관계를 분석하여 여러개의 릴레이션으로 분해하는 과정이다. 일반적으로 테이블을 여러개로 분해하면 속도는 상대적으로 느려

wookcode.tistory.com

https://mangkyu.tistory.com/110

 

[Database] 정규화(Normalization) 쉽게 이해하기

지난 포스팅에서 데이터베이스 정규화와 관련된 내용을 정리했었다. 하지만 해당 내용이 쉽게 이해되지 않는 것 같아서 정규화 관련 글을 풀어서 다시 한번 정리해보고자 한다. 1. 정규화(Normaliz

mangkyu.tistory.com

https://code-lab1.tistory.com/48

 

[DB] 정규화(Normalization)란? 정규화 예시, 1NF, 2NF, 3NF, BCNF

정규화(Normalization)란? 정규화는 이상현상이 있는 릴레이션을 분해하여 이상현상을 없애는 과정이다. 이상현상이 존재하는 릴레이션을 분해하여 여러 개의 릴레이션을 생성하게 된다. 이를 단계

code-lab1.tistory.com

https://code-lab1.tistory.com/270

 

[DB] 제 4정규형과 제 5정규형, 4NF와 5NF

정규화란? 정규화는 이상현상(Anomaly)이 있는 릴레이션을 분해하여 이상현상을 없애는 과정이다. 이상현상이 존재하는 릴레이션을 분해하여 여러 개의 릴레이션을 생성하게 된다. 이를 단계별로

code-lab1.tistory.com

https://geol2.tistory.com/209

 

정규화 : 제 5 정규화 (5NF)

정규화 데이터베이스의 이상현상의 원인이 되는 중복성을 제거하여 무결성을 보존하는 것 제 5 정규화 조인 속성을 제거 개발자 자격증 홍길동 정보처리기사 홍길동 빅데이터 분석 기사 장길산

geol2.tistory.com

https://dataonair.or.kr/db-tech-reference/d-guide/sql/?mod=document&uid=333#:~:text=%EB%B0%98%EC%A0%95%EA%B7%9C%ED%99%94%EB%A5%BC%20%EC%A0%95%EC%9D%98%ED%95%98%EB%A9%B4,%EC%9D%98%20%EA%B8%B0%EB%B2%95%EC%9D%84%20%EC%9D%98%EB%AF%B8%ED%95%9C%EB%8B%A4.

 

반정규화와 성능

1. 반정규화를 통한 성능향상 전략 가. 반정규화의 정의 반정규화(=역정규화) 용어는 조금 다르게 표현되어도 그 의미는 동일하다. 여기에서 반정규화는 ‘반(Half)’의 의미가 아닌 한자로 반대

dataonair.or.kr