코딩항해기
[DBMS] 정규화 Normalization 본문
정규화 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 |
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 |