데이터베이스를 정규화해야 한다는 말은 익숙하지만, 데이터베이스를 설계하기 위해 정규화를 직접 할 일이 많지 않으므로 항상 까먹는 것 같다.
정규화에 대해 정리하는 시간을 가져본다.
정규화(Normalization)는 데이터베이스 설계 과정에서 데이터 중복을 최소화하고, 데이터를 더 효율적으로 저장하고 관리하기 위해 테이블을 구조화하는 방법이다. 이를 통해 데이터 무결성을 유지하며 쿼리 성능을 최적화할 수 있다.
데이터가 중복되면 쿼리의 효율성이 떨어지므로 테이블을 구조화 할 필요가 있다. 데이터가 잘못된 상태로 저장되지 않고, 데이터 간의 관계가 올바르게 유지되도록 데이터 무결성을 보장하는 것이 중요하다.
정규화 과정은 여러 단계로 나뉘며, 일반적으로 1차 정규형부터 5차 정규형까지 존재한다. 각각의 단계는 특정한 설계 문제를 해결하며, 주요 단계는 다음과 같다.
- 1차 정규형: 각 테이블의 모든 필드는 원자값으로 되어 있어야 한다. 즉, 중복된 컬럼이나 중첩된 데이터를 허용하지 않는다.
- 2차 정규형: 1차 정규형을 만족하면서, 기본 키에 대한 부분적 종속성을 제거해야 한다. 즉, 테이블 내 모든 속성은 기본 키 전체에 종속되어야 한다.
- 3차 정규형: 2차 정규형을 만족하면서, 기본 키 이외의 속성들 간의 이행적 종속성을 제거해야 한다. 즉, 키본 키와 직접적으로 관련되지 않은 속성 간의 종속성을 없애야 한다.
테이블을 효율적으로 구조화하는 원칙을 명시적으로 이해함으로써 어떻게 테이블이 구성되는지 떠올려 볼 수 있다.
실습을 통해 알아보자.
예를 들어, 학생의 수업 정보를 담고 있는 아래와 같은 테이블이 있다고 가정하자.
| 학생ID | 학생이름 | 수업ID | 수업명 | 교수명 |
|---|---|---|---|---|
| 1 | 홍길동 | CS101 | 데이터베이스 | 김교수 |
| 1 | 홍길동 | CS102 | 운영체제 | 박교수 |
| 2 | 이순신 | CS101 | 데이터베이스 | 김교수 |
| 2 | 이순신 | CS103 | 네트워크 | 이교수 |
1차 정규형은 각 테이블의 필드가 원자값을 가져야 한다는 조건이다.
위 테이블은 이미 원자값을 만족하고 있으므로, 별도의 변화가 필요하지 않다.
2차 정규형은 기본 키의 부분 집합이 아닌 모든 속성이 기본 키 전체에 종속되어야 한다. 기본 키가 여러 필드로 이루어진 경우, 특정 필드에만 종속된 속성이 있으면 안 된다는 의미이다.
현재 테이블에서 학생ID와 수업ID가 기본 키가 될 수 있다. 하지만, 학생 이름은 학생ID에만 종속되고, 교수명은 수업ID에만 종속된다. 따라서 이를 분리해야 한다.
학생 테이블
| 학생ID | 학생이름 |
|---|---|
| 1 | 홍길동 |
| 1 | 홍길동 |
| 2 | 이순신 |
| 2 | 이순신 |
수업 테이블
| 수업ID | 수업명 | 교수명 |
|---|---|---|
| CS101 | 데이터베이스 | 김교수 |
| CS102 | 운영체제 | 박교수 |
| CS101 | 데이터베이스 | 김교수 |
| CS103 | 네트워크 | 이교수 |
학생-수업 관계 테이블
| 학생ID | 학생 ID |
|---|---|
| 1 | CS101 |
| 1 | CS102 |
| 2 | CS101 |
| 2 | CS103 |
이렇게 분리하면 학생이름과 교수명이 각각의 기본 키에 종속되므로 부분적 종속성이 제거된다.
3차 정규형은 기본 키 이외의 속성 간의 종속성을 제거해야 한다. 즉, 기본 키와 직접적으로 관계되지 않은 속성들 간의 종속이 없어야 한다.
이전 수업 테이블을 보면, 수업명과 교수명은 학생ID에 종속되지 않으면서 수업명->교수명인 이행적 종속성이 발생한다. 따라서 3차 정규형을 위반한다.
하지만 현재 수업테이블을 보면 교수명이 수업 ID에 종속되어 있다. 이는 수업에 따라 교수가 정해지기 때문에 자연스러운 종속성이다. 따라서 이 상태는 3차 정규형을 만족한다.
이렇게 정규화를 통해 데이터 중복 없이 관리할 수 있으며, 데이터 수정 시 한 테이블만 변경하면 되어 데이터의 일관성과 무결성을 유지할 수 있게 된다.
"본 포스팅은 OpenAI의 Chatgpt를 참고하여 작성되었습니다."