데이터베이스 정규화
데이터베이스 정규화란 관계형 데이터베이스에서 중복된 데이터를 최소화하는 과정입니다.
중복된 데이터로 인해 생기는 문제를 해결할 수 있으며, 정규화된 정도를 정규형으로 표현합니다.
제1 정규형
릴레이션의 모든 레코드에서 각각의 필드에는 한 개의 값만 들어가 있어야 하는 것입니다.
학생 | 과목 |
john | 수학, 영어 |
jake | 수학 |
학생과 듣는 수업에 대한 릴레이션입니다. 해당 릴레이션의 첫 번째 레코드의 과목 필드에는 두 개의 값이 들어가 있기 때문에 제1 정규형이 아닙니다.
이를 제1 정규형에 맞게 정규화하면 다음과 같습니다.
학생 | 과목 |
john | 수학 |
john | 영어 |
jake | 수학 |
레코드가 늘어나 DB의 저장공간을 더 차지하였으나 이는 정규화를 위해 감안하는 부분입니다.
제2 정규형
릴레이션이 제1 정규형을 만족하며 기본키(복합키)의 일부 속성에 의존하고 있지 않고 기본키에 완전 함수 종속적인 것입니다.
학생 | 교수 | 과목 |
john | james | 수학 |
john | mike | 영어 |
john | kevin | 영어 |
jake | james | 수학 |
수업(과목)과 수강생(학생), 교수에 대한 릴레이션입니다. 해당 릴레이션에서 학생만으로는 기본키가 되지 못하고 학생과 교수에 따라 레코드를 구별할 수 있으므로 학생+교수인 복합키가 기본키입니다.
여기서 과목은 기본키의 일부 속성인 교수에만 의존하므로 제2 정규형이 아닙니다. ※교수는 한 과목만 맡는다고 가정합니다.
이 경우 학생 - 교수, 교수 - 과목으로 나눕니다.
학생 | 교수 |
john | james |
john | mike |
john | kevin |
jake | james |
교수 | 과목 |
james | 수학 |
mike | 영어 |
kevin | 영어 |
위의 릴레이션을 제2 정규형으로 정규화시킨 결과입니다.
제3 정규형
릴레이션이 제2 정규형을 만족하며 기본키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않는 것입니다.
이행적 함수 종속이란 A, B, C가 존재할 때 A -> B이고 B -> C이면 A -> C가 성립하는데 이때, C는 A의 이행적으로 함수 종속이 되었다고 합니다.
회원 | 등급 | 할인율 |
john | 플래티넘 | 20% |
jake | 골드 | 15% |
kevin | 실버 | 10% |
회원과 등급, 그에 따른 할인율에 대한 릴레이션입니다. 해당 릴레이션에서 기본키는 회원이고 회원에 따라 등급이 결정되므로 회원 -> 등급, 등급에 따라 할인율이 결정되므로 등급 -> 할인율이 됩니다.
즉, 기본키가 아닌 할인율이 회원에 이행적 함수종속을 만족하므로 제3 정규형이 아닙니다.
이 경우 회원 - 등급, 등급 - 할인율로 나누어 제3 정규형으로 만듭니다.
회원 | 등급 |
john | 플래티넘 |
jake | 골드 |
kevin | 실버 |
등급 | 과목 |
플래티넘 | 20% |
골드 | 15% |
실버 | 10% |
위의 릴레이션을 제3 정규형으로 정규화시킨 결과입니다.
보이스/코드 정규형
제3 정규형을 만족하면서 모든 결정자가 후보키인 것입니다.
결정자란 특정 속성을 결정짓는 요소, 주민번호와 이름에서 이름은 주민번호를 결정짓지 못하지만 주민번호는 이름을 결정지을 수 있기 때문에 주민번호는 결정자라 할 수 있습니다.
학생 | 과목 | 교수 |
john | 수학 | james |
john | 영어 | mike |
john | 영어2 | mike |
jake | 수학 | james |
제2 정규형을 설명할 때와 마찬가지로 수업(과목)과 수강생(학생), 교수에 대한 릴레이션입니다.
또한 제2 정규형을 설명할 때와 반대로 교수가 여러 과목을 맡을 수 있다고 가정하였고, 때문에 이 경우 기본키는 학생+과목인 복합키입니다.
여기서 기본키가 아닌 교수가 과목을 결정하기 때문에 보이스/코드 정규형을 만족하지 않습니다.
학생 - 과목, 과목 - 교수로 나누어 이를 해결합니다.
학생 | 과목 |
john | 수학 |
john | 영어 |
john | 영어2 |
jake | 수학 |
교수 | 과목 |
james | 수학 |
mike | 영어 |
mike | 영어2 |
james | 수학 |
위의 릴레이션을 보이스/코드 정규형으로 정규화시킨 결과입니다.
정규형을 지키지 않을 시 발생하는 이상현상
- 삽입이상
- 과목을 수강하지 않은 학생 정보를 추가할 때 과목에 null값을 넣어야 합니다.
- 수정이상
- 학생의 다른 정보를 갱신했을 때, 다른 곳에 있는 해당 학생의 정보도 알맞게 갱신해야 합니다. 이를 놓칠 시, 학생의 데이터가 일치하지 않는 데이터 부정합이 일어납니다.
- 삭제이상
- 어떤 학생이 한 과목 만을 듣고 있고 그 과목을 취소한다면 그 학생에 대한 정보가 아예 사라집니다.
마무리
간단한 예시를 들어 설명하여 릴레이션이 분리되는 방식이 다 비슷합니다. 실제상황에서 쓰이는 바는 이보다 좀 더 다르기 때문에 위의 예시들에서는 각각의 정규형이 왜 릴레이션을 분리하는지에 대해 생각하시면 이해하는데 도움이 될 것 같습니다.
※ 잘못된 정보, 혹은 다른 의견이 있다면 댓글로 말해주세요. 감사합니다.
'CS > 데이터베이스' 카테고리의 다른 글
인덱스의 정의 (0) | 2023.02.27 |
---|---|
NoSQL(비관계형) 데이터베이스 (0) | 2023.02.17 |
관계형 데이터베이스 (0) | 2023.02.14 |
트랜잭션 (0) | 2023.02.08 |
데이터베이스 기초 (1) | 2023.01.27 |