:테이블 간에 중복된 데이터를 허용하지 않음으로써 무결성(integrity)을 유지할 수 있게 하는 것
ex)
학생테이블 학과테이블
-------- --------
학번 + 학과코드
이름 학과명
학과코드
전화번호
주소
학과 테이블과 학생 테이블을 하나로 합친 테이블에서 새로운 학생이 한명 추가될 때 필요한 학과코드가 없다면 임의의 값을 넣어줘야 한다 즉 불필요한 정보가 함께 추가되는 것이다
반대로 컴퓨터공학과 라는 학과를 추가할 떄는 학생이 없기 때문에 임의의 값으로 학생의 정보들을 입력해야한다 이러한 문제를 이상현상이라고 한다
즉 어떠한 데이터를 삽입 할 때 임의로 값을 넣어야하는 정보가 있다면 테이블을 나누어 관리하고 필요한 경우 join하여 사용할 수 있다
제1 정규형을 만족해야 한다
모든 컬럼이 부분적 종속이 없어야한다(모든 컬럼이 완전 함수 종속을 만족해야 함)
*부분적 종속이란 기본키 중에 특정 컬럼에만 종속되는 것
*완전 함수 종속이란 키본키의 부분집합이 결정자가 되어선 안된다는 것
*기본키는 학생번호와 과목으로 복합키
성적의 특정 값을 알기 위해서는 학생번호와 과목이 있어야한다
지도교수는 과목명만 알면 누군지 알 수 있다
지도교수 컬럼은 학생 번호, 과목에 종속되지 않고 과목에만 종속되는 부분적 종속이다
제2 정규형을 만족해야한다
기본키를 제외한 속성들 간의 이행 종속성이 없어야 한다
ID를 알면 등급을 알 수 있다
등급을 알면 할인율을 알 수 있다
ID를 알면 할인율을 알수 있는 경우 이행 종속성 존재
학생번호, 과목이 키본키로 지도교수를 알 수 있다
같은 과목을 다른 교수가 가르칠 수도 있어서 과목->지도교수 종속이 성립되지 않는다
지도교수가 어떤 과목을 가르치는지 알 수 있으므로 지도교수->과목 종속이 성립한다
BCNF를 만족하지 위해 아래처럼 분해
참고
https://coding-factory.tistory.com/872
https://code-lab1.tistory.com/47
https://code-lab1.tistory.com/48
https://inpa.tistory.com/entry/DB-%F0%9F%93%9A-%ED%82%A4KEY-%EC%A2%85%EB%A5%98-%F0%9F%95%B5%EF%B8%8F-%EC%A0%95%EB%A6%AC