정규화(Normalization)
정규화란 이상현상이 있는 릴레이션을 분해하여 이상현상을 없애는 과정이다.
이상현상이 존재하는 릴레이션을 분해하여 여러 개의 릴레이션을 생성하게 된다. 이를 구분하여 정규형이 높아질수록 이상현상은 줄어들게 된다.
즉, 테이블 간에 중복된 데이터를 허용하지 않는다는 것이다.
중복된 데이터를 허용하지 않음으로써 무결성을 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.
이상현상(Anomly)
삭제 이상
튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
"장미란"이라는 학생의 정보를 지울 경우 "체육관 103" 강의실 정보도 같이 사라지게 되어 다른 튜플들이 "체육관 103"을 사용하지 못하는 경우에 발생한다.
삽입 이상
튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상
수정 이상
튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상
"박지성"과 "김연아" 학생이 같은 "데이터베이스"라는 수업을 "공학관 110"에서 수강하고 있다. 그런데 두 강의는 독립적으로 입력된 데이터이기 때문에 "박지성" 학생이 강의실을 "공학관 201"로 변경하여도 "김연아" 학생은 "공학관 110"으로 데이터가 그대로 유지되고, 같은 "데이터베이스"수업임에도 불구하고 강의실이 달라진다.
제1 정규화(1NF)
테이블의 칼럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다.
위의 테이블에서 "추신수", "박세리"는 여러 개의 취미를 가지고 있기 때문에 제1 정규형을 만족하지 못하고 있다.
이를 제1 정규화하여 분해할 수 있다.
제2 정규화(2NF)
제1 정규화를 진행한 테이블에 대해 부분 함수 종속을 제거(완전 함수 종속)를 만족하도록 테이블을 분해하는 것이다.
완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다.
위 테이블에서 기본키는 "학생번호, 강좌이름"으로 복합키이다. 그리고 이 복합키는 "성적"을 결정하고 있다.
그런데 여기서 "강의실" 칼럼은 기본키의 부분집합인 "강좌이름"에 의해 결정될 수 있다.
즉, 기본키의 부분키인 "강좌이름"이 결정자이기 때문에 위의 테이블의 경우 기존의 테이블에서 "강의실"을 분해하여 별도의 테이블로 관리함으로써 제2 정규형을 만족시킬 수 있다.
제3 정규화(3NF)
제2 정규화를 진행한 테이블에 대해 이행 함수 종속을 없애도록 테이블을 분해하는 것이다.
이행 함수 종속이라는 것은 A → B, B → C가 성립할 때 A → C가 성립되는 것을 의미한다.
위 테이블에서 "학생 번호"는 "강좌 이름"을 결정하고 있고, "강좌 이름"은 "수강료"를 결정하고 있다. 그렇기 때문에 이를 "학생 번호, 강좌 이름" 테이블과 "강좌 이름, 수강료" 테이블로 분해해야 한다.
이행적 종속을 제거하는 이유는 간단하다. "501번 학생"이 수강하는 강좌가 "스포츠 경영학"으로 변경되었다고 하자. 이행적 종속이 존재한다면 "501번 학생"은 "스포츠 경영학"을 "20000원"이라는 수강료로 들어야 한다. 물론 강좌 이름에 맞게 수강료를 다시 변경할 수 있지만, 이러한 번거로움을 해결하기 위해 제3 정규화를 하는 것이다.
BCNF 정규화 (Boyce-Codd Normal Form)
제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.
특강수강 테이블에서 기본키는 "학생번호, 특강이름"이다. 그리고 기본키는 "교수"를 결정하고 있다. 또한 "교수"는 "특강이름"을 결정하고 있다.
그런데 문제는 "교수"가 "특강이름"을 결정하는 결정자이지만, 후보키가 아니다. 그렇기 때문에 BCNF 정규화를 만족시키기 위해 테이블을 분해해야 한다.
제4 정규화(4NF)
BCNF 정규화를 진행한 테이블에 대해 다치 종속을 없애도록 테이블을 분해하는 것이다.
다치 종속은 같은 테이블 내의 독립적인 두 개 이상의 칼럼이 또 다른 칼럼에 종속되는 것을 말한다.
학생 정보 테이블에서 "자격증"과 "언어" 칼럼이 "학생 번호" 칼럼에 종속되어 있으므로 다치 종속이 존재한다.
다치 종속을 없애기 위해 두 개의 테이블로 분해해야 한다.
제5 정규화(5NF)
제4 정규화를 진행한 테이블에서 조인 종속을 없애도록 테이블을 분해하는 것이다.
조인 종속은 하나의 릴레이션을 여러 개의 릴레이션으로 분해하였다가 다시 조인했을 때 데이터의 손실이 없고 필요 없는 데이터가 생기는 것을 말한다.
제4 정규화를 진행한 두 개의 테이블에 대해 조인 연산을 수행하면 위와 같은 결과가 나온다.
데이터의 손실은 없지만 필요 없는 데이터가 추가적으로 생겼으므로 조인 종속을 제거하기 위해 3개의 테이블로 분해해야 한다.
실전
Q. RDBMS의 정규화에 대해 설명해 주세요
A. 데이터베이스에서 튜플을 삭제, 삽입, 수정을 할 때에 이상현상이 발생하게 되는데 이상현상이 발생하는 릴레이션을 분해하여 이상현상을 없애는 과정을 정규화라고 합니다. 정규화의 목표는 테이블 간에 중복된 데이터를 허용하지 않는 것인데, 이걸 통해 무결성을 유지할 수 있고 DB의 저장 용량 역시 줄일 수 있습니다. 테이블을 분해하는 정규화 단계가 정의되어 있고 어떻게 분해되는지에 따라 정규화 단계가 달라지는데, 제1,2,3,4,5 정규화, BCNF정규화가 있습니다.
제1 정규화는 원자값을 가지고 있어야 하고, 제2 정규화는 부분 함수 종속 제거, 제3 정규화는 이행 함수 종속 제거, BCNF 정규화는 결정자가 후보키가 아닌 함수 종속을 제거, 제4 정규화는 다치 종속 제거, 제5 정규화는 조인 종속 제거를 만족해야 합니다.
참고
https://mangkyu.tistory.com/110
항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.
'멋진 개발자 > DB' 카테고리의 다른 글
개발자 성장 기록 40 - Redis (0) | 2024.04.04 |
---|---|
개발자 취준 기록 31 - Primary Key, Foreign Key (1) | 2024.03.26 |
개발자 취준 기록 29 - DDL, DML, DCL (0) | 2024.03.25 |
[항해 취업 코스] 개발자 취준 기록 28 - 쿼리 최적화, DB 로직 최소화 (0) | 2024.03.22 |
[항해 취업코스] 개발자 취준 기록 20 - NoSQL과 RDBMS (0) | 2024.03.13 |