Boyce–Codd 정규형(BCNF)이란?
BCNF(Boyce–Codd Normal Form)는 제3정규형(3NF)을 확장한 개념으로, 3NF보다 조금 더 엄격한 조건을 요구하는 정규형입니다.
릴레이션 R이 BCNF를 만족하려면, 모든 함수 종속성 P → Q에 대해 결정자 P가 반드시 R의 슈퍼키(superkey)여야 하며, 그렇지 않은 경우에는 해당 종속성이 자명한(trivial) 종속성이어야 합니다.
릴레이션이 BCNF를 만족하면 함수 종속성에 기반한 데이터 중복은 제거됩니다. 다만, 모든 종류의 중복이 사라지는 것은 아니며 일부 중복은 여전히 남아 있을 수 있다는 점에 유의해야 합니다.
BCNF 위반 예제 살펴보기
다음은 스포츠 클럽의 대여 정보를 담은 <SportsClub> 릴레이션입니다.
| 그라운드(Ground) | 시작 시간(Begin_Time) | 종료 시간(End_Time) | 패키지(Package) |
| G01 | 07:00 | 09:00 | Gold |
| G01 | 10:00 | 12:00 | Gold |
| G01 | 10:30 | 11:00 | Bronze |
| G02 | 10:15 | 11:15 | Silver |
| G02 | 08:00 | 09:00 | Silver |
위 릴레이션은 1NF, 2NF, 3NF까지는 모두 만족하지만, BCNF는 만족하지 않습니다. 그 이유는 다음과 같습니다.
이 릴레이션에는 {Package → Ground}라는 함수 종속성이 존재합니다. 그런데 이 종속성의 결정자(determinant)인 Package 속성은 후보 키(Candidate Key)도 아니고, 후보 키의 상위 집합(superset)도 아니기 때문에 BCNF 조건을 위반하게 됩니다.
BCNF를 만족하도록 릴레이션 분해하기
BCNF 조건을 충족시키기 위해 위 릴레이션을 두 개의 테이블로 분해할 수 있습니다.
<Package>
| 패키지(Package) | 그라운드(Ground) |
| Gold | G01 |
| Silver | G02 |
| Bronze | G01 |
<TomorrowBookings>
| 그라운드(Ground) | 시작 시간(Begin_Time) | 종료 시간(End_Time) |
| G01 | 07:00 | 09:00 |
| G01 | 10:00 | 12:00 |
| G01 | 10:30 | 11:00 |
| G02 | 10:15 | 11:15 |
| G02 | 08:00 | 09:00 |
이제 위 두 테이블은 BCNF를 만족합니다.
- <Package> 테이블의 후보 키: Package, Ground
- <TomorrowBookings> 테이블의 후보 키: {Ground, Begin_Time}, {Ground, End_Time}
<Package> 릴레이션에서 Package를 키로 사용함으로써, 분해 전에 발생하던 삽입·삭제·갱신 이상(anomaly) 현상이 제거되었습니다. 이처럼 BCNF는 함수 종속성 관점에서 데이터의 일관성과 무결성을 더욱 강력하게 보장하는 정규형이라 할 수 있습니다.