코딩항해기

[DBMS] 정규화 Normalization 본문

DBMS

[DBMS] 정규화 Normalization

miniBcake 2024. 8. 16. 13:49

 

 

정규화 Normalization

중복된 데이터를 최소화하고, 데이터 무결성(Data Integrity)를 유지하기 위해 데이터베이스를 구조화하는 과정이다.

데이터의 일관성을 높이고 데이터 저장 공간을 효율적으로 사용하여 이상 현상(Anoamalies)을 방지한다.

정규화 단계는 순차적으로 진행해야한다.

 

제 1 정규형 (1NF) 테이블 컬럼이 하나의 값을 갖도록 분리하는 것
제 2 정규형 (2NF) PK의 일부가 아닌 컬럼들이 PK 전체에 종속되도록 분리하는 것
(복합식별자일 때 진행된다)
제 3 정규형 (3NF) PK가 아닌 컬럼이 다른 컬럼을 종속하지 않도록 분리하는 것
보이스-코드 정규형(BCNF) 모든 함수적 종속성이 후보 키에 대해서만 성립하도록 하는 것
제 4 정규형 (4NF) 한 테이블에 여러 개의 독립된 다치 종속 관계가 존재하지 않도록 분리하는 것
제 5 정규형 (5NF) 데이터 중복을 없애기 위해 모든 종속성을 충족하는 최소한의 테이블로 분리하는 것

 

> 정규화 예시

더보기

1. 제 1 정규형 (1NF)

테이블의 모든 컬럼이 원자값(단일 값)만을 포함해야한다. 즉, 각 셀에 하나의 값만 저장되어야 한다.

 

비정규화 상태 (원시 테이블)

OrderID CustomerName Products
1 Alice Laptop, Mouse
2 Bob Keyboard, Monitor

정규화 상태


OrderID CustomerName
1 Alice
2 Bob

 

OrderID ProductName
1 Laptop
1 Mouse
2 Keyboard
2 Monitor

원시 테이블에서는 Products 칼럼이 여러 값을 포함할 수 있지만, 1NF에서는 이를 분리하여 OrderProducts 테이블을 만들어 각 제품을 독립적으로 저장한다.

 

 

2. 제 2 정규형 (2NF)

기본 키가 복합 키(여러 속성으로 구성된 키)일 때, 기본 키의 일부에만 종속된 컬럼을 분리하여 모든 비기본 키 컬럼이 기본 키 전체에 종속되도록 한다.

 

비정규화 상태


StudentID CourseID StudentName CourseName
1 101 John Math
1 102 John Science
2 101 Alice Math

정규화 상태


Students
StudentID
1
2

 

Courses
CourseID
101
102

 

StudentCourses
StudentID
1
1
2

StudentName과 CourseName이 각각 StudentID와 CourseID에 종속된 경우, 이를 Students와 Courses 테이블로 분리하여 모든 비기본 키 컬럼이 기본 키 전체에 종속되도록 한다.

 

 

3. 제 3 정규형 (3NF)

비기본 키 컬럼이 다른 비기본 키 컬럼에 종속되지 않도록 하여, 기본 키에 직접적으로만 종속되도록 한다.

 

비정규화 상태


Employee ID EmployeeName DepartmentID DepartmentName
1 Bob 10 HR
2 Alice 20 IT

정규화 상태


Employees
EmployeeID
1
2

 

Departments
DepartmentID
10
20
 

DepartmentName이 DepartmentID에 종속되며, DepartmentID는 EmployeeID에 종속되므로, Departments 테이블로 분리하여 이행적 종속성을 제거한다.

 

 

4. 보이스-코드 정규형 (BCNF)

모든 함수적 종속성이 후보 키에 대해서만 성립하도록 한다. 즉, 모든 결정자가 후보 키여야 한다.

 

비정규화 상태


CourseID InstructorID InstructorName
101 1 Dr. Smith
101 2 Dr. Jones

정규화 상태


Courses
CourseID
101

Instructors
InstructorID
1
2

CourseInstructors
CourseID
101
101
 

원시 테이블에서는 InstructorName이 InstructorID에 종속되지만 InstructorID가 CourseID와 함께 기본 키가 아니므로 분리한다.

 

 

5. 제 4 정규형 (4NF)

한 테이블에 여러 개의 독립된 다치 종속(Multi-valued Dependency)이 존재하지 않도록 하여, 다치 종속이 별도의 테이블로 분리된다.

 

비정규화 상태


EmployeeID ProjectID Skill
1 101 Java
1 101 Python
2 102 JavaScript

정규화 상태


Employees
EmployeeID
1
2

Projects
ProjectID
101
102

Skills
Skill
Java
Python
JavaScript

 

EmployeeProjects
EmployeeID
1
2

 


EmployeeSkills
EmployeeID
1
1
2
 
 
Skill이 여러 프로젝트와 독립적으로 관련될 수 있으므로, ProjectAssignments와 EmployeeSkills 테이블로 분리하여 다치 종속성을 해결한다.

 

 

6. 제 5 정규형 (5NF)

모든 조인 종속성을 해결하여, 조인 연산 없이 원래의 테이블을 복구할 수 있는 최소한의 테이블로 분리한다.

 

비정규화 상태


OrderID ProductID SupplierID
1 A X
1 B Y
2 A X

정규화 상태


Orders
OrderID
1
2

 


Products
ProductID
A
B

 

Suppliers
SupplierID
X
Y

 

OrderDetails
OrderID
1
1
2

 

ProductSuppliers
ProductID
A
B
A

OrderDetails가 ProductSuppliers와 결합된 경우, 각각의 조인 종속성을 해결하여 원래 테이블을 재구성할 수 있도록 분리한다.

 

 

역정규화

읽기 기능을 향상시키기 위해 일부 데이터를 중복시켜 데이터베이스를 최적화하는 과정이다.

정규화가 잘 된 데이터 베이스는 데이터 일관성을 유지하지만 복잡한 쿼리가 필요한 경우 성능이 저하될 수 있다.

이러한 성능 저하를 방지하기 위해 정규화로 분할된 테이블을 다시 합치는 과정이다.

정규화 단계별로 역정규화가 이루어질 수 있지만, 역정규화는 데이터베이스의 최종 설계 및 운영에 따라 결정된다.

'DBMS' 카테고리의 다른 글

[DBMS] Oracle에서 MySQL로 데이터 이관 (CSV/DBeaver)  (0) 2024.10.03
[DBMS/XML] CDATA  (0) 2024.09.05
[DBMS] 데이터베이스, DBMS  (0) 2024.07.26
[DBMS] ERD 표기방식  (0) 2024.07.10
[DBMS] 데이터 독립성 : ANSI-SPARC 아키텍처  (0) 2024.07.09