3NF(제3정규형)란 무엇인가?
데이터베이스 정규화(Normalization)의 세 번째 단계가 바로 3NF(Third Normal Form, 제3정규형)입니다.
하나의 테이블이 3NF를 만족하려면 다음 두 가지 조건을 충족해야 합니다.
- 해당 관계(relation)가 이미 2NF(제2정규형)를 만족해야 합니다.
- 이행적 함수 종속(Transitive Functional Dependency)이 존재하지 않아야 합니다.
그럼 구체적인 예제를 통해 살펴보겠습니다.
예제 1: 3NF를 위반하는 테이블
<MovieListing>
| Movie_ID | Listing_ID | Listing_Type | DVD_Price ($) |
| 0089 | 007 | Comedy | 100 |
| 0090 | 003 | Action | 150 |
| 0091 | 007 | Comedy | 100 |
위 테이블은 이행적 함수 종속이 존재하기 때문에 3NF를 만족하지 않습니다.
| Movie_ID -> Listing_ID Listing_ID -> Listing_Type |
즉, Listing_ID가 Movie_ID에 종속되고, Listing_Type이 다시 Listing_ID에 종속되는 구조입니다. 따라서 간접적으로 Movie_ID -> Listing_Type이라는 이행적 함수 종속이 성립하게 됩니다. 이러한 종속 관계는 데이터 중복과 이상(anomaly) 현상을 유발할 수 있으므로 제거해야 합니다.
예제 2: 3NF로 변환된 테이블
테이블을 3NF 형태로 만들려면, 테이블을 분할하여 이행적 함수 종속을 제거해야 합니다. 위의 MovieListing 테이블을 아래와 같이 두 개의 테이블로 나눌 수 있습니다.
<Movie>
| Movie_ID | Listing_ID | DVD_Price ($) |
| 0089 | 007 | 100 |
| 0090 | 003 | 150 |
| 0091 | 007 | 100 |
<Listing>
| Listing_ID | Listing_Type |
| 007 | Comedy |
| 003 | Action |
| 007 | Comedy |
이렇게 테이블을 분할하면 Listing_ID에서 Listing_Type으로의 종속 관계가 별도의 테이블로 분리되어, 더 이상 이행적 함수 종속이 발생하지 않습니다. 그 결과 두 테이블 모두 3NF를 만족하는 정규화된 테이블이 됩니다.
정리하면, 3NF는 기본키가 아닌 속성 간의 종속 관계를 제거함으로써 데이터 중복을 최소화하고 데이터 무결성을 높이는 중요한 정규화 단계입니다.