cs/database

[database] 데이터베이스 정규화란?

sunm2n 2025. 9. 17. 14:32

1. 데이터베이스 정규화 -> 중복을 없애고 데이터 무결성을 높이는 과정

 

데이터베이스 정규화(Normalization)는 관계형 데이터베이스를 설계할 때 데이터의 중복을 최소화하고 데이터의 일관성과 무결성을 확보하기 위해 테이블을 논리적으로 분해하는 과정이다.

 

 이 과정을 통해 데이터 삽입, 수정, 삭제 시 발생할 수 있는 각종 이상 현상(Anomaly)을 방지하고, 보다 효율적이고 안정적인 데이터베이스 구조를 만들 수 있다.

 

정규화는 여러 단계로 나뉘며, 각 단계를 **정규형(Normal Form)**이라고 부른다.

 

차수가 높은 정규형일수록 더 엄격한 제약 조건을 만족해야 한다.

 

일반적으로 제3정규형(3NF)이나 보이스-코드 정규형(BCNF)까지 정규화를 수행하는 경우가 많다.

 


2. 정규화의 주요 목적

 

데이터 중복 최소화: 불필요한 데이터 중복을 제거하여 저장 공간을 효율적으로 사용한다.

 

데이터 무결성 보장: 데이터의 일관성을 유지하고 잘못된 데이터가 입력되는 것을 방지한다.

 

이상 현상(Anomaly) 방지:

  • 삽입 이상: 불필요한 데이터 없이는 원하는 데이터를 삽입할 수 없는 문제
  • 갱신 이상: 중복된 데이터 중 일부만 수정되어 데이터 불일치가 발생하는 문제
  • 삭제 이상: 특정 데이터를 삭제할 때 원하지 않는 다른 데이터까지 함께 삭제되는 문제

데이터베이스 구조 확장 용이성: 새로운 데이터 유형이 추가될 때 데이터베이스 구조 변경을 최소화한다.

 


3. 주요 정규형 단계 

 

 

 

4와 5는 고급 정규형 이므로 제외하고 보이스 코드 까지만 알아보기로 하자

 

제1정규형 (1NF: First Normal Form)

 

"테이블의 모든 컬럼 값이 원자값(Atomic Value)을 갖도록 하라."

 

제1정규형은 가장 기본적인 정규형으로, 테이블의 한 칸(속성 값)에는 오직 하나의 값만 있어야 한다는 규칙이다. 만약 하나의 칸에 여러 개의 값이 들어 있다면, 이는 제1정규형을 위반하는 것이다.

 

예시:

 

정규화 전 (1NF 위반) 

 

| 학생ID | 이름 | 수강과목 |

| :--- | :--- | :--- |

| 1001 | 김철수 | '수학', '과학' |

| 1002 | 박영희 | '국어' |

 

정규화 후 (1NF 만족) 

 

| 학생ID | 이름 | 수강과목 |

| :--- | :--- | :--- |

| 1001 | 김철수 | 수학 |

| 1001 | 김철수 | 과학 |

| 1002 | 박영희 | 국어 |

 


제2정규형 (2NF: Second Normal Form)

 

"부분 함수 종속을 제거하라."

 

 

제2정규형은 테이블이 제1정규형을 만족하고, 기본키(Primary Key)가 여러 개의 컬럼으로 구성된 복합키일 경우, 기본키의 일부에만 종속되는 컬럼이 없어야 한다는 규칙이다.

 

즉, 모든 컬럼은 반드시 기본키 전체에 종속되어야 한다.

 

 

예시: (기본키: {학생ID, 과목코드})

 

정규화 전 (2NF 위반)

 

 '성적'은 {학생ID, 과목코드} 모두에 종속되지만, '교수이름'은 '과목코드'에만 종속이다. (부분 함수 종속)

 

| 학생ID | 과목코드 | 성적 | 교수이름 |

| :--- | :--- | :- | :--- |

| 1001 | M01 | A+ | 이순신 |

| 1001 | P01 | A | 홍길동 |

| 1002 | M01 | B | 이순신 |

 

정규화 후 (2NF 만족)

 

 부분 함수 종속을 제거하기 위해 테이블을 분리한다.

 

[과목 정보 테이블]

 

 | 과목코드 | 교수이름 |

| :--- | :--- |

| M01 | 이순신 |

| P01 | 홍길동 |

 

 

[수강 테이블] 

| 학생ID | 과목코드 | 성적 |

| :--- | :--- | :- |

| 1001 | M01 | A+ |

| 1001 | P01 | A |

| 1002 | M01 | B |

 


제3정규형 (3NF: Third Normal Form)

"이행적 함수 종속을 제거하라."

 

제3정규형은 테이블이 제2정규형을 만족하고, 기본키가 아닌 모든 컬럼들 간에는 서로 종속 관계가 없어야 한다는 규칙이다.

 

즉, A → B 이고 B → C 일 때, A → C 가 성립하는 관계(이행적 종속)를 제거해야 한다.

 

예시: (기본키: {학생ID})

 

정규화 전 (3NF 위반): '학생ID'가 '학과코드'를 결정하고, '학과코드'가 '학과이름'과 '사무실위치'를 결정한다. (이행적 함수 종속)

| 학생ID | 이름 | 학과코드 | 학과이름 | 사무실위치 |

| :--- | :--- | :--- | :--- | :--- |

| 1001 | 김철수 | CS | 컴퓨터공학과 | 301호 |

| 1002 | 박영희 | EE | 전자공학과 | 205호 |

| 1003 | 이민준 | CS | 컴퓨터공학과 | 301호 |

 

정규화 후 (3NF 만족): 이행적 종속을 제거하기 위해 테이블을 분리한다.

 

[학과 테이블] 

| 학과코드 | 학과이름 | 사무실위치 |

| :--- | :--- | :--- | |

CS | 컴퓨터공학과 | 301호 | | EE | 전자공학과 | 205호 |

 

[학생 테이블]

 | 학생ID | 이름 | 학과코드 |

| :--- | :--- | :--- |

| 1001 | 김철수 | CS |

| 1002 | 박영희 | EE |

| 1003 | 이민준 | CS |


보이스-코드 정규형 (BCNF: Boyce-Codd Normal Form)

"모든 결정자가 후보키(Candidate Key)여야 한다."

 

BCNF는 제3정규형보다 더 엄격한 조건을 가진 정규형으로, 모든 함수 종속 관계에서 결정자(Determinant)가 후보키여야 한다는 규칙이다.

 

제3정규형은 기본키가 아닌 컬럼 간의 종속만 제거했지만, BCNF는 후보키가 아닌 컬럼이 다른 컬럼을 결정하는 모든 경우를 제거한다.

 

일반적으로 제3정규형을 만족하면 BCNF도 만족하는 경우가 많지만, 복잡한 함수 종속 관계가 존재할 경우 BCNF를 위반할 수 있다.

 

정규화, 항상 정답일까?

정규화는 데이터의 일관성과 무결성을 높이는 중요한 과정이지만, 테이블을 지나치게 분해하면 데이터를 조회할 때 여러 테이블을 조인(JOIN)해야 하므로 성능이 저하될 수 있다. 따라서 시스템의 성능과 데이터의 무결성 사이의 균형을 맞추는 것이 중요하며, 때로는 의도적으로 정규화를 낮추는 **반정규화(Denormalization)**를 수행하기도 한다.

'cs > database' 카테고리의 다른 글

[SQL] view  (0) 2025.06.09