2023. 5. 28. 16:39ㆍDatabase
정규화란?
정규화는 '이상현상'이 있는 릴레이션을 분해하여 이상현상을 없애는 과정입니다.
릴레이션을 분해하여 중복된 데이터를 줄이고 무결성(Integrity)를 유지하는 것이 정규화의 목표입니다.
정규화를 살펴보기 전에 반드시 짚고 넘어가야 하는 이상현상과 함수 종속성의 개념에 대해 알아보겠습니다.
** 해당 포스팅은 제4,5 정규형은 다루지 않습니다.
이상현상(Anomaly) 이란?
- 삽입 이상(Insertion Anomaly) : 튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상
- 삭제 이상(Deletion Anomaly) : 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
=> 아래의 테이블에서 장미란이라는 학생의 정보를 지울 경우, 강의실 103도 같이 사라지게 되어 다른 튜플들이 강의실 103을 사용하지 못하는 경우입니다. - 갱신 이상(Update Anomaly) : 튜플 갱신 시 중복된 데이터의 일부만 갱신되어 일어나는 데이터 불일치 현상
=> 아래의 테이블에서 박지성 & 김연아 학생이 '데이터베이스' 수업을 110호에서 수강하고 있습니다. 그러나 두 강의는 독립적으로 입력된 데이터이므로, 박지성 학생에서 데이터베이스 수업의 강의실을 201호로 변경해도 김연아 학생은 110호로 데이터가 그대로 유지됩니다. 같은 데이터베이스 수업임에도 불구하고 강의실이 달라지게 됩니다.
함수 종속성(Functional Dependency)이란?
- 함수 종속성은 어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 관계를 종속성이라고 합니다.
- A->B로 표기하며 A를 B의 결정자(Determinant)라고 합니다.
- A->B이면 A는 B를 결정한다(Determine) 고 하며, B는 A에 종속한다(Dependent) 고 합니다.
위의 테이블에서, 속성 A를 알면 다른 속성 B의 값이 유일하게 정해지는 관계(함수 종속성) 를 찾아보겠습니다.
1. 501이라는 학생 번호를 보면 학생 이름은 '박지성'으로 정해집니다. 따라서 학생 번호는 학생 이름을 결정하는 결정자의 역할을 합니다. 501번의 학생번호를 갖는 학생 이름은 '박지성' 단 한개 뿐입니다. 박재상 X 박지송 X 없고 유일합니다.
2. 같은 이유로 학과는 학과 사무실을 결정하는 결정자의 역할을 합니다. 따라서 학과 -> 학과 사무실도 종속 관계가 있습니다.
3. 강의 이름 -> 강의실도 마찬가지입니다.
단, 학생 이름 -> 학과의 관계도 종속 관계처럼 보이지만, 동명이인의 학생이 있는 경우 그 학생의 이름은 학과를 결정하는 결정자 역할을 하지 못합니다. 따라서 둘은 종속 관계가 아닙니다.
예를들어 현재는 '박지성'이라는 동명이인의 학생이 존재하고 한 명은 컴퓨터과, 다른 한 명은 체육학과 소속이라면,
학생 이름은 학과의 값을 유일하게 정하지 못합니다. 따라서 종속관계가 아닙니다.
그럼 이제 정규화를 살펴보겠습니다.
제1정규형
제1정규형은 다음과 같은 규칙들을 만족해야 합니다.
1. 각 컬럼이 하나의 속성만을 가져야 한다.
2. 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다.
3. 각 컬럼이 유일한(unique) 이름을 가져야 한다.
4. 칼럼의 순서가 상관없어야 한다.
Before - 제1정규형
위의 테이블을 보시면 1번 조건에 위배되는 것을 쉽게 확인할 수 있습니다.
과목 컬럼에 두개의 속성을 가진 튜플이 존재합니다.
따라서 제1정규형을 만족하려면 다음과 같이 릴레이션을 나누어야 합니다.
After - 제1정규형
제2 정규형
제2정규형의 규칙은 다음과 같습니다.
1. 제1정규형을 만족해야 한다.
2. 모든 컬럼이 부분적 종속(Partial Dependency)이 없어야 한다. => 모든 칼럼이 완전 함수 종속을 만족해야 한다.
쉽게 말하면 기본키의 부분 집합이 결정자가 되어서는 안된다는 뜻입니다.
A의 값을 알면 다른 속성 B의 값이 유일하게 정해질 경우 A를 B의 결정자라고 합니다(위의 함수 종속성에서 설명)
Before - 제2정규형
위와 같은 수강강좌 릴레이션이 존재하고, (학생번호, 과목)을 복합키라고 가정하겠습니다.
여기서 (학생번호, 과목) 복합키는 성적을 결정하는 결정자의 역할을 합니다. 둘 중에 하나라도 없는 경우에는 성적이 결정되지 않습니다.
하지만 강의실의 경우, 학생 번호 없이 과목만으로도 결정할 수 있습니다.
따라서 기본키의 부분집합이 결정자가 되는, 제2정규형의 대상입니다.
After - 제2정규형
위와 같이 완전 함수 종속을 만족시켜서 분리한다면 제2 정규형이 만들어집니다.
이제는 복합키의 부분집합이 결정자가 되지 않습니다.
제3정규형
제3정규형의 조건은 다음과 같습니다.
1. 제2정규형을 만족해야 한다.
2. 기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 한다.
여기서 이행 종속성이란, A->B, B->C가 성립할 때 A->C가 성립되는 함수 종속성을 의미합니다.
Before - 제3정규형
위 릴레이션을 보시면, ID를 알 경우 등급을 알게되고, 등급을 알 경우 할인율을 알게됩니다.
따라서 이행 종속성이 존재하므로, 제3 정규형의 대상입니다.
After - 제3정규형
위와 같이 이행 종속성을 제거하게 됩니다.
BCNF(Boyce-Codd Normal Form) 정규형
제3 정규형을 강화한 버전으로 규칙은 다음과 같습니다.
1. 제3정규형을 만족해야 한다.
2. 모든 결정자가 후보키 집합에 속해야 한다.
모든 결정자가 후보키 집합에 속해야 하므로,
릴레이션 R에서 함수 종속성 X->Y가 성립할 때 모든 결정자 X가 후보키여야 합니다.
Before - BCNF 정규형
기본키는 (학생번호, 과목) 이고 교수는 (학생번호, 과목)에 완전하게 함수적으로 종속됩니다. 또한 교수 역시도 특강 이름을 결정하며 결정자의 역할을 하고 있습니다.
다음으로 모든 결정자 X가 후보키인지를 확인해야 합니다. (학생번호, 과목)은 기본키이므로 당연히 결정자이며 후보키입니다. 하지만 교수는 결정자이면서 후보키가 아니므로 아래의 왼쪽 테이블은 BCNF정규형이 아닙니다.
After - BCNF 정규형
참고
https://mangkyu.tistory.com/110
https://code-lab1.tistory.com/48
'Database' 카테고리의 다른 글
Row가 3억 개인 테이블에 column 추가/삭제하기(Online DDL) (2) | 2023.11.18 |
---|---|
AWS -> NCloud로 데이터베이스 옮기기(mysqldump, docker) (1) | 2023.06.18 |
[DB] 파티셔닝(partitioning) (1) | 2023.06.04 |
[DB] 반정규화(Denormalization) (1) | 2023.06.04 |