정규화(Normalization)는 데이터베이스 설계에서 데이터의 중복을 최소화하고 데이터 무결성을 보장하기 위해 테이블을 구조화하는 과정입니다. 이를 통해 데이터 수정, 삭제, 삽입 시 발생할 수 있는 문제를 줄이고, 데이터베이스의 효율적인 관리를 가능하게 합니다.
정규화는 여러 단계로 나뉘며, 각 단계는 이전 단계보다 더 엄격한 규칙을 적용합니다. 대표적으로 1차 정규형(1NF)부터 3차 정규형(3NF), 그리고 보이스-코드 정규형(BCNF)까지 주로 사용됩니다. 아래에서 각 단계에 대해 자세히 설명하겠습니다.
1. 1차 정규형 (1NF, First Normal Form)
조건: 각 테이블의 모든 컬럼이 원자값(Atomic Value)을 가져야 합니다.
- 원자값: 더 이상 나눌 수 없는 하나의 값. 즉, 각 셀에는 하나의 값만 있어야 합니다.
- 중복된 열이나 반복 그룹을 제거합니다.
예시:
- 잘못된 테이블 (1NF가 아닌 경우):
- 학생 ID 이름 과목
1 홍길동 수학, 과학 2 이순신 영어, 역사 - 1NF로 변환:
- 학생 ID 이름 과목
1 홍길동 수학 1 홍길동 과학 2 이순신 영어 2 이순신 역사
위와 같이 각 셀에 하나의 값만 포함하도록 변경하면 1차 정규형이 됩니다.
2. 2차 정규형 (2NF, Second Normal Form)
조건: 테이블이 1차 정규형에 속하고, 모든 비-기본 키 속성이 기본 키 전체에 완전 종속되어야 합니다.
- 기본 키가 여러 컬럼으로 구성된 경우, 비-기본 키 속성이 기본 키의 일부에만 종속되면 부분 종속이 발생합니다. 이러한 부분 종속을 제거해야 2차 정규형이 됩니다.
예시:
- 잘못된 테이블 (1NF만 만족):
- 학생 ID 과목 강사 이름
1 수학 김철수 1 과학 박영희 2 영어 이민호 - 문제점: 학생 ID와 과목을 기본 키로 구성했지만, 강사 이름은 과목에만 종속되어 있습니다. 이는 부분 종속입니다.
- 2NF로 변환:
- 학생-과목 테이블:
- 학생 ID 과목
1 수학 1 과학 2 영어 - 과목-강사 테이블:
- 과목 강사 이름
수학 김철수 과학 박영희 영어 이민호
위와 같이 비-기본 키 속성(강사 이름)을 분리하여 테이블을 나누면 2차 정규형이 됩니다.
3. 3차 정규형 (3NF, Third Normal Form)
조건: 테이블이 2차 정규형에 속하고, 모든 비-기본 키 속성이 기본 키에만 직접 종속되어야 합니다.
- 즉, 비-기본 키 속성 간의 이행적 종속을 제거해야 합니다. 이행적 종속이란 A → B, B → C인 경우 A → C로 간접적으로 종속되는 것을 의미합니다.
예시:
- 잘못된 테이블 (2NF만 만족):
- 학생 ID 과목 강사 이름 강사 전화번호
1 수학 김철수 010-1234-5678 1 과학 박영희 010-9876-5432 2 영어 이민호 010-1357-2468 - 문제점: 강사 전화번호는 강사 이름에 종속되어 있습니다. 이는 과목이 강사 이름을 결정하고, 강사 이름이 강사 전화번호를 결정하는 이행적 종속입니다.
- 3NF로 변환:
- 학생-과목 테이블:
- 학생 ID 과목
1 수학 1 과학 2 영어 - 과목-강사 테이블:
- 과목 강사 이름
수학 김철수 과학 박영희 영어 이민호 - 강사-전화번호 테이블:
- 강사 이름 강사 전화번호
김철수 010-1234-5678 박영희 010-9876-5432 이민호 010-1357-2468
위와 같이 이행적 종속을 제거하여 테이블을 분리하면 3차 정규형이 됩니다.
4. 보이스-코드 정규형 (BCNF, Boyce-Codd Normal Form)
- 조건: 테이블이 3차 정규형에 속하며, 모든 결정자가 후보 키여야 합니다.
- 3차 정규형보다 더 엄격한 형태로, 일부 3NF를 만족하는 테이블이 특정 상황에서 BCNF를 만족하지 않는 경우가 있습니다.
5. 4차 정규형 (4NF, Fourth Normal Form)
조건
- 테이블이 BCNF를 만족하고, 다치 종속(Multi-valued Dependency)을 제거해야 합니다.
- 다치 종속이란 하나의 속성이 여러 다른 속성 집합과 독립적으로 관계를 가질 때 발생합니다.
예시
- 예를 들어, 한 학생이 여러 과목과 여러 취미를 가질 수 있다고 합시다.
- 학생 ID 과목 취미
1 수학 음악 감상 1 과학 음악 감상 1 수학 독서 1 과학 독서 - 이 테이블에서는 학생 ID와 과목의 다치 종속 관계와 학생 ID와 취미의 다치 종속 관계가 있습니다.
- 학생 ID와 과목, 학생 ID와 취미 사이의 관계를 각각 독립적으로 관리할 수 있도록 테이블을 분리해야 합니다.
4NF로 변환
- 다치 종속을 제거하여 다음과 같이 두 개의 테이블로 분리합니다.
- 학생-과목 테이블:
학생 ID 과목
| 1 | 수학 |
| 1 | 과학 |
- 학생-취미 테이블:
학생 ID 취미
| 1 | 음악 감상 |
| 1 | 독서 |
이렇게 독립적인 다치 종속 관계를 분리하면 4차 정규형이 됩니다.
6. 5차 정규형 (5NF, Fifth Normal Form)
조건
- 테이블이 4차 정규형을 만족하고, 조인 종속(Join Dependency)이 제거되어야 합니다.
- 조인 종속은 테이블의 분리가 조인으로부터 완전히 무손실로 복원될 수 있는지를 결정하는 것으로, 테이블이 여러 속성들 간의 복잡한 관계를 갖는 경우 발생합니다.
- 주로 테이블이 다중 값 종속이나 조인을 통해 여러 개로 분리되었다가 다시 합쳐져야 할 때 5NF를 고려합니다.
예시
- 예를 들어, 한 프로젝트에는 여러 부서가 참여하고, 부서마다 여러 직원이 배정된다고 가정해보겠습니다.
- 프로젝트 부서 직원
프로젝트1 부서A 직원1 프로젝트1 부서A 직원2 프로젝트1 부서B 직원3 프로젝트2 부서A 직원1 프로젝트2 부서B 직원4 - 여기서 복잡한 관계를 갖는 프로젝트-부서-직원의 조합을 테이블로 나누어 표현했을 때, 조인을 통해 무손실로 원래 테이블을 복원할 수 있어야 합니다.
5NF로 변환
- 이 테이블을 5NF로 분리하면 다음과 같이 여러 테이블로 나누어집니다.
- 프로젝트-부서 테이블:
프로젝트 부서
| 프로젝트1 | 부서A |
| 프로젝트1 | 부서B |
| 프로젝트2 | 부서A |
| 프로젝트2 | 부서B |
- 부서-직원 테이블:
부서 직원
| 부서A | 직원1 |
| 부서A | 직원2 |
| 부서B | 직원3 |
| 부서B | 직원4 |
- 프로젝트-직원 테이블 (추가적으로 필요한 경우):
프로젝트 직원
| 프로젝트1 | 직원1 |
| 프로젝트1 | 직원2 |
| 프로젝트1 | 직원3 |
| 프로젝트2 | 직원1 |
| 프로젝트2 | 직원4 |
이렇게 복잡한 관계를 최대한 분리하여 무손실 조인이 가능한 형태로 만들면 5차 정규형이 됩니다.
7. 정규화 단계 요약
- 1NF: 모든 컬럼이 원자값을 가져야 한다.
- 2NF: 1NF를 만족하고, 모든 비-기본 키 속성이 기본 키 전체에 완전 종속되어야 한다.
- 3NF: 2NF를 만족하고, 비-기본 키 속성 간의 이행적 종속이 없어야 한다.
- BCNF: 모든 결정자가 후보 키여야 한다.
- 4NF: 다치 종속을 제거해야 한다.
- 5NF: 조인 종속을 제거하여 테이블을 최대한 분리해야 한다.
정규화의 목적
정규화의 주된 목적은 데이터의 중복을 최소화하고, 무결성을 유지하며, 데이터베이스의 구조를 최적화하는 것입니다. 정규화를 잘 수행하면 데이터 삽입, 수정, 삭제 시 발생할 수 있는 이상 현상을 방지하고, 데이터베이스의 효율적인 관리가 가능해집니다.
4NF와 5NF는 데이터베이스의 구조가 매우 복잡하고 대규모인 경우에 주로 사용됩니다. 일반적인 데이터베이스에서는 3NF나 BCNF까지 정규화하는 경우가 많습니다.
'Category > 정보처리기사' 카테고리의 다른 글
| 악성 프로그램 관련 문제 (0) | 2024.10.07 |
|---|---|
| 조인(Join)이란? (0) | 2024.10.07 |
| 정처기 네트워크 관련 용어와 개념 (1) | 2024.10.07 |
| 서브넷 마스크로 네트워크 범위 계산하기 (0) | 2024.10.07 |
| C언어 포인터 관련 계산 문제 (1) | 2024.10.03 |