데이터베이스 정규화는 데이터베이스의 설계를 재구성하는 테크닉이다.
정규화를 통해 불필요한 데이터(redundancy)를 없앨 수 있고, 삽입/갱신/삭제 시 발생할 수 있는 이상현상(Anamolies)들을 방지할 수 있다.
데이터베이스 정규화의 목적은 주로 두 가지이다.
1. 불필요한 데이터(data redundancy)를 제거한다.
2. 데이터 저장을 논리적으로 한다. (데이터 테이블 구성을 논리적, 직관적으로 하는 것)
1차 정규화는 테이블의 컬럼이 원자값(Atomic Value)를 갖도록 테이블을 분해하는 것이다.
1차 정규화를 만족하려면 도메인이 원자값이어야 한다.
위의 테이블에서 과학과 사회과목에 여러 명의 수강자가 있기 때문에 1차 정규화를 만족하지 못한다.
이를 1차 정규화하여 분해할 수 있다. 아래와 같이 분리할 수 있다.
2차 정규화는 1차 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
여기서 완전 함수 종속은 기본키의 부분집합이 결정자가 되면 안된다는 것을 의미한다.
2차 정규화를 만족하려면 부분적 함수 종속을 제거해야 한다.
위 테이블에서 학번과 이름, 소속, 학과장은 종속관계가 있다.
학과장은 소속학과 하나에도 종속이므로 부분적인 종속관계가 있다.
즉, 학과장은 꼭 위 테이블처럼 있어야할 필요도 없고 김교수님처럼 중복적재가 될 수 있다.
이와 같이 구분하는 것이 바람직하다.
3차 정규화는 2차 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다.
이행적 종속은 A->B, B->C가 성립할 때 A->C가 성립되는 것을 의미한다.
3차 정규화를 만족하려면 이행적 함수종속을 제거해야 한다.
소속학과는 특정 대학에 속한다. -> 대학은 소속학과에 종속된다.
홍길동 -> 컴퓨터과, 컴퓨터 -> 공대 일 때, 홍길동 -> 공대인 관계가 성립한다.
BCNF 정규화는 3차 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.
BCNF를 만족하려면 결정자이면서 후보키가 아닌 것을 제거해야 한다.
교수 또한 결정자인데 교수는 학번을 결정 지을 수는 없으므로 후보키는 아니다.
https://mangkyu.tistory.com/110
https://3months.tistory.com/193
https://pronician.tistory.com/922
https://itwiki.kr/w/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%A0%95%EA%B7%9C%ED%99%94