BackEnd/MySQL

[DB] 정규화(Normalization)

Hojung7 2025. 1. 9. 20:30
정규화란?

 

정규화(Normalization)는 데이터베이스 설계 시 데이터의 중복을 최소화하고 일관성을 유지하기 위한 과정입니다.

정규화를 통해 데이터를 체계적으로 구조화하여 데이터 무결성을 보장하고, 효율적인 데이터 관리를 도모할 수 있습니다.


왜 정규화가 필요한가?

 

  1. 데이터 중복 방지: 중복된 데이터를 제거함으로써 데이터 일관성을 유지할 수 있습니다.
  2. 업데이트 이상 제거: 데이터 수정, 삭제, 삽입 시 발생할 수 있는 비정상적인 동작을 방지합니다.
  3. 데이터 무결성 보장: 데이터의 정확성과 일관성을 유지합니다.
  4. 효율적인 저장공간 사용: 중복 데이터를 줄여 저장소 공간을 절약합니다.
  5. 유연한 확장성 제공: 잘 정규화된 데이터베이스는 새로운 데이터를 추가하거나 변경하기 쉽습니다.

정규화의 단점

 

  • 복잡성 증가: 테이블이 세분화되어 쿼리가 복잡해질 수 있습니다.
  • 성능 저하 가능성: 데이터를 조회할 때 여러 테이블을 조인해야 할 경우 성능이 떨어질 수 있습니다.

 

정규화의 단계

 

정규화는 여러 단계로 나뉘며, 각 단계는 특정한 설계 문제를 해결합니다.

 

▷ 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