정규화란?
정규화(Normalization)란 데이터베이스의 데이터 중복과 불일치를 줄이기 위해 데이터 구조를 체계적으로 정리하는 과정
왜하나?
일관성,무결성을 높여 데이터 삽입, 수정, 삭제 시 발생할 수 있는 여러 문제를 효과적으로 방지하기 위해서
새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다
정규화의 종류
제 1정규화(1NF)
각 테이블의 모든 필드가 원자값(Atomic Value)을 가져야 한다
즉, 하나의 칸에는 하나의 값만 존재해야 한다
- 각 컬럼이 하나의 속성만을 가져야한다.
- 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야한다.
- 각 컬럼이 유일한 이름을 가져야한다.
- 칼럼의 순서가 상관없어야한다.
제 2정규화(2NF)
두 번째 정규형은 첫 번째 정규형을 만족하면서, 부분 함수 종속을 제거하는 것
이는 기본 키의 일부에만 종속된 속성을 분리하여 새로운 테이블로 나누는 것을 의미
이를 통해 데이터 중복을 줄이고 데이터의 일관성을 높일 수 있다
예)
이건 1형정규형만 한 상태,
이 테이블은 제2 정규형(2NF)을 만족하지 않음
StudentName은 StudentID에만 종속되고,
CourseName과 InstructorName은 CourseID에만 종속되는 부분 종속성이 있기 때문에
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)"를 고려하기도 함
'programming > database' 카테고리의 다른 글
데이터베이스 인덱스 (0) | 2024.10.26 |
---|---|
데이터베이스 Lock의 종류 (0) | 2024.10.26 |
디비 데드락 (0) | 2024.10.19 |
[mongodb] mongoose Index 관련 (0) | 2024.01.24 |
[mongodb] 간단한 사용법,로그인, 컬랙션,디비관련 명령어 (0) | 2023.09.21 |