정규화(Normalization)란
⭐️ 정규화란 ?
정규화란 어떤 대상을 일정한 규칙이나 기준에 맞게 변환하거나, 비정상적인 상태를 정상적인 상태로 만드는것이다.
🧐 그럼 데이터베이스에선 정규화를 사용하는 이유가 무엇일까 ?
데이터베이스에서 정규화의 목적은 "테이블 간에 중복된 데이터를 허용하지 않는다"는 것이다.
중복된 데이터를 허용하지 않음으로써 무결성을 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.
* 무결성 : 데이터 또는 정보가 손상되거나 변형되지 않고 정확하게 유지되는 것
데이터베이스에선 이러한 테이블을 분해하여 정규화를 시킬 수 있는 방법을 제공하는데, 테이블이 어떻게
분해되는지에 따라 정규화 단계가 달라지는데, 각각의 정규화 단계에 대해서 알아보겠다.
⭐️ 제1정규형 (1NF: First Normal Form)
🔥 조건 및 설명
- 모든 컬럼은 원자값(Atomic Value)를 가져야 함.
- 컬럼 값에 중첩되거나 반복되는 값이 있으면 안됨
- 한 셀에는 하나의 값만 있어야 하며, 리스트나 쉼표로 구분된 값이 들어가면 안됨
즉, 테이블이 스프레드시트처럼 각 셀에 하나의 정보만 담고 있어야 한다는 개념이다.
[ 정규화 전 테이블 ]
이름 | 나이 | 수강과목 |
홍길동 | 20 | C, C++ |
이순신 | 21 | Java |
이산 | 22 | DB , 운영체제 |
[ 제1 정규화 후 ]
이름 | 나이 | 수강과목 |
홍길동 | 20 | C |
홍길동 | 20 | C++ |
이순신 | 21 | Java |
이산 | 22 | DB |
이산 | 22 | 운영체제 |
→ 한 행의 컬럼이 하나의 값만 갖도록 정규화 완료
⭐️ 제2정규형 (2NF: Second Normal Form)
🔥 조건 및 설명
- 1NF를 만족해야함
- 테이블의 모든 속성이 기본키 전체에 대해 완전 함수 종속되어야 함
- 즉, 기본키의 일부만 가지고 특정 컬럼이 결정되지 않아야 함 -> 부분 함수 종속이 되지 않아야함.
완전 함수 종속 : 기본키 전체로만 어떤 속성이 결정되는 경우
부분 함수 종속 : 기본키가 2개 이상인데, 그중 일부만으로 어떤 속성이 결정된는경우
복합키를 사용하는 테이블에서 주로 발생하는 문제로, 기본키 일부에만 의존하는 컬럼이 있으면 분리해야 한다.
[ 예시 : 1NF 테이블 ]
이름 | 나이 | 수강과목 |
홍길동 | 20 | C |
홍길동 | 20 | C++ |
이순신 | 21 | Java |
이산 | 22 | DB |
이산 | 22 | 운영체제 |
- 기본키 후보 : (이름,수강과목)
- 수강과목 또는 이름만 알아도 나이를 알 수 있음 → 부분 종속 발생
[ 2NF 분해 ]
1. 수강 테이블
이름 | 수강과목 |
홍길동 | C |
홍길동 | C++ |
이순신 | Java |
이산 | DB |
이산 | 운영체제 |
2. 인물 테이블
이름 | 나이 |
홍길동 | 20 |
이순신 | 21 |
이산 | 22 |
→ 2정규화를 통해 각 테이블이 완전 함수 종속만 갖도록 만듦.
⭐️ 제3정규형 (3NF: Third Normal Form)
🔥 조건 및 설명
- 2NF를 만족해야 함
- 이행적 종속이 없어야 함
- 즉, 기본키가 아닌 컬럼이 다른 컬럼에 의해 결정되면 안 됨
어떤 컬럼이 기본키가 아닌 다른 컬럼을 통해 간접적으로 결정된다면, 그 관계는 분리해야 한다.
[ 예시 : 2NF 상태에서 확장 -> 예시를 위해 2정규형을 어기면서 3정규형을 보여줌 -
2정규형을 하면 3정규형도 만족하는 경우가 많기떄문]
이름 | 수강과목 | 과목유형 |
홍길동 | C | 언어 |
홍길동 | C++ | 언어 |
이순신 | Java | 언어 |
이산 | DB | 데이터베이스 |
이산 | 운영체제 | 시스템 |
- 과목유형은 수강과목에 의해 결정됨
- 이름은 수강과목을 결정 → 이행적 종속 발생 (이름 → 수강과목 → 과목유형) → 기본키 아닌 컬럼을 통해 간접 결정됨.
[ 3NF 분해 ]
1. 수강 테이블
이름 | 수강과목 |
홍길동 | C |
홍길동 | C++ |
이순신 | Java |
이산 | DB |
이산 | 운영체제 |
2. 과목유형 테이블
수강과목 | 과목유형 |
C | 언어 |
C++ | 언어 |
Java | 언어 |
DB | 데이터베이스 |
운영체제 | 시스템 |
→ 3정규화를 통해 각 테이블의 이행적 종속을 제거 하였다.
✅ BCNF (Boyce-Codd Normal Form)
✅ 조건 및 설명
- 3NF를 만족해야 함
- 모든 결정자가 후보키여야 함
- 즉, 후보키가 아닌 컬럼이 결정자가 되면 안 됨
결정자(어떤 값을 결정하는 열)가 후보키가 아니면, 설계상 문제가 될 수 있어 분해가 필요합니다.
🔍 예시
수강과목 | 강의실 | 교수명 |
C | 101호 | 홍길동 |
C++ | 101호 | 홍길동 |
Java | 102호 | 이순신 |
- 강의실 → 교수명 (결정자)
- 하지만 강의실은 후보키가 아님 → BCNF 위반
✅ BCNF 분해
1. 강의실 테이블
강의실 | 교수명 |
101호 | 홍길동 |
102호 | 이순신 |
2. 과목-강의실 테이블
수강과목 | 강의실 |
C | 101호 |
C++ | 101호 |
Java | 102호 |