정규화는 데이터베이스 설계에서 데이터 중복을 줄이고 무결성을 유지하기 위한 프로세스입니다.
정규화를 통해 데이터를 구조화하면서 저장 공간을 절약하고, 데이터 갱신, 삭제, 삽입 시 발생할 수 있는 이상 현상을 방지할 수 있습니다.
여기서는 BCNF까지만 다루도록 하겠습니다.
모든 데이터는 원자값을 가져야 한다. (하나의 컬럼에 여러 값이 들어있지 않아야한다.)
예시: 고객 테이블이 아래와 같이 구성되어 있다고 가정합니다.
| 고객ID | 이름 | 구매 물품 | |
|---|---|---|---|
| ⭕ | 1 | 홍길동 | 치약, 칫솔 |
| ❌ | 2 | 전우치 | 비누 |
문제점: 구매 물품을 별도의 테이블로 분리
고객 테이블:
| 고객ID | 이름 |
|---|---|
| 1 | 홍길동 |
| 2 | 전우치 |
구매 물품 테이블:
| 고객ID | 구매 물품 |
|---|---|
| 1 | 치약 |
| 1 | 칫솔 |
| 2 | 비누 |
1NF 만족 + 부분 함수 종속 제거.(기본 키의 일부에 종속된 컬럼은 분리.)
쉽게 말해 일반속성은 주식별자 "전체"에 종속이어야 한다.
예시: 아래 테이블에서 기본 키는 (학생ID, 과목)입니다.
| 학생ID | 과목 | 점수 | 학생 이름 |
|---|---|---|---|
| 1 | 수학 | 90 | 홍길동 |
| 1 | 영어 | 85 | 홍길동 |
| 2 | 수학 | 88 | 전우치 |
문제점: 학생 이름은 학생ID에만 종속되므로, 과목과는 관계가 없습니다.
해결방법: 학생 정보를 별도의 테이블로 분리.
학생 테이블
| 학생ID | 학생 이름 |
|---|---|
| 1 | 홍길동 |
| 2 | 전우치 |
성적 테이블
| 학생ID | 과목 | 점수 |
|---|---|---|
| 1 | 수학 | 90 |
| 1 | 영어 | 85 |
| 2 | 수학 | 88 |
2NF 만족 + 이행적 종속 제거.(주식별자를 제외한 일반속성들 간의 종속이 있으면 안된다.)
이행적 종속: A → B, B → C 관계가 있을 때, A가 C를 간접적으로 결정하는 경우
예시: 아래 테이블에서 상품번호는 상품명에 종속되어 있습니다.
| 고객ID | 이름 | 우편번호 | 지역 |
|---|---|---|---|
| 1 | 홍길동 | 12345 | 서울특별시 |
| 2 | 전우치 | 67890 | 부산광역시 |
문제점: 지역은 우편번호에 종속되어 있으므로 중복 데이터가 발생!
해결방법: 우편번호와 지역 정보를 별도의 테이블로 분리.
3NF 변환 후
고객 테이블
| 고객ID | 이름 | 우편번호 |
|---|---|---|
| 1 | 홍길동 | 12345 |
| 2 | 전우치 | 67890 |
우편번호 테이블
| 우편번호 | 지역 |
|---|---|
| 12345 | 서울특별시 |
| 67890 | 부산광역시 |
3NF 만족 + 모든 결정자가 후보 키여야 함.
3NF는 대부분의 데이터 중복 문제를 해결하지만, 결정자가 후보키가 아닌 경우 데이터 이상(Anomaly)이 발생할 가능성이 남아 있다.
BCNF는 이러한 문제를 해결하기 위해 모든 결정자를 후보키로 만드는 것을 목표로함.
예시: 강의 테이블에서 강의실은 강사에 따라 결정.
| 강의실 | 시간 | 강의 | 강사 |
|---|---|---|---|
| 201 | 10:00 | 수학 | 홍길동 |
| 202 | 15:00 | 과학 | 홍길동 |
| 203 | 10:00 | 영어 | 김철수 |
| 204 | 15:00 | 체육 | 전우치 |
문제점: 강사가 강의실을 결정하지만, 강의는 기본키의 일부가 아니고, 후보 키가 아님.
해결방법: 강의와 강사를 별도의 테이블로 분리
강의-강사 테이블
| 강의 | 강사 |
|---|---|
| 수학 | 홍길동 |
| 과학 | 홍길동 |
| 영어 | 김철수 |
| 체육 | 전우치 |
강의실 시간표 테이블
| 강의실 | 시간 | 강의 |
|---|---|---|
| 201 | 10:00 | 수학 |
| 201 | 15:00 | 과학 |
| 202 | 10:00 | 영어 |
| 203 | 15:00 | 체육 |