지난 시간에 정규화를 지키지 않았을 때 발생되는 이상 현상에 대해서 알아보았다. 이번 시간에 정규화의 형태에 대해서 알아보는 시간을 가져보도록 하겠다.
정규화가 진행된 정도를 정규형으로 표현하는데, 정규형에는 1NF, 2NF, 3NF, BCNF, 4NF, 5NF까지 있다.
BCNF 이후의 높은 정규형들은 실제 데이터베이스 설계에서 제공하는 이점에 비해 그 복잡성과 구현에 있어 오버헤드가 상대적으로 크다. 따라서, 유지 보수와 이해도가 떨어질 수 있다.
또한, BCNF까지의 정규화는 대부분의 실제 어플리케이션에서 발생할 수 있는 데이터 중복과 이상 현상을 충분히 다룬다.
과도한 정규화는 쿼리 성능에 부정적인 영향을 미칠 수 있다. 데이터가 너무 많이 분리되면, 복잡한 조인 연산이 필요해지고, 쿼리의 성능을 저하시킬 수 있다.
원자값
을 가지고 있어야 한다.
위 테이블에서 추신수
와 박세리
는 여러 개의 취미를 가지고 있어 제 1 정규화를 만족하지 못한다.
제 1 정규화를 적용시킨 테이블은 다음과 같다.
부분 함수 종속
을 제거한다. (완전 함수 종속 관계)여기서 완전 함수 종속이란 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 말한다.
다시 말해, 어떤 테이블의 기본키가 두 개 이상의 컬럼으로 구성된 복합키일 때 기본키를 분해한 부분집합으로 인해 다른 컬럼의 값이 결정되어서는 안된다.
위 테이블에서 기본키는 {학생번호, 강좌이름}의 복합키로 지정되어 있다. 그리고 {학생번호, 강좌이름}의 기본키는 성적을 결정하고 있다. 그런데 여기서 강의실이라는 컬럼은 기본키의 부분집합인 {강좌이름}에 의해 결정될 수 있다.
=> 기존의 테이블에서 강의실을 분해해 별도의 테이블을 관리해 제 2 정규화를 만족시킬 수 있다.
이행 함수 종속
을 제거한다.이행적 종속이란, A->B, B->C가 성립할 때 A->C가 성립하는 것을 의미한다.
위 테이블에서 ID는 등급을 결정하고 있고, 등급은 할인률을 결정한다. 결국, ID에에서 할인률을 결정하기 때문에, 이행 함수 종속이 존재한다.
이행 함수 종속을 제거하는 이유는 ID 101인 등급 Vip를 Stone으로 변경하게 될 경우, 할인률 데이터도 변경해야 한다. 물론, 변경할 수도 잇겠지만, 한 컬럼의 데이터를 수정함으로 인해, 다른 컬럼까지 같이 수정하게 되는 번거로움을 해결하기 위해 제 3 정규화를 진행하는 것이다.
위와 같이 분리하면 제 3정규화가 해결된다.
결정자가 후보키가 아닌 함수 종속
을 제거한다.
결정자란, A->B를 만족하는 A를 의미한다.
위 테이블에서 기본키는 {학생번호, 특강이름} 이다. 그리고 기본키는 교수를 결정하고 있고, 교수는 특강 이름을 결정한다.
교수가 특강이름을 결정하는 결정자이지만 후보키는 아니라는 점이다. BCNF 정규형을 만족시키기 위해서 위의 테이블을 분리해야 한다.
https://velog.io/@wisdom-one/%EC%A0%95%EA%B7%9C%ED%99%94Normalization
https://ggop-n.tistory.com/77