Boyce-Codd Normal Form과 Thrid Normal Form을 함수 종속성 개념과 자세히 알아보자.
BCNF를 만족하기 위해 다음과 같은 조건을 만족해야한다.
테스트하는 relation의 에 있는 모든 에 대해 다음과 같은 조건 중 최소한 하나를 만족해야한다.
- 가 trivial 하다.
- a는 R의 superkey이다.
big_instructor (ID, name, salary, dept_name, building, budget )
이전의 보았던 relation이다. 이는 그럼 BCNF에 맞지 않다는 것이다.
dept_name이 building과 budget을 결정하지만 trivial 하거나, superkey가 아니기 때문이다.
위의 big_instructor을 BCNF로 변경하기 위해 분해하기 위한 방법은 다음과 같다.
relation R을 다음과 같이 분해하여 두 개의 relation을 만든다.
- : 와의 합집합을 하나의 relation으로 만든다.
- : R + a(에 가 중복되면 제외한다.)
= dept_name
= building, budget
and big_instructor is replaced by
( U ) = ( dept_name, building, budget )
( R - ( - ) ) = ( ID, name, salary, dept_name )
이 때 새로 만들어진 두 개의 table은 모두 BCNF를 만족한다.
분해 이후 두 개의 relation에 대해 기존의 모든 함수 종속성과 다른 제약을 체크하는 것은 어렵다.
이는 join으로 해결해야한다.
분해 이후에 분해 이전 함수종속성을 모두 만족한다면 dependency preserving한다 칭한다.
그러나 BCNF와 dependency preserving 모두 충족하기 쉽지 않다. 이러한 이유로 좀 더 relaxed 버전인 Thrid normal form을 사용한다.
Third normal form을 만족하기 위한 조건은 다음과 같다.
모든 in 에 대해 밑의 조건 중 하나를 만족하면 3NF를 만족한다.
- 은 trivial
- 는 R의 수퍼키이다.
- 가 super key에 포함되어 있다.
마지막 조건이 추가되므로 좀 더 완화된 모습을 볼 수 있다. a에 superkey가 존재하지 않아도 3NF를 만족할 수 있다는 것이다.
이는 좀 더 중복을 수용하여 dependency preservation을 만족하기 위함이다.
BCNF가 만족되지 않는 가 존재할 때, 이를 분해하여 BCNF로 만들어 볼 수 있다.
이 때 functional dependency을 만족하지 않는 의 subset이 존재한다면, 중복성은 최소화 했지만 dependency를 잃어버린 것이다.(lossless decomposition이 이루어지지 않을 수 있다.)
이때 relax하게 중복을 허용하고 분해하지 않은채로 3NF 형태의 relation을 사용 할 수 있다.
그럼 BCNF와 3NF를 사용하는 것은 상황에 따라 dependency preserving에 따라 3NF를 사용할지 BCNF를 사용할지 결정해야한다.
이 두 form에 만족하면서, lossless-join 분해가 가능한거까진 필수이나, dependency preserving은 상황에 맞게 선택하면 된다.(3NF or BCNF)