본문 바로가기

DB

[DB] 데이터베이스 정규화

정규화란?

정규화는 릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나서 이를 해결하거나, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정입니다. 정규화는 무결성을 충족시키기 위해 같은 의미를 담는 릴레이션을 더 좋은 구조로 만들면서 자료의 중복은 최소화하고 독립적인 관계는 별개의 릴레이션으로 표현해야 하며, 각각의 릴레이션은 독립적인 표현이 가능해야 합니다.

 

이상 현상

  • 삽입 이상(insertion anomalies) : 원하지 않는 데이터가 삽입되거나 필요한 데이터가 삽입되지 않아 발생하는 문제
  • 삭제 이상(deletion anomalies) : 하나의 데이터를 삭제할 때 다른 필요한 데이터까지 같이 삭제되는 문제
  • 수정(갱신) 이상(modification anomalies) : 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어지는 문제

정규화 과정

  1. 제 1정규형 - 도메인이 원자값
  2. 제 2정규형 - 부분 함수 종속 제거
  3. 제 3정규형 - 이행적 함수 종속 제거
  4. 보이스/코드 정규형(BCNF 정규형) - 결정자이면서 후보키가 아닌 함수 종속 제거

제 1정규형

제 1정규형은 릴레이션의 모든 도메인이 더 이상 분해될 수 없는 원자 값만으로만 구성되어야 합니다.

예를 들어 아래 수정 전 테이블과 같이 하나의 속성(수강명 or 성취도)에 두 개 이상의 값을 가지는 반복 집합이 있으면 안됩니다. 이런 경우에는 수정 후 릴레이션 처럼 반복 집합을 제거해서 도메인이 원자 값만 갖도록 수정해주어야 합니다.

 

수정 전

유저번호 유저ID 수강명 성취도
1 KEY {백엔드, 프런트엔드} {90%, 10%}
2 JIN {Spring 기초, Python 기초} {7%, 8%}

 

수정 후

유저번호 유저ID 수강명 성취도
1 KEY 백엔드 90%
1 KEY 프런트엔드 10%
2 JIN Spring 기초 7%
2 JIN Python 기초 8%

제 2정규형

제 2정규형은 제 1정규형 조건을 만족하면서 부분 함수의 종속성을 제거한 형태를 말합니다. 종속성이란 X와 Y라는 컬럼이 있을때 X의 값이 Y의 값을 유일하게 식별하면 Y는 X에 종속되어 있다고 표현합니다. 부분 함수의 종속성 제거란 기본키 중에 특정 컬럼에만 종속된 컬럼이 없어야 한다는 것입니다. 예를 들어 아래 수정 전 테이블은 기본키로 유저ID와 수강명을 가지고 있는데 유저 번호의 경우 유저ID 기본키에는 종속적이지만 수강명 기본키에는 종속적이지 않습니다. 그래서 수정 후 테이블 처럼 유저 번호가 유저ID 기본키에만 종속적이도록 테이블을 나눠주어야 합니다.

 

이때 주의할 점은 릴레이션을 분해할 때 동등한 릴레이션으로 분해해야 하고 정보 손실이 발생하지 않도록 무손실 분해로 분해되어야 합니다.

 

수정 전

유저번호 유저ID 수강명 성취도
1 KEY 백엔드 90%
1 KEY 프런트엔드 10%
2 JIN Spring 기초 7%
2 JIN Python 기초 8%

 

수정 후

유저번호 릴레이션

유저번호 유저ID
1 KEY
2 JIN

성취도 릴레이션

유저ID 수강명 성취도
KEY 백엔드 90%
KEY 프런트엔드 10%
JIN Spring 기초 7%
JIN Python 기초 8%

제 3정규형

제 3정규형은 제 1, 제 2 정규형을 만족하면서 기본키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않는 형태를 말합니다. 이행적 종속 함수란 A -> B와 B -> C가 존재하면 논리적으로 A -> C가 성립하는데 이때 집합 C가 집합 A에 이행적으로 종속 되었다고 합니다. 아래 수정 전 테이블을 예로 들면 유저ID 컬럼은 등급을 결정하고 다시 등급 컬럼은 할인율을 결정함으로 이행적 종속 관계입니다. 이런 경우 수정 후 테이블처럼 등급 컬럼과 할인율 컬럼을 분리 함으로써 이행적 함수 종속을 제거할 수 있습니다.

 

수정 전

유저ID 등급 할인율
KEY 플래티넘 30%
JIN 다이아 50%
YOUNG 마스터 70%

 

수정 후

등급 릴레이션

유저ID 등급
KEY 플래티넘
JIN 다이아
YOUNG 마스터

할인율 릴레이션

등급 할인율
플래티넘 30%
다이아 50%
마스터 70%

보이스/코드 정규형 (BCNF 정규형)

BCNF 정규형이란 제1, 제2, 제3 정규형을 만족하고 결정자이면서 후보키가 아닌 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태를 말합니다.

 

  • 후보키 : 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족하는 키
  • 결정자 : 함수 종속 관계에서 특정 종속자를 결정짓는 요소, X -> Y 일 때 X는 결정자, Y는 종속자입니다.
  • 유일성 : 중복되는 값이 없음
  • 최소성 : 필드를 조합하지 않고 최소 필드만 써서 키를 형성할 수 있는 것

아래 조건을 만족하는 유저ID-수강명-강사 테이블이 존재한다고 가정하겠습니다.

  • 각 수강명에 대해 한 학생은 오직 한 강사의 강의만 수강한다.
  • 각 강사는 한 수강명만 담당한다.
  • 한 수강명은 여러 강사가 담당할 수 있다.
유저ID 수강명 강사
KEY 백엔드 SEOK
JIN 프런트엔드 YEN
KEY 백엔드 HYUK
JIN 프런트엔드 HARIM

위 테이블에서 강사 속성은 수강명을 결정짓는 결정자이지만 후보키가 아닙니다. 그렇기 때문에 모든 결정자가 후보키인 상태가 되도록 강사 속성을 테이블로부터 분리시켜 주어야 합니다.

유저ID 강사
KEY SEOK
JIN YEN
KEY HYUK
JIN HARIM
수강명 강사
백엔드 SEOK
프런트엔드 YEN
백엔드 HYUK
프런트엔드 HARIM

정규화 장점

  1. 데이터베이스 변경 시 이상 현상 제거
  2. 데이터베이스 구조 확장 시 재 디자인 최소화 - 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 됩니다. 이는 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되며 응용프로그램의 생명을 연장시킵니다.
  3. 사용자에게 데이터 모델을 더욱 의미있게 제공 - 정규화된 테이블들과 정규화된 테이블들간의 관계들은 현실 세계에서의 개념들과 그들간의 관계들을 반영합니다.

정규화 단점

  1. 테이블을 분리하여 정규화를 진행하므로 테이블 간 JOIN 연산이 증가하여 데이터 처리 속도가 느려질 수 있습니다. 따라서 서비스에 따라 정규화 또는 반정규화 과정을 진행해야 합니다.

'DB' 카테고리의 다른 글

[DB] 인덱스 개념 및 원리  (2) 2023.08.15
[DB] 트랜잭션과 격리 수준  (0) 2022.10.24