정규화

Jin Hur·2022년 5월 24일
0

데이터베이스

목록 보기
9/12
post-custom-banner

reference: "데이터베이스 개론" / 김연희 / 한빛아카데미

정규화(normalization)

관계 데이터 모델에 기반을 두고 DB를 설계하는 방법 중 크게 "E-R 모델과 릴레이션 변환 규칙을 이용하는 방법"과 "정규화를 이용하는 방법"이 있다. 이 두 설계 방법은 DB 설계결과물이 비슷한 수준을 유지하므로 상황에 따라 적절한 방법을 선택하면 된다.
정규화는 DB를 설계한 후 설계 결과물을 검증하기 위해 사용하기도 한다.

정규화의 기본 목표는 관련이 없는 함수 종속성은 별개의 릴레이션으로 표현하는 것이다.

정규화 단계

릴레이션 정규화 정도는 '정규형'으로 표현되고, 정규형의 차수가 높아질수록 요구되는 제약조건이 많아지고 엄격해진다. 일반적으로 차수가 높은 정규형에 속하는 릴레이션일수록 데이터 중복이 줄어 데이터 중복에 의한 이상 현상이 발생하지 않는 바람직한 릴레이션일 수 있다.

source: https://m.blog.naver.com/gkenq/220739794662

모든 릴레이션이 제 5 정규형에 속해야 되는 것은 아니다. 릴레이션 특성을 고려하여 적합한 정규형을 선택하면 된다. 일반적으로 제 1/2/3//BCNF형 정규형(기본 정규형)에 속하도록 정규화하는 경우가 대부분이므로 기본 정규형의 제약조건을 정확히 파악해둘 필요가 있다.



제 1 정규형

릴레이션에 속한 모든 속성의 도메인이 원자 값(atomic value)으로만 구성되어 있으면 제 1 정규형에 속한다.

source: https://overcome-the-limits.tistory.com/513

위 그림에서 확인할 수 있듯이 제 1정규형을 만족하지 않은 비정규형 릴레이션에서 이벤트 번호 속성과 당첨여부 속성은 하나의 고객 아이디에 해당하는 값이 여러 개이다. 즉 한 명의 고객이 여러 이벤트에 참여할 수 있어 이벤트 번호와 당첨 여부가 다중값 속성으로 표현된 것이다. 다중값을 가지는 속성을 포함하고 있는 이벤트 참여 릴레이션은 제 1정규형의 제약조건을 만족하지 못하므로 제 1정규형에 속하지 않는다.

이 릴레이션을 제 1정규형을 만족하도록 정규화를 수행한 결과는 위의 그림 중 두번째 그림과 같다. 관계 DB의 릴레이션은 모든 속성이 원자 값을 가지는 특성이 있다. 그러므로 이와 같이 최소한 제 1정규형을 만족해야 관계 DB의 릴레이션이 될 자격이 있다고 할 수 있다.

제 1정규형에서 발생할 수 있는 이상 현상, by 부분 함수 종속 포함

제 1정규형에는 속하지만, 불필요한 데이터 중복으로 인해 이상 현상이 발생하는 릴레이션이 있을 수 있다. 이전 포스팅에서 이상 현상을 설명하며 예를 든 릴레이션이 제 1정규형에 속하므로 아래 링크에서 확인할 수 있다.

https://velog.io/@jinh2352/%EC%9D%B4%EC%83%81-%ED%98%84%EC%83%81%EA%B3%BC-%ED%95%A8%EC%88%98-%EC%A2%85%EC%86%8D

이벤트 참여 릴레이션에 다양한 이상 현상(삽입/갱신/삭제)이 발생하는 이유는 이 릴레이션이 부분 함수 종속을 포함하고 있기 때문이다. 기본키인 (고객 아이디, 이벤트 번호)에 완전 함수 종속되지 못하고 일부분인 고객 아이디에 종속되는 '등급'과 '할인율' 속성 때문이다. 이렇게 기본키에 완전 함수 종속되지 못한 등급과 할인율 속성 값은 릴레이션에 여러 번 중복되어 나타날 수 있고, 나아가 관련이 없는 이벤트 번호, 당첨여부 속성이 하나의 릴레이션에 존재하기에 여러 이상 현상이 발생하고 있는 것이다.

이러한 문제를 해결하기 위해 부분 함수 종속이 제거되도록 릴레이션을 분해해야 하고, 이렇게 분해된 릴레이션들은 제 2정규형에 속하게 된다.


제 2 정규형

릴레이션이 제 1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 '완전 함수 종속'되면 제 2 정규형에 속한다.

source: https://overcome-the-limits.tistory.com/513

제 1정규형에 속한 이벤트 참여 릴레이션은 기본키인 (고객 아이디, 이벤트 번호)에 완전 함수 종속되지 않는 등급, 할인율 속성이 존재한다. 등급, 할인율에 관련이 없는 이벤트 번호, 당첨여부 속성이 같은 릴레이션에 존재하지 않도록 두 개의 릴레이션으로 분해하면, 부분 함수 종속 관계가 사라지고, 분해된 '고객 릴레이션', '이벤트 참여 릴레이션'은 모두 제 2정규형에 속하게 된다.

부분 함수 종속성 제거: 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되게 하는 것.

정규화 과정에서 릴레이션 분해에 있어 주의할 점
정규화 과정에서 릴레이션을 분해할 때 주의할 점은, 분해된 릴레이션들을 '자연 조인'하여 분해 전의 릴레이션으로 다시 복원할 수 있어야 한다.
자연 조인을 하면 원래의 릴레이션으로 다시 복원할 수 있도록, 정보의 손실 없이 릴레이션을 분해하는 것을 '무손실 분해'라고 한다.

