데이터베이스 정규화는 관계형 데이터베이스에서 데이터의 중복을 최소화하고, 데이터의 일관성과 무결성을 확보하기 위해 테이블을 구조화하는 과정이다.
잘못 설계된 테이블에서는 데이터를 추가, 수정, 삭제할 때 예기치 않은 문제가 발생할 수 있다.
정규화는 이러한 '이상 현상'을 방지하는 핵심적인 역할을 한다.
만약 정규화를 제대로 하지 않으면 다음과 같은 데이터 이상 현상이 발생할 수 있다.
아래와 같은 '수강 신청 테이블'이 있다고 가정해보자.
| 학생 ID | 학생 이름 | 학과 | 과목 코드 | 과목명 | 담당 교수 |
|---|---|---|---|---|---|
| 101 | 김철수 | 컴퓨터공학 | CS101 | 컴퓨터 개론 | 이영희 |
| 102 | 박민지 | 전자공학 | CS101 | 컴퓨터 개론 | 이영희 |
| 101 | 김철수 | 컴퓨터공학 | EE201 | 회로 이론 | 김민준 |
삽입 이상 (Insertion Anomaly)
아직 수강 신청을 하지 않은 새로운 학생 '홍길동'을 추가하고 싶어도, 신청한 '과목 코드'가 없으면 데이터를 추가할 수 없다.
즉, 불필요한 데이터(과목 정보)가 있어야만 학생 정보를 추가할 수 있는 모순이 발생한다.
갱신 이상 (Update Anomaly)
'이영희' 교수가 '최영희'로 개명했다면, '컴퓨터 개론'을 수강하는 모든 학생의 데이터에서 교수 이름을 일일이 바꿔야 한다.
만약 하나라도 빠뜨리면 데이터의 일관성이 깨진다.
삭제 이상 (Deletion Anomaly)
'박민지' 학생이 '컴퓨터 개론' 수강을 취소하면 해당 행이 삭제된다.
이때 '컴퓨터 개론' 과목을 수강하는 학생이 아무도 없다면, '컴퓨터 개론' 과목 정보 자체가 데이터베이스에서 사라져 버린다.
정규화는 바로 이러한 문제들을 해결하기 위해 테이블을 논리적으로 분해하는 과정이다.
규칙: 테이블의 모든 컬럼은 반드시 원자값을 가져야 한다.
원자값이라는 것은 컬럼의 값이 더 이상 쪼개질 수 없다는 의미이다.
[정규화 전]
| 학생 ID | 학생 이름 | 수강 과목 |
|---|---|---|
| 101 | 김철수 | 컴퓨터 개론, 자료구조 |
| 102 | 박민지 | 회로 이론 |
위 테이블에서 '수강 과목' 컬럼은 두 개의 값을 가지고 있으므로 제1정규형을 위반한다.
[제1정규화 후]
| 학생 ID | 학생 이름 | 수강 과목 |
|---|---|---|
| 101 | 김철수 | 컴퓨터 개론 |
| 101 | 김철수 | 자료구조 |
| 102 | 박민지 | 회로 이론 |
이렇게 각 행이 하나의 의미를 갖도록 값을 분리하면 제1정규화가 완료된다.
규칙: 제1정규화를 만족해야 하고, 부분 함수 종속성(Partial Functional Dependency)을 제거해야 한다.
쉽게 말해, 기본 키(Primary Key)가 여러 컬럼으로 구성된 복합 키일 경우, 테이블의 다른 모든 컬럼은 기본 키 전체에 종속되어야 한다. 기본 키의 일부에만 종속된 컬럼이 있다면 테이블을 분리해야 한다.
[정규화 전]
기본 키가 (학생 ID, 과목 코드)인 테이블이 있다.
| 학생 ID | 과목 코드 | 학생 이름 | 학과 | 성적 |
|---|---|---|---|---|
| 101 | CS101 | 김철수 | 컴퓨터공학 | A+ |
| 101 | EE201 | 김철수 | 컴퓨터공학 | B |
| 102 | CS101 | 박민지 | 전자공학 | A |
학생 이름, 학과는 기본 키의 일부인 학생 ID에만 종속된다. (학생 ID만 알면 학생 이름을 알 수 있다)
성적은 학생 ID와 과목 코드 모두에 종속된다. (누가 어떤 과목을 들었는지 알아야 성적을 알 수 있다)
이처럼 기본 키의 일부에만 종속되는 '부분 함수 종속성'이 존재하므로 제2정규형을 위반한다.
[제2정규화 후]
부분 함수 종속성을 제거하기 위해 테이블을 다음과 같이 분리한다.
학생 테이블
| 학생 ID | 학생 이름 | 학과 |
|---|---|---|
| 101 | 김철수 | 컴퓨터공학 |
| 102 | 박민지 | 전자공학 |
수강 테이블
| 학생 ID | 과목 코드 | 성적 |
|---|---|---|
| 101 | CS101 | A+ |
| 101 | EE201 | B |
| 102 | CS101 | A |
이제 모든 컬럼이 각 테이블의 기본 키 전체에 종속되므로 제2정규화가 완료된다.
규칙: 제2정규화를 만족해야 하고, 이행적 함수 종속성(Transitive Functional Dependency)을 제거해야 한다.
이행적 함수 종속성이란, A → B이고 B → C일 때 A → C가 성립하는 관계를 말한다.
즉, 기본 키가 아닌 일반 컬럼이 다른 일반 컬럼을 결정해서는 안 된다.
[정규화 전]
| 과목 코드 | 과목명 | 담당 교수 | 교수 연락처 |
|---|---|---|---|
| CS101 | 컴퓨터 개론 | 이영희 | 010-1111-1111 |
| DS202 | 자료구조 | 김민준 | 010-2222-2222 |
| OS303 | 운영체제 | 이영희 | 010-1111-1111 |
이 테이블에서 과목 코드는 기본 키이다.
과목 코드 → 담당 교수 (과목 코드를 알면 담당 교수를 알 수 있다)
담당 교수 → 교수 연락처 (담당 교수를 알면 그의 연락처를 알 수 있다)
기본 키가 아닌 '담당 교수' 컬럼이 '교수 연락처' 컬럼을 결정하고 있으므로 이행적 종속 관계가 존재한다. 이는 제3정규형을 위반한다. (교수 연락처가 바뀌면 여러 행을 수정해야 하는 갱신 이상 발생)
[제3정규화 후]
이행적 종속성을 제거하기 위해 테이블을 분리한다.
과목 테이블
| 과목 코드 | 과목명 | 담당 교수 |
|---|---|---|
| CS101 | 컴퓨터 개론 | 이영희 |
| DS202 | 자료구조 | 김민준 |
| OS303 | 운영체제 | 이영희 |
교수 테이블
| 담당 교수 | 교수 연락처 |
|---|---|
| 이영희 | 010-1111-1111 |
| 김민준 | 010-2222-2222 |
이렇게 분리하면 더 이상 일반 컬럼끼리 종속되는 관계가 사라지므로 제3정규화가 완료된다.
실무에서는 보통 제3정규화까지 마치는 것을 목표로 한다.
더 높은 단계의 정규화도 있지만, 3NF까지 진행하면 대부분의 데이터 이상 현상을 해결할 수 있다.
정규화는 데이터의 중복을 막고 무결성을 지키기 위한 필수적인 과정이다.
정규화된 데이터베이스는 장기적으로 훨씬 안정적이고 확장성 있는 시스템의 기반이 된다.
강의에서 교수님께서 항상 하시던 말씀이 있다.
정규화를 배우는 이유는 데이터베이스를 정규화 하기 위함이라기 보다는 설계시에 정규화가 필요없는 좋은 데이터베이스를 설계하기 위함이라고 하셨다.
정규화를 이해하고 애초부터 정규화가 필요없는 데이터베이스를 설계해야겠다.
다음 글에서는 무결성에 대해 다뤄보겠다.