데이터베이스 테이블 정규화는 효율적인 데이터베이스 설계와 관리를 위한 과정입니다.
정규화의 목표는 데이터 중복성을 줄이고, 데이터베이스의 무결성과 정확성을 향상시키는 것입니다.
이는 데이터 추가, 수정, 삭제를 진행할 때 발생할 수 있는 문제들을 예방하기 위함입니다.
정규화는 데이터의 중복을 줄이고 무결성을 유지시켜 줍니다.
정규화는 다양한 단계로 이루어져 있으며, 각 단계를 '정규형'이라고 합니다.
이 정규형에는 1NF(제 1 정규형), 2NF(제 2 정규형), 3NF(제 3 정규형) 등이 있습니다.
각 정규형은 이전 정규형의 요구 사항을 만족하면서 추가적인 요구 사항을 충족해야 합니다.
**1NF (제 1 정규형)**
1NF는 모든 레코드가 유일하게 식별되어야 하며, 각 열(속성)은 원자적(더 이상 분할할 수 없는) 값을 가져야 한다는 요구 사항이 있습니다.
예를 들어, 다음과 같은 테이블이 있다고 가정해봅시다:
학번 | 이름 | 과목 |
1 | 김이박 | 수학, 영어 |
2 | 박최이 | 과학, 영어 |
위의 테이블은 1NF를 만족하지 않습니다.
왜냐하면 '과목' 열에 여러 값을 가진 튜플이 있기 때문입니다. 이 테이블을 1NF를 만족하도록 변경하면 다음과 같습니다:
학번 | 이름 | 과목 |
1 | 김이박 | 수학 |
1 | 김이박 | 영어 |
2 | 박최이 | 과학 |
2 | 박최이 | 영어 |
**2NF (제 2 정규형)**
2NF는 1NF를 만족하면서, 모든 비키(non-key) 속성이 기본 키에 완전 함수적 종속성을 가져야 한다는 요구 사항이 있습니다. 즉, 부분적 종속성을 제거해야 합니다.
아래의 테이블을 보겠습니다:
| 학생ID | 과목 | 선생님 | 선생님 이메일 |
|-----|------|-----|-------|
| 1 | Math | Park | park@email.com |
| 1 | English | Lee | lee@email.com |
| 2 | Science | Kim | kim@email.com |
| 2 | English | Lee | lee@email.com |
학번 | 이름 | 과목 | 선생님 | 선생님 이메일 |
1 | 김이박 | 수학 | 김수학 | mathkim@email.com |
1 | 김이박 | 영어 | 이영어 | englee@email.com |
2 | 박최이 | 과학 | 최과학 | sci-choi@email.com |
2 | 박최이 | 영어 | 이영어 | englee@email.com |
여기서 기본 키는 '학생ID'와 '과목'의 조합입니다. 그런데 '선생님'과 '선생님 이메일'은 '과목'에 부분적으로 종속되어 있습니다. 이는 2NF를 위반하는 것으로, 이를 해결하기 위해서는 테이블을 분리해야 합니다:
*학생과 과목 테이블*
학번 | 이름 | 과목 |
1 | 김이박 | 수학 |
1 | 김이박 | 영어 |
2 | 박최이 | 과학 |
2 | 박최이 | 영어 |
*과목과 선생님 테이블*
과목 | 선생님 | 선생님 이메일 |
수학 | 김수학 | mathkim@email.com |
영어 | 이영어 | englee@email.com |
과학 | 최과학 | sci-choi@email.com |
영어 | 이영어 | englee@email.com |
**3NF (제 3 정규형)**
3NF는 2NF를 만족하면서, 비키 속성이 다른 비키 속성에 종속되지 않아야 한다는 요구 사항이 있습니다.
즉, 이행적 종속성을 제거해야 합니다.
아래의 테이블을 보겠습니다:
과목 | 선생님 | 선생님 이메일 |
수학 | 김수학 | mathkim@email.com |
영어 | 이영어 | englee@email.com |
과학 | 최과학 | sci-choi@email.com |
영어 | 이영어 | englee@email.com |
여기서 '선생님 이메일'이 '선생님'에 종속되어 있습니다. 이는 3NF를 위반하는 것으로, 이를 해결하기 위해서는 테이블을 분리해야 합니다:
*과목과 선생님 테이블*
과목 | 선생님 |
수학 | 김수학 |
영어 | 이영어 |
과학 | 최과학 |
영어 | 이영어 |
*선생님 이메일 테이블*
선생님 | 선생님 이메일 |
김수학 | mathkim@email.com |
이영어 | englee@email.com |
최과학 | sci-choi@email.com |
이영어 | englee@email.com |
위의 과정을 통해 정규화를 진행하면 데이터 중복을 줄이고 데이터 무결성을 향상시킬 수 있습니다.
'데이터베이스' 카테고리의 다른 글
MySQL `EXPLAIN`의 조인 타입(`type` 컬럼) 깊게 이해하기 (1) | 2023.09.12 |
---|---|
MySQL `EXPLAIN`의 이해와 활용 (0) | 2023.09.12 |
복합키란 무엇인가? (2) | 2023.09.06 |
ERD 설계의 중요성과 핵심 요소 (0) | 2023.09.05 |
Index(인덱스) (1) | 2023.07.24 |