RDBMS 의 정규화 는 개발자 면접에서 자주 나오는 질문 중의 하나!
정규화는 테이블 간에 데이터의 중복 저장을 방지하기 위함
테이블을 분해하는 방식에 따라 정규화 단계가 달라진다
테이블의 컬럼이 원자값(Atomic Value, 하나의 값)
을 갖도록 테이블을 분해하는 것
부수적인 데이터를 저장하기 위해 ,기본 데이터가 중복되는 경우
고객 취미 테이블이 있을 때.
추신수와 박세리는 여러 개의 취미를 가지고 있기 때문에 제1 정규형을 만족하지 못한다.
이를 제1 정규화 해서 분해한다면?
회원번호, 이름, 주소, 핸드폰번호, 주민번호가 중복으로 들어간다.
홍길동의 자격증과 취득일을 확인하고 싶은데, 이를 위해 홍길동의 회원정보(회원번호, 이름, 주소, 핸드폰번호, 주민번호)가 중복으로 들어가는 것이다.
이는 기본 데이터를 중복을 없애기 위해 테이블을 두 개로 나눠서 해결할 수 있다.
'제1 정규화를 진행한 테이블'에 대해 완전 함수 종속
을 만족하도록 테이블을 분해하는 것
부분 함수 종속을 제거하는 것
완전 함수 종속
기본키가 구성하는 모든 속성에 종속되는 경우.
기본키의 부분집합이 결정자가 되어선 안된다는 것.
부분 함수 종속
기본키가 구성하는 속성의 일부에 종속 or 기본키가 아닌 다른 속성에 종속되는 경우.
수강 강좌 테이블이 있을 때.
기본키인 [학생번호, 강좌이름] 은 복합키이다.
[학생번호, 강좌이름] 는 [성적]을 결정한다.
그러나, 기본키의 부분집합인 [강좌이름]에 의해 [강의실] 컬럼이 결정될 수 있다.
즉, [강죄이름]이 결정자라는 것이다.
기존의 테이블에서 [강의실]을 분해해서, 별도의 테이블로 관리하여 제2 정규형을 만족시킬 수 있다.
'제2 정규화를 진행한 테이블'에 대해 이행적 함수 종속을 없애도록
테이블을 분해하는 것
(이행적 종속 : A -> B, B -> C 가 성립할 때 A -> C 가 성립되는 것)
계절 학기 테이블이 있을 때.
[학생 번호]는 [강좌 이름]을 결정
[강좌 이름]은 [수강료]를 결정
이 경우, 학생 번호가 수강료를 결정하는 것처럼 테이블이 구성되어 버린다.
따라서, 이를 [학생 번호, 강좌 이름] 테이블과 [강좌 이름, 수강료] 테이블로 분해해야 한다.
이행적 종속을 제거하는 이유?
501번 학생이 수강하는 강좌가 스포츠경영학으로 변경될 경우
이행적 종속이 존재한다면, 501번 학생은 스포츠경영학을 20000원 수강료로 듣게 된다.(스포츠경영학은 원래 15000원)
물론 강좌 이름에 맞게 수강료를 다시 변경할 수 있지만, 이러한 번거로움을 해결하기 위해 제3 정규화를 하는 것
'제3 정규화를 진행한 테이블'에 대해 모든 결정자가 후보키가 되도록
테이블을 분해하는 것
후보키
- 각 행(튜플, 가로줄)을 유일하게 식별하기 위해 사용하는 부분집합
- 기본키로 사용할 수 있는 속성
- 하나의 릴레이션내에서는 중복된 튜플들이 있을 수 없으므로 모든 릴레이션에는 반드시 하나 이상의 후보키가 존재한다.
- 후보키는 릴레이션에 있는 모든 튜플에 대해서 유일성과 최소성을 만족시켜야 한다.
(유일성 : 하나의 키값으로 하나의 튜플만을 유일하게 식별할 수 있어야한다.)
(최소성 : 모든 레코드들을 유일하게 식별하는데 꼭 필요한 속성만으로 구성되어 있어야한다.)
특강수강 테이블이 있을 때.
특강신청 테이블에서 기본키 [학생번호, 특강이름] 는 [교수]를 결정
또한, [교수]는 [특강이름]을 결정한다.
즉, [교수]가 [특강이름]을 결정하는 '결정자'라는 것인데, 중복된다는 것은 키(후보키)로써 역할을 하지 못한다는 것이다.
그러나, [교수] 는 후보키가 아니다.
따라서, 특강신청 테이블과 특강교수 테이블로 분해할 수 있다.
참고: [Database] 정규화(Normalization) 쉽게 이해하기
참고: 관계형 데이터 RDBMS, 제1정규화
참고: DB_RDBMS - 7. 정규화
참고: RDBMS 정규화(Normalization) - 2/2
정보 감사합니다.