정규화란?
정규화(Normalization)는 데이터베이스 설계 시 데이터의 중복을 최소화하고 일관성을 유지하기 위한 과정입니다.
정규화를 통해 데이터를 체계적으로 구조화하여 데이터 무결성을 보장하고, 효율적인 데이터 관리를 도모할 수 있습니다.
왜 정규화가 필요한가?
- 데이터 중복 방지: 중복된 데이터를 제거함으로써 데이터 일관성을 유지할 수 있습니다.
- 업데이트 이상 제거: 데이터 수정, 삭제, 삽입 시 발생할 수 있는 비정상적인 동작을 방지합니다.
- 데이터 무결성 보장: 데이터의 정확성과 일관성을 유지합니다.
- 효율적인 저장공간 사용: 중복 데이터를 줄여 저장소 공간을 절약합니다.
- 유연한 확장성 제공: 잘 정규화된 데이터베이스는 새로운 데이터를 추가하거나 변경하기 쉽습니다.
정규화의 단점
- 복잡성 증가: 테이블이 세분화되어 쿼리가 복잡해질 수 있습니다.
- 성능 저하 가능성: 데이터를 조회할 때 여러 테이블을 조인해야 할 경우 성능이 떨어질 수 있습니다.
정규화의 단계
정규화는 여러 단계로 나뉘며, 각 단계는 특정한 설계 문제를 해결합니다.
▷ 1NF (제1정규형)
- 데이터가 원자 값(Atomic Value)으로 분리되어 있어야 합니다.
- 하나의 칸(셀)에 여러 값이 들어가지 않아야 합니다.
ex)
| 학번 | 과목 | 점수 |
| 1 | 국어, 영어 | 90, 85 |
| 2 | 영어, 수학 | 90,100 |
위의 테이블에서 하나의 셀이 여러 값을 가지고 있으므로 제 1 정규형을 만족하지 못합니다.
아래와 같이 제 1 정규형으로 수정해줍니다.
| 학번 | 과목 | 점수 |
| 1 | 국어 | 90 |
| 1 | 영어 | 85 |
| 2 | 영어 | 90 |
| 2 | 수학 | 100 |
▷ 2NF (제2정규형)
- 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
- 여기서 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다.
ex)
| 이름 | 나이 | 수강과목 |
| 홍길동 | 21 | JS |
| 홍길동 | 21 | DB |
| 이순신 | 22 | Java |
| 이순신 | 22 | JQuery |
| 이산 | 23 | C |
위와 같은 테이블을 아래와 같이 2개의 테이블로 나눠줌으로써 제 2 정규형에 적합하게 됩니다.
| 이름 | 나이 |
| 홍길동 | 21 |
| 이순신 | 22 |
| 이산 | 23 |
| 이름 | 수강과목 |
| 홍길동 | JS |
| 홍길동 | DB |
| 이순신 | Java |
| 이순신 | JQuery |
| 이산 | C |
▷ 3NF (제3정규형)
- 2NF를 만족하며, 이행적 종속(Transitive Dependency)을 제거해야 합니다.
- 여기서 이행적 종속이라는 것은 A->B, B->C가 성립할 때 A->C가 성립되는 것을 의미합니다.
ex)
| 학번 | 수강과목 | 수강료 |
| 1 | DB | 10000 |
| 2 | DB | 10000 |
| 3 | JS | 20000 |
| 4 | Java | 30000 |
기존의 테이블에서 학번은 수강과목을 결정하고 있고, 수강과목은 수강료를 결정하고 있다.
그렇기 때문에 이를 (학번, 수강과목) 테이블과 (수강과목, 수강료) 테이블로 아래와 같이 분해해야 됩니다.
| 학번 | 수강과목 |
| 1 | DB |
| 2 | DB |
| 3 | JS |
| 4 | Java |
| 수강이름 | 수강료 |
| DB | 10000 |
| JS | 20000 |
| Java | 30000 |
▷ BCNF (보이스-코드 정규형)
- 3NF를 만족하며, 모든 결정자가 후보키(candidate key)여야 합니다.
- 복합키가 있는 경우 비정규성을 제거합니다.
ex}
| 교수ID | 과목명 | 깅의실 |
| P1 | 데이터베이스 | 101 |
| P2 | 네트워크 | 102 |
| P1 | 운영체제 | 103 |
| P2 | 데이터베이스 | 101 |
위의 테이블의 경우 데이터가 중복되고 갱신 이상이 발생하게됩니다.
교수ID → 강의실과 교수ID, 과목 → 강의실 간의 종속성을 제거하여
각 테이블에서 모든 결정자가 후보키이므로 BCNF를 만족합니다.
| 교수ID | 강의실 |
| P1 | 101 |
| P2 | 102 |
| 교수ID | 과목명 |
| P1 | 데이터베이스 |
| P1 | 운영체제 |
| P2 | 네트워크 |
| P2 | 데이터베이스 |
'BackEnd > MySQL' 카테고리의 다른 글
| [DB] DCL (0) | 2024.09.18 |
|---|---|
| [DB] VIEW , SEQUENCE, INDEX (2) | 2024.09.17 |
| [DB] DDL(Data Definition Language) ALTER, DROP (0) | 2024.09.17 |
| [DB] DDL(Data Definition Language) CREATE (1) | 2024.08.25 |
| [DB] DML (Data Manipulation Language) (1) | 2024.08.25 |