programming/database

데이터베이스 정규화

worldint 2024. 10. 26. 15:21

정규화란?

정규화(Normalization)란 데이터베이스의 데이터 중복과 불일치를 줄이기 위해 데이터 구조를 체계적으로 정리하는 과정

 

왜하나?

일관성,무결성을 높여 데이터 삽입, 수정, 삭제 시 발생할 수 있는 여러 문제를 효과적으로 방지하기 위해서

새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다

 

정규화의 종류

제 1정규화(1NF)

각 테이블의 모든 필드가 원자값(Atomic Value)을 가져야 한다

즉, 하나의 칸에는 하나의 값만 존재해야 한다

  • 각 컬럼이 하나의 속성만을 가져야한다.
  • 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야한다.
  • 각 컬럼이 유일한 이름을 가져야한다.
  • 칼럼의 순서가 상관없어야한다.

제 2정규화(2NF)

두 번째 정규형은 첫 번째 정규형을 만족하면서, 부분 함수 종속을 제거하는 것

이는 기본 키의 일부에만 종속된 속성을 분리하여 새로운 테이블로 나누는 것을 의미

이를 통해 데이터 중복을 줄이고 데이터의 일관성을 높일 수 있다

예)

 

이건 1형정규형만 한 상태,

이 테이블은 제2 정규형(2NF)을 만족하지 않음

StudentNameStudentID에만 종속되고,

CourseNameInstructorNameCourseID에만 종속되는 부분 종속성이 있기 때문에

StudentID (기본키 일부) CourseID(기본키 일부) StudentName CourseName InstructorName
1 C101 John Math Smith
1 C102 John Science Brown
2 C101 Alice Math Smith
2 C103 Alice English Taylor

 

2형 정규형을 만족하려면 테이블을 아래와 같이 나눠야한다

 

- 학생 테이블

StudentID (기본키) StudentName
1 John
2 Alice

 

- course 테이블

CourseID (기본키) CourseName InstructorName
C101 Math Smith
C102 Science Brown
C103 English Taylor

- 학생 과목 등록 테이블

StudentID (기본키) CourseID (기본키)

1 C101
1 C102
2 C101
2 C103

 

제 3정규화(3NF)

세 번째 정규형은 두 번째 정규형을 만족하면서,

이행적 종속(Transitive Dependency)을 제거하는 것

즉, 기본 키에 직접적으로 종속되지 않는 속성을 분리하는 과정

 

아래의 2형정규형만 만족하는 테이블에서 

EmployeeID (기본키) EmployeeName DepartmentID DepartmentName ManagerName
1 Alice D001 Sales John
2 Bob D002 IT Susan
3 Charlie D001 Sales John
4 David D003 HR Mary

 

3형 정규형을 만족하도록 바꾸려면 테이블을 나눠야함

 

직원테이블

EmployeeID (기본키) EmployeeNameDepartmentID DepartmentID
1 Alice D001
2 Bob D002
3 Charlie D003
4 David D004

 

부서 테이블

DepartmentID (기본키) DepartmentName ManagerName
D001 Sales John
D002 IT Susan
D003 HR Mary

 

 

정규화의 한계

과도한 정규화는 테이블을 지나치게 분리시켜 쿼리 성능을 저하시킬 수 있으며,

복잡한 join 연산이 필요하게 될 수 있다

그래서 데이터베이스의 성능을 위해 "비정규화(Denormalization)"를 고려하기도 함