주요키워드 : redundancy, anomalies, 1NF, 2NF, 3NF, BCNF
관계형 데이터베이스 설계에서 불필요한 데이터 중복(redundancy)을 최소화하기 위해 데이터를 구조화하는 프로세스를 의미한다. 정규화를 통해 삽입/갱신/삭제로 인해 발생할 수 있는 이상현상(anomalies)들을 방지할 수 있다.
- 삽입 이상 : 데이터를 입력할 때 원하지 않는 정보도 함께 삽입되는 경우
- e.g.) 신입생이거나 아직 과목을 수강하지 않는 학생의 튜플을 입력할 때 과목명, 성적이 없어도 불필요하게 입력해야 함
- 삭제 이상 : 튜플을 삭제할 때 유지되어야할 정보까지도 연쇄적으로 삭제되는 경우
- e.g.) 123번 학생의 성적을 삭제할 경우, 학생의 학년 정보나 학번 등 유지해야할 정보까지 모두 삭제됨
- 갱신 이상 : 중복된 튜플 중 일부의 속성만 갱신시킴으로써 정보의 모순이 발생하는 경우
- e.g.) 456번 학생이 3학년이 될 경우, 3개 튜플 모두에 대해서 학년을 변경해야 되며 그러지 않을 경우 모순이 발생함
학번 | 과목명 | 성적 | 학년 |
---|---|---|---|
123 | 수학 | A | 3 |
123 | 영어 | B | 3 |
456 | 수학 | A | 2 |
456 | 영어 | A | 2 |
456 | 지구과학 | B | 2 |
어떤 릴레이션에서 애트리뷰트들의 부분집합을 X, Y라 할 때, 특정 튜플에서 X의 값이 Y의 값을 함수적으로 결정한다면 Y가 X에 함수적으로 종속되었다고 표현한다.
릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성되어 있으면 제 1정규형에 속한다. 정규형들 중에서 제 1 정규형만 만족하는 릴레이션은 삽입이상/갱신이상/삭제이상 세가지 이상현상이 모두 나타난다.
STUDENT_ID | COURSE_ID | GRADE | STUDENT_NM |
---|---|---|---|
20800399 | CSE011101, CSE022202, CSE033303 | A+, A, B+ | 야붕 |
위 릴레이션에서 COURSE_ID의 값들을 원자값들로 분리하면 아래와 같은 제 1 정규형 릴레이션을 얻을 수 있다.
STUDENT_ID | COURSE_ID | GRADE | STUDENT_NM |
---|---|---|---|
20800399 | CSE011101 | A+ | 야붕 |
20800399 | CSE022202 | A | 야붕 |
20800399 | CSE033303 | B+ | 야붕 |
제 1 정규형에 속하면서, 기본키가 아닌 모든 애트리뷰트가 기본키에 완전 함수 종속이면 제 2 정규형이다. 즉 부분 함수 종속을 제거한다.
학번 | 과목코드 | 성적 | 학부 | 등록금 |
---|---|---|---|---|
20800399 | CSE011101 | A+ | 컴퓨터공학부 | 350 |
20800399 | CSE022202 | A | 컴퓨터공학부 | 350 |
20800399 | CSE033303 | B+ | 컴퓨터공학부 | 350 |
21300758 | MEC011101 | F | 경영학부 | 300 |
21400001 | POD032939 | C+ | 기계공학부 | 400 |
21500399 | CSE011101 | D | 컴퓨터공학부 | 350 |
위 릴레이션에서 각 튜플을 구분짓는 기본키는 {학번, 과목코드}이다. 이 때, 나머지 애트리뷰트들의 함수적 종속성은 아래와 같다.
1. {학번, 과목코드} -> 성적
2. {학번, 과목코드} -> 학부
3. {학번, 과목코드} -> 등록금
4. 학번 -> 학부
5. 학번 -> 등록금
6. 학부 -> 등록금
여기서 4, 5번은 기본키 중 '학번'에 대한 부분 함수 종속에 해당한다. 따라서 아래와 같이 두 릴레이션으로 분해한다.
- 학생 릴레이션
학번 | 학부 | 등록금 |
---|---|---|
20800399 | 컴퓨터공학부 | 350 |
21300758 | 경영학부 | 300 |
21400001 | 기계공학부 | 400 |
21500399 | 컴퓨터공학부 | 350 |
- 성적 릴레이션
학번 | 과목코드 | 성적 |
---|---|---|
20800399 | CSE011101 | A+ |
20800399 | CSE022202 | A |
20800399 | CSE033303 | B+ |
21300758 | MEC011101 | F |
21400001 | POD032939 | C+ |
21500399 | CSE011101 | D |
제 2 정규형에 속하면서, 기본키가 아닌 모든 애트리뷰트들에 대해 이행적(연쇄적) 함수 종속을 제거하면 제 3 정규형이다.
애트리뷰트 X, Y, Z에 대해 X->Y 이고 Y->Z이면 X->Z가 된다. 즉 Z가 X에 이행적으로 삼단논법처럼 종속되는 것을 이행적 함수 종속이라 한다.
- 학생 릴레이션
학번 | 학부 | 등록금 |
---|---|---|
20800399 | 컴퓨터공학부 | 350 |
21300758 | 경영학부 | 300 |
21400001 | 기계공학부 | 400 |
21500399 | 컴퓨터공학부 | 350 |
위 학생 릴레이션에서 함수적 종속성은 다음과 같다.
1. 학번 -> 학부
2. 학부 -> 등록금
3. 학번 -> 등록금
여기서 3번은 "등록금"이 "학번"에 이행적으로 종속된다. 따라서 X->Y->Z를 X->Y, Y->Z가 되도록 두 릴레이션으로 분리한다.
- 소속 릴레이션
학번 | 학부 |
---|---|
20800399 | 컴퓨터공학부 |
21300758 | 경영학부 |
21400001 | 기계공학부 |
21500399 | 컴퓨터공학부 |
- 등록금 릴레이션
학부 | 등록금 |
---|---|
컴퓨터공학부 | 350 |
경영학부 | 300 |
기계공학부 | 400 |
장점
- 데이터의 삽입/삭제/변경 시 발생하는 각종 이상현상(Anomalies)들을 해결할 수 있다.
- 불필요한 데이터 중복(redundancy)이 제거된다.
- 데이터베이스 구조가 확장되거나 새로운 데이터형이 추가될 때 구조를 변경하지 않아도 되거나 일부만 변경해도 된다.
단점
- 릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아진다.
- JOIN 연산이 늘어나므로 질의에 대한 응답 시간이 느려질 수 있다.
과다한 JOIN 연산으로 인해 쿼리 성능 저하가 발생한다면 비정규화(반정규화)를 적용할 수 있다.
반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다. 디스크 I/O 량이 많아서 조회 시 성능이 저하되거나, 테이블끼리의 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되거나, 칼럼을 계산하여 조회할 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행하게 된다. 일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다.