제 2정규형에서 발생할 수 있는 이상 현상, by 여러 함수적 종속 관계 포함(이행적 함수 종속)

제 2정규형에 속하더라도 릴레이션에 이상 현상이 발생할 수 있다. 제 1정규형에서 발생할 수 있는 이상 현상은 발생하지 않지만 고객 릴레이션은 부분 함수 종속 대신 함수 종속성을 아직도 여러 개 포함하고 있고, 논리적으로 이행적 함수 종속 관계가 유도되면 이상 현상이 발생할 수 있다.

분해된 릴레이션이서도 여러 이상 현상이 발생하는 이유는, 함수적 종속 관계를 여러 포함하고 있어 결과적으로 '이행적 함수 종속'이 존재하기 때문이다. 릴레이션을 분해하여 이행적 함수 종속을 제거하면, 분해된 릴레이션들은 제 3정규형에 속하게 되고 앞서 제시한 이상 현상들이 더는 발생하지 않게 된다.

이행적 함수 종속

그림에서 확인할 수 있듯이 할인율 속성은 기본키인 고객아이디에 함수적으로 종속됨과 동시에 등급을 통해서 고객아이디에 이행적 함수 종속된다. 이러한 이행적 함수 종속이 나타나는 이유는 함수 종속 관계가 하나의 릴레이션에 여러 개 존재하기 때문이다.

등급에 따라 결정되는 할인율이 고객아이디 속성과 함께 세 가지 속성들이 하나의 릴레이션에 속하게 되니, 고객 아이디가 할인율을 결정하게 되는 것처럼 관계가 형성된다. 그리고 이로 인해 이상 현상이 발생하게 된 것이다(마치 기본키에 종속된 관계가 두 개처럼 보여짐).


제 3 정규형

릴레이션이 제 2정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 제 3정규형에 속한다.

source: https://overcome-the-limits.tistory.com/513


보이스/코드(BNCF) 정규형

릴레이션의 함수 종속 관계에서 모든 결정자가 후보키이면 보이스/코드 정규형에 속한다.

하나의 릴레이션에는 여러 개의 후보키가 존재할 수 있다. 이 경우 제 3정규형까지 모두 만족하더라도 이상 현상이 발생할 수 있다. 후보키를 여러 개 가지고 있는 릴레이션에 발생할 수 있는 이상 현상을 해결하기 위해 좀 더 엄격한 제약조건을 제시한 것이 보이스/코드 정규형(a.k.a 강한 제 3정규형)이다.

앞서 다룬 릴레이션 중 위의 이벤트 참여 릴레이션은 (고객 아이디, 이벤트 번호)가 유일한 후보키이자 기본키이면서 함수 종속 관계에서도 유일한 결정자이다. 그러므로 제 3정규형에 속하면서도, 보이스/코드 정규형에도 속한다.

제 3정규형에 속하지만 보이스/코드 정규형에 속하지 않은 릴레이션 예시

source: https://wldud8870.tistory.com/374

위 강좌신청 릴레이션은 고객이 인터넷 강좌를 신청하면 해당 강좌의 담당강사에 대한 데이터를 저장한다. 이 릴레이션에서는 한 고객이 인터넷 강좌를 여러 개 신청할 수 있지만 동일한 인터넷 강좌를 여러 번 신청할 순 없다. 그리고 강사 한 명이 인터넷 강좌를 하나만 담당할 수 있고, 하나의 인터넷 강좌는 여러 강사가 담당할 수 있다.
그러므로 튜플을 구별할 수 있는 후보키로는 (고객 아이디, 인터넷 강좌)와 (고객 아이디, 담당강사번호)가 있고, 이 중 (고객 아이디, 인터넷 강좌)를 기본키로 선정하였다.

이 릴레이션에서 기본키인 (고객 아이디, 인터넷 강좌)가 담당강사번호 속성을 함수적으로 결정하는 것은 당연하다(기본키이기에). 그리고 강사 한 명이 인터넷 강좌를 하나만 담당하므로 담당강사번호가 인터넷 강좌를 함수적으로 결정하는 것도 가능하다.

이 강좌신청 릴레이션은 모든 속성이 원자 값으로만 구성되어 있으므로 제 1정규형에 속하고, 기본키가 아닌 속성인 담당강사번호가 기본키에 완전 함수 종속되는 것은 물론, 이행적 함수 종속을 포함하고 있지 않으므로 제 2정규형, 제 3정규형에 속한다. 하지만 담당강사번호 속성이 후보키가 아님에도 인터넷 강좌 속성을 결정하므로 해당 릴레이션은 보이스/코드 정규형에 속하지 않는다.

이상 현상 사례

강좌신청 릴레이션에서 여러 이상 현상이 발생하는 이유는 후보키가 아니면서 함수 종속 관계에서 다른 속성을 결정하는 담당강사번호 속성이 존재하기 때문이다. 모든 결정자가 후보키가 될 수 있도록 강좌신청 릴레이션을 다음과 같이 분해하면 위와 같은 이상 현상을 막을 수 있다.

source: https://wldud8870.tistory.com/374


정규화의 이면

정규화 과정을 거쳐 테이블을 많이 나눈다고 성능이 100% 좋아지는 것은 아니다. 오히려 성능이 나빠질 수도 있다.
테이블을 많이 나누게 되면, 그만큼 조인 쿼리가 많아질 수 있기 때문이다.
따라서 서비스에 따라 정규화 과정을 진행해야 한다.

post-custom-banner

0개의 댓글