관계형 데이터베이스의 설계에서 데이터의 중복을 줄이고 데이터 무결성을 개선하기 위해 데이터를 정규형에 맞도록 구조화하는 프로세스다.
데이터 베이스에서 불필요한 데이터를 삭제하고 갱신/삽입/삭제시에 발생할 수 있는 각종 이상 현상들을 방지하기 위함이다.
각 row 마다 컬럼의 값이 하나만 있어야 한다.
before
after
이렇게 Subject의 1행에 값이 2개가 있어선 안된다!
기본키 중에 특정 컬럼에만 종속된 컬럼(부분적 종속)이 없어야한다.
1NF의 테이블에서 보면 Student와 Subject가 기본키가 되지만 이중에서 하나의 값만 알더라도 Age의 값을 알 수 있게 된다.
그렇기에 이를 분리 한다.
기본키를 제외한 속성들 간의 이행적 함수 종속(다른 값에 종속되어 있는 것)이 없게 만드는 것이다.
이렇게 Account_No로 Bank를 조회할 수 있는 문장에서 분리함으로써 이행적 함수 종속을 없애는 것이다.
BCNF는 3NF가 끝난 후 이행적 함수 종속이 없어진 테이블에서 모든 결정자가 후보키 집합에 속하게 만드는 것이다.
이 테이블에서 교수를 안다면 해당하는 과목을 알 수 있게 된다.
이것은 교수가 정해지게된다면 후보키인 과목 역시 결정된다는 것이다.
그렇기에 이를 해제해주어야만 한다.
여기서 중요한 점은 결정권자와 후보키를 묶어서 하나의 테이블을 구성해야 한다는 점!