개발자공부일기
데이터베이스 정규화 본문
오늘은 데이터스키마를 작성하는 도중 팀원분이 들고오시기도 했고 예전에 정보처리기사 준비할때 배웠던 것들인데 오래돼서 기억도 잘 안나고 정확히 잘 모르는거 같아서 정규화라는 것에 대해서 조사하게 되었습니다.
정규화의 목적
- 중복 제거: 동일한 데이터가 여러 테이블에 반복되지 않도록 설계.
- 데이터 무결성: 데이터가 정확하고 일관되게 유지되도록 설계.
- 이상 현상 방지:
- 삽입 이상: 데이터를 추가할 때 불필요하거나 누락된 정보를 요구하지 않도록 설계.
- 삭제 이상: 데이터를 삭제할 때 다른 관련 데이터가 함께 사라지지 않도록 설계.
- 갱신 이상: 데이터를 수정할 때 여러 곳에서 수정하지 않도록 설계.
데이터베이스 정규화의 단계(1NF ~ 6NF)
정규화는 데이터 중복을 최소화하고, 데이터 무결성을 유지하며, 효율적인 데이터베이스 구조를 설계하기 위한 프로세스입니다. 각 단계는 이전 단계에서 남아 있는 문제를 해결하며 점차 더 세분화된 구조로 발전합니다.
1NF (First Normal Form)
조건:
- 모든 속성의 값은 원자값(Atomic Value)을 가져야 합니다.
- 즉, 각 셀에는 하나의 값만 있어야 합니다.
- 중복된 속성(반복 그룹)이 없어야 합니다.
문제 해결:
데이터 중복을 줄이고 각 속성에 하나의 값만 있도록 테이블을 정리합니다.
예시:
비정규형 테이블
학생 | 취미 |
A | 독서, 음악 |
B | 운동, 영화, 여행 |
→ 1NF로 변환
학생 | 취미 |
A | 독서 |
A | 음악 |
B | 운동 |
B | 영화 |
B | 여행 |
2NF (Second Normal Form)
조건:
- 1NF를 만족해야 합니다.
- 부분 함수 종속(Partial Dependency)이 없어야 합니다.
- 즉, 기본키의 일부가 종속성을 가지는 경우를 제거해야 합니다.
문제 해결:
조합키를 사용하는 경우, 종속성을 분리해 더 작은 테이블로 나눕니다.
예시:
1NF 테이블
학생 | 강의 | 교수 |
A | DB | 홍길동 |
A | OS | 이영희 |
B | DB | 홍길동 |
여기서 강의는 교수에 종속되므로 부분 함수 종속 발생.
→ 2NF로 변환
학생-강의 테이블
학생 | 강의 |
A | DB |
A | OS |
B | DB |
강의-교수 테이블
강의 | 교수 |
DB | 홍길동 |
OS | 이영희 |
3NF (Third Normal Form)
조건:
- 2NF를 만족해야 합니다.
- 이행적 종속(Transitive Dependency)이 없어야 합니다.
- 즉, 기본키가 아닌 속성이 다른 비키 속성을 통해 종속되는 경우를 제거합니다.
문제 해결:
기본키와 직접 관련되지 않은 속성을 분리합니다.
예시:
2NF 테이블
학생 | 학번 | 학과 |
A | 101 | 컴퓨터공학 |
B | 102 | 전자공학 |
여기서 학번은 학과를 결정하므로 이행적 종속 발생.
→ 3NF로 변환
학생-학번 테이블
학생 | 학번 |
A | 101 |
B | 102 |
학번-학과 테이블
학번 | 학과 |
101 | 컴퓨터공학 |
102 | 전자공학 |
BCNF/3.5NF(비공식명칭) (Boyce-Codd Normal Form)
조건:
- 3NF를 만족해야 합니다.
- 모든 결정자(Determinant)가 후보키(Candidate Key)여야 합니다.
문제 해결:
3NF에서 남아 있는 비정상적인 결정자 관계를 제거합니다.
예시:
3NF 테이블
강의 | 교수 | 시간 |
DB | 홍길동 | 9:00 |
OS | 이영희 | 10:00 |
DB | 홍길동 | 11:00 |
여기서 교수가 시간을 결정하므로 결정자가 후보키가 아님.
→ BCNF로 변환
강의-교수 테이블
강의 | 교수 |
DB | 홍길동 |
OS | 이영희 |
교수-시간 테이블
교수 | 시간 |
홍길동 | 9:00 |
홍길동 | 11:00 |
이영희 | 10:00 |
4NF (Fourth Normal Form)
조건:
- BCNF를 만족해야 합니다.
- 다치 종속(Multi-Valued Dependency)이 없어야 합니다.
- 한 속성이 두 개 이상의 독립적인 속성에 종속될 때 이를 제거합니다.
예시:
학생 | 언어 | 동아리 |
A | 영어 | 축구 |
A | 일본어 | 축구 |
A | 영어 | 독서 |
A | 일본어 | 독서 |
여기서 학생은 언어와 동아리에 다치 종속.
→ 4NF로 변환
학생-언어 테이블
학생 | 언어 |
A | 영어 |
A | 일본어 |
학생-동아리 테이블
학생 | 동아리 |
A | 축구 |
A | 독서 |
5NF (Fifth Normal Form)
조건:
- 4NF를 만족해야 합니다.
- 조인 종속(Join Dependency)이 없어야 합니다.
- 데이터가 과도하게 나뉘어 조인 결과가 손실되는 경우를 방지합니다.
예시:
학생 | 강의 | 교수 |
A | DB | 홍길동 |
A | OS | 이영희 |
B | DB | 홍길동 |
→ 5NF로 변환
학생-강의 테이블
학생 | 강의 |
A | DB |
A | OS |
B | DB |
강의-교수 테이블
강의 | 교수 |
DB | 홍길동 |
OS | 이영희 |
학생-교수 테이블
학생 | 교수 |
A | 홍길동 |
A | 이영희 |
B | 홍길동 |
6NF (Sixth Normal Form)
조건:
- 5NF를 만족해야 합니다.
- 모든 속성이 서로 독립적이어야 합니다.
6NF는 주로 분산 데이터베이스와 데이터 웨어하우스에서 활용되며, 분해의 최종 단계로 모든 속성이 최대한 독립적으로 유지되도록 설계합니다.
정규화 요약
단계 | 목적 | 해결하는 문제 |
1NF | 데이터 원자화 | 중복 데이터, 반복 그룹 제거 |
2NF | 부분 함수 종속 제거 | 조합키의 일부 속성 종속성 제거 |
3NF | 이행적 종속 제거 | 비키 속성 간 종속성 제거 |
BCNF | 비후보키 결정자 제거 | 비정상적인 결정자 관계 제거 |
4NF | 다치 종속 제거 | 중복 데이터 감소 |
5NF | 조인 종속 제거 | 데이터 손실 방지 |
6NF | 속성 독립성 보장 | 고도로 세분화된 설계 |
정규화를 통해 데이터 무결성과 효율성을 높이되, 실무에서는 성능 저하를 방지하기 위해 적절히 조정하며 사용합니다.
'TIL(Today I Learned)' 카테고리의 다른 글
공통 테이블 표현식(CTE, Common Table Expression) (0) | 2024.12.05 |
---|---|
자바스크립트에서 데이터 N중참조 (0) | 2024.12.04 |
RESTful API (0) | 2024.12.02 |
DOM의 개념과 메서드들 (0) | 2024.11.29 |
아이탬시뮬레이터 트러블 슈팅 (0) | 2024.11.28 |