정규화
정규화
: 이상 현상
을 제거하기 위한 테이블을 분리하는 행위
이상 현상
- 삽입 이상 : 불필요한 데이터를 추가해야지만 추가할 수 있는 상황
- 갱신 이상 : 일부만 변경되어 데이터의 불일치가 발생하는 상황
- 삭제 이상 : 튜플 삭제로 인해 꼭 필요한 데이터까지 삭제되는 상황
이런 이상 현상을 제거하기 위해 정규화를 사용한다. 테이블을 분리하는 것으로 해결할 수 있다.
제1정규화
- 모든 속성의 값을 원자값(Atomic)으로 만든다!
제2정규화
- 기본키가 복합키로 이루어진 경우, 키를 제외한 나머지 속성들은 완전 함수 종속을 유지해야한다!
- 예를 들어 기본 키가 A,B로 이루어져있다고 해보자. 만약 C라는 속성이 A만 사용해서 구별할 수 있는 상황이라면, C를 알아내는데 B는 필요가 없다. 그럼에도 B와 C가 같이 있어 불필요한 중복이 발생한다. => 기존 테이블에서 A,C를 따로 빼와 새로운 테이블로 만드는 것이 불필요한 중복을 제거하는 방법이다!
제3정규화
- 이행적 함수 종속 제거!
- 만약 A,B,C,D의 속성을 가진 테이블이 있고, A가 기본키라고 가정해보자. 그런데 B만 알아도 C와 D가 결정된다고 해보자. 이럴 경우 테이블을 A,B 테이블과 B,C,D 테이블로 분리!
- 이렇게 분리하면, C나 D를 업데이트할 때, 이상 현상을 막을 수가 있다!
BCNF
- 모든 결정자가 후보키에 속하도록 하자!
- 후보키에 속하지 않은 속성이 어떤 속성을 결정할 수 있다면, 이상 현상 발생 가능!
대체적으로 3정규화와 BCNF까지 정규화한다고 한다. 정규화하면 이상 현상을 막을 수는 있지만, 결국 테이블을 분리하는 것이기 때문에 나중에 사용할 때 join같은 추가적인 연산이 발생해 실행 시간이 늘어날 수 있다.