[DB] 정규화란?

bbbooo·2024년 1월 3일

정규화란?

  • 데이터베이스 내 중복을 최소화하고 데이터 구조를 효율적으로 만들기 위한 과정



제 1정규화

학생이름강의
홍길동수학, 영어
이순신수학, 과학

위와 같은 테이블이 있다고 가정해보자. 위 테이블에서 홍길동 이라는 학생이 수강한 강의수학, 영어 두가지 값을 갖기 때문에 원자성을 갖지 않는다.

원자성이란? 더이상 나눌 수 없는 값을 의미한다. 즉, 하나의 데이터만을 갖는 것을 뜻한다.

제1 정규화는 '각 로우마다 컬럼의 값이 원자 값을 가져야 한다'는 것을 명시하는 규칙이다. 따라서 위 테이블을 제1 정규화를 만족하도록 한다면 각 로우마다 하나의 강의를 가지도록 변경할 수 있다.


학생이름강의
홍길동수학
홍길동영어
이순신수학
이순신과학




제2 정규화

학생이름 (PK1)강의 (PK2)강의실
홍길동수학301호
홍길동영어201호
이순신수학301호
이순신과학101호

위와 같은 테이블이 있다고 가정해보자. 학생이름강의는 복합키이다. 이때, 강의실학생이름이 아닌 강의에 종속되어있다.
제2 정규화는 '테이블의 모든 컬럼이 기본 키에 완전히 함수적으로 종속되어야 한다'는 규칙이다. 따라서, 위 테이블은 제2 정규화에 위반되는 테이블이다. 이를 제2 정규화에 만족하도록 한다면 아래와 같이 강의강의실을 분리하여 테이블을 만들 수 있다.


학생이름강의
홍길동수학
홍길동영어
이순신수학
이순신과학
강의강의실
수학301호
영어201호
수학301호
과학101호



제3 정규화

직원ID(PK)직원명부서ID(FK)부서명
1홍길동10영업부
2이순신20개발부
3임꺽정10영업부
4강감찬30인사부

위와 같은 테이블이 있다고 가정해보자. 기본키를 제외한 나머지 컬럼은 모두 기본키에 종속되어있다. 그러나, 해당 테이블에는 부서ID -> 부서명 이라는 종속 관계도 가지고 있다.
제3 정규화는 테이블 내 모든 컬럼은 이행적 종속 관계를 가지지 않는다는 규칙이다.

이행적 종속 관계란? A -> B, B -> C 종속 관계에서 유도되는 A -> C 종속관계를 의미한다. 위 테이블에서는 직원ID -> 부서ID, 부서ID -> 부서명 이라는 종속관계를 통해 직원ID -> 부서명 이라는 이행적 종속 관계가 형성된다.

이를 해결하기 위해선 테이블을 분리할 필요가 있다. 부서 정보를 갖는 테이블을 따로 분리하면 다음과 같이 분리할 수 있다.


직원 테이블
직원ID | 직원명 | 부서ID
-- | -- | --
1 | 홍길동 | 10
2 | 이순신 | 20
3 | 임꺽정 | 10
4 | 강감찬 | 30


부서 테이블
부서ID | 부서명
-- | --
10 | 영업부
20 | 개발부
30 | 인사부




종종 제2 정규화와 제3 정규화를 헷갈리는 경우가 있는데, 궁극적인 차이점은 "어떤 종류의 함수적 종속성을 제거하느냐"에 있다.

제2 정규화는 "부분 함수적 종속"을 제거하는 것이 목표다. 따라서 제2 정규화는 복합 키를 가진 테이블에서만 적용된다.

부분 함수적 종속이란, 복합 키의 일부에만 종속되는 속성이다.

반면, 제3 정규화는 "이행적 함수적 종속"을 제거하는 것이 목표다. 제3 정규화는 이러한 이행적 함수적 종속을 제거하여, 모든 비키 속성이 기본 키에만 직접적으로 종속되도록 만든다.
결과적으로, 제2 정규화와 제3 정규화 모두 테이블을 분리하여 데이터의 중복을 최소화하고 무결성을 향상시키는 것이 공통 목표지만 어떤 종류의 함수적 종속을 제거하냐가 큰 차이라고 볼 수 있다.

0개의 댓글