DataBase 정규화 과정

정규화란?

  • 테이블 간에 중복된 데이터를 허용하지 않는다는 기본 목표를 갖는다.
  • 중복된 데이터를 허용하지 않음으로 써 무결성 을 유지할 수 있다.

장점

  • DB의 저장 용량 또한 줄일 수 있다.
  • 데이터 테이블을 분해하여 이상현상이 발생할 가능성을 줄이고, 확장/수정시 구조 변경을 최소화 할 수 있다.

단점

  • 릴레이션의 분해로 인해 Join연산이 늘어날 수 있다.

  • 쿼리시 응답시간이 느려질 수 있다.

    데이터의 중복속성을 최대한 제거하는 것 이기때문에, 속성이 하나의 테이블에 집약되므로 데이터 용량이 최소화 되어 상황에따라 처리속도가 빨라질 수도 있고, 느려질 수도 있다. 만약 조인이 만연하여 속도저하가 발생하게 된다면 반정규화를 통해 속도를 개선할 수 있다.

제 1 정규화

  • 테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것이다.
  • 각 컬럼의 순서가 상관이 없어야한다.
  • 하나의 컬럼은 같은 종류의 타입을 가져야 한다. Pasted image 20240531103441.png 원자값을 갖도록 컬럼을 나눈다. Pasted image 20240531103549.png

제 2 정규화

  • 제 1 정규화를 진행한 테이블에 대해 "완전 함수 종속"을 만족하도록 테이블을 분해하는 것이다.
  • 여기서 완전 함수 종속이란, 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다. 즉, 부분적 종속을 없애는 것이다.

Pasted image 20240531105228.png 해당 테이블의 기본키는 (학생번호, 강좌이름)으로 복합키 이다. 성적은 (학생번호, 강좌이름)인 기본키가 결정하지만, 강의실은 기본키의 부분집합인 강좌이름이 결정하게 된다.

즉, 부분집합이 결정자가 되지 않도록 테이블을 분리시키는 것으로 완전 함수 종속을 만족시킬 수 있다. Pasted image 20240531105241.png

제3 정규화

  • 제2 정규화를 진행한 테이블에 대해 "이행적 종속"을 없애도록 테이블을 분해하는 것이다.
  • 여기서 이행적 종속이란 A -> B , B -> C 가 성립할때, A -> C 가 성립되는 것을 의미한다. Pasted image 20240531104351.png 다음의 경유 이행적 종속상태 로 말할 수 있다.

그 경우 테이블을 분리하여 데이터 변경시에 다른 데이터까지 변경되는 상황을 막을 수 있다. Pasted image 20240531104418.png

BCNF 정규화

  • 제3 정규화를 좀 더 강화한 것이라 생각하면 된다.
  • BCNF정규화란 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것을 말한다.

Pasted image 20240531104751.png 특수 수강 테이블에서 기본키는 (학생번호, 특강이름)이다. 그리고 기본키는 교수를 결정하고 있다. 또한, 여기서 교수는 특강이름을 결정하고있다.

문제는 교수가 특강이름을 결정하는 결정자 이지만, 후보키가 아니다. 그렇기 때문에 BCNF 정규화를 만족시키기 위해서는 테이블을 분해하여 아래와 같이 분리할 수 있다.

Pasted image 20240531104803.png

제4 정규화는 다치 종속을 없애는것이다

  • 컬럼값의 중복을 제거하는것이다.

제5 정규화는 조인 종속을 없애는것이다.

  • 중복을 제거하기 위해 분해할 수 있을만큼 최대한 분해하는 것이다.

보통 정규화는 BCNF정규화 까지만 진행하는 경우가 많다.

 그 이상 정규화를 진행하면 오히려 정규화의 단점이 더 커지기 때문이다.