[DB] 정규화

무1민·2023년 11월 19일
0

데이터베이스

목록 보기
10/11
post-thumbnail

지난 시간에 정규화를 지키지 않았을 때 발생되는 이상 현상에 대해서 알아보았다. 이번 시간에 정규화의 형태에 대해서 알아보는 시간을 가져보도록 하겠다.

🎶정규형

정규화가 진행된 정도를 정규형으로 표현하는데, 정규형에는 1NF, 2NF, 3NF, BCNF, 4NF, 5NF까지 있다.

👀정규화 단계

🤦‍♂️정규화 정도?

BCNF 이후의 높은 정규형들은 실제 데이터베이스 설계에서 제공하는 이점에 비해 그 복잡성과 구현에 있어 오버헤드가 상대적으로 크다. 따라서, 유지 보수와 이해도가 떨어질 수 있다.
또한, BCNF까지의 정규화는 대부분의 실제 어플리케이션에서 발생할 수 있는 데이터 중복과 이상 현상을 충분히 다룬다.
과도한 정규화는 쿼리 성능에 부정적인 영향을 미칠 수 있다. 데이터가 너무 많이 분리되면, 복잡한 조인 연산이 필요해지고, 쿼리의 성능을 저하시킬 수 있다.

이러한 이유로, 해당 포스트에서도 BCNF까지의 정규형을 다루기로 하겠다.

제 1정규화 (1NF)

테이블 내의 속성값은 원자값을 가지고 있어야 한다.


위 테이블에서 추신수박세리는 여러 개의 취미를 가지고 있어 제 1 정규화를 만족하지 못한다.
제 1 정규화를 적용시킨 테이블은 다음과 같다.

제 2정규화 (2NF)

부분 함수 종속을 제거한다. (완전 함수 종속 관계)

여기서 완전 함수 종속이란 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 말한다.
다시 말해, 어떤 테이블의 기본키가 두 개 이상의 컬럼으로 구성된 복합키일 때 기본키를 분해한 부분집합으로 인해 다른 컬럼의 값이 결정되어서는 안된다.

위 테이블에서 기본키는 {학생번호, 강좌이름}의 복합키로 지정되어 있다. 그리고 {학생번호, 강좌이름}의 기본키는 성적을 결정하고 있다. 그런데 여기서 강의실이라는 컬럼은 기본키의 부분집합인 {강좌이름}에 의해 결정될 수 있다.
=> 기존의 테이블에서 강의실을 분해해 별도의 테이블을 관리해 제 2 정규화를 만족시킬 수 있다.

제 3정규화 (3NF)

이행 함수 종속을 제거한다.

이행적 종속이란, A->B, B->C가 성립할 때 A->C가 성립하는 것을 의미한다.

위 테이블에서 ID는 등급을 결정하고 있고, 등급은 할인률을 결정한다. 결국, ID에에서 할인률을 결정하기 때문에, 이행 함수 종속이 존재한다.

이행 함수 종속을 제거하는 이유는 ID 101인 등급 Vip를 Stone으로 변경하게 될 경우, 할인률 데이터도 변경해야 한다. 물론, 변경할 수도 잇겠지만, 한 컬럼의 데이터를 수정함으로 인해, 다른 컬럼까지 같이 수정하게 되는 번거로움을 해결하기 위해 제 3 정규화를 진행하는 것이다.


위와 같이 분리하면 제 3정규화가 해결된다.

BCNF 정규화

결정자가 후보키가 아닌 함수 종속을 제거한다.
결정자란, A->B를 만족하는 A를 의미한다.
업로드중..
위 테이블에서 기본키는 {학생번호, 특강이름} 이다. 그리고 기본키는 교수를 결정하고 있고, 교수는 특강 이름을 결정한다.
교수가 특강이름을 결정하는 결정자이지만 후보키는 아니라는 점이다. BCNF 정규형을 만족시키기 위해서 위의 테이블을 분리해야 한다.
업로드중..

🙌출처

https://velog.io/@wisdom-one/%EC%A0%95%EA%B7%9C%ED%99%94Normalization
https://ggop-n.tistory.com/77

profile
야호

0개의 댓글