데이터베이스 정규화란?
데이터의 중복을 최소화하고 데이터의 무결성을 향상하며 유연하게 데이터들을 구조화하는 프로세스를 의미합니다.
데이터베이스를 정규화할 때 정규화된 정도에 따라 정규형(Normal Form)으로 표현하는데, 1NF, 2NF, 3NF, BCNF, 4NF, 5NF, 6NF까지 있습니다. 보통 3NF 정도 되면 정규화되었다고 하며 3NF 테이블의 대부분은 이상 현상(Anomaly)이 발생하지 않습니다. 각 정규형이 되기 위해선 만족시켜야 할 제약조건들이 있으며, 높은 차수의 정규형 일 수록 조건이 까다롭습니다.
정규화의 목적
- 불필요한 중복 데이터를 제거함
- 각종 이상 현상(Anomaly)을 방지하고 테이블의 구성을 논리적이고 직관적이게 함
- 데이터베이스 구조 확장 시 재디자인 최소화
데이터베이스 정규화를 통해서 테이블 간의 중복된 데이터를 제거하여 DB 용량을 최적화할 수 있고,
새로운 데이터형을 추가로 인한 확장 시 그 구조에 대한 영향을 최소화할 수 있습니다.
또한 데이터베이스의 변경 시 이상 현상(Anomaly)을 방지할 수 있는데,
여기서 이상 현상(Anomaly)이란 테이블을 수정(갱신, 삽입, 삭제) 시, 발생하는 부작용을 의미합니다.
<이상 현상(Anomaly)>
- 갱신 이상
Employee ID : 519인 직원의 주소를 갱신하였지만 다른 레코드에서 다른 주소를 가지고 있기 때문에 해당 직원의 주소는 어디인가에 대한 질문에 대해 혼동을 줄 수 있습니다. 이러한 현상을 갱신 이상이라고 합니다.
- 삽입 이상
Faculty ID : 424 인 Dr. Newsome 교수는 고용 일자가 기록되어 있지만 아직 맡은 강의가 없기 때문에 Course Code를 NULL로 하지 않는 이상 테이블에 추가를 할 수 없습니다. 이러한 현상을 삽입 이상이라고 합니다.
- 삭제 이상
Faculty ID : 389인 Dr. Giddens 교수의 강의가 만약 임시로 중단될 때 해당 레코드를 삭제 시 교수 자체의 데이터가 삭제되는 현상이 발생하게 됩니다. 이렇게 데이터의 삭제가 전혀 다른 사실에 대한 데이터의 삭제도 필요로 하게 되는 현상을 삭제 이상이라고 합니다.
정규화의 대상
정규화(Normalization) & 반정규화(Denormalization)
반정규화란 시스템의 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정을 뜻합니다.
온라인 거래 시스템 같은 OLTP(OnLine Transaction Processing) 데이터베이스는 CRUD(Create, Read, Update, Delete)가 많이 일어나기 때문에 정규화되는 것이 좋지만,
분석 리포트 같은 OLAP(OnLine Analytical Processing) 데이터베이스는 분석과 리포팅을 위해 사용되기 때문에 연산의 속도를 위해 반정규화(denormalization)의 대상이 됩니다.
정규화 과정
제 1 정규화(First Normal Form, 1NF)
제 1 정규화는 테이블의 칼럼이 원자 값(하나의 값)을 갖도록 테이블을 분해하는 것입니다.
예를 들어 아래와 같은 테이블이 있다고 할 때,
학번 | 과목코드 | 성적 | 이름 |
201510735 | A1001, A2002, A3003 | A+, C+, B | Cocoon |
칼럼이 원자 값을 가지고 있지 않기 때문에 제 1 정규형을 만족하지 않습니다.
따라서 아래와 같은 형태로 바꿔줍니다.
학번 | 과목코드 | 성적 | 이름 |
201510735 | A1001 | A+ | Cocoon |
201510735 | A2002 | C+ | Cocoon |
201510735 | A3003 | B | Cocoon |
제 2 정규화(Second Normal Form, 2NF)
제 2 정규화는 제 1 정규화에 속하면서, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속된 형태입니다.
학번 | 과목코드 | 성적 | 학과 | 등록금 |
201510735 | A011011 | A+ | 기계공학과 | 480 |
201510735 | A022022 | A | 기계공학과 | 480 |
201510735 | A033033 | B | 기계공학과 | 480 |
201810222 | B066066 | B | 컴퓨터공학과 | 500 |
201910987 | C011011 | A | 전기공학과 | 490 |
201610111 | D044044 | A+ | 기계공학과 | 480 |
함수의 종속성을 살펴보자면
- {학번, 과목 코드} -> 성적
- {학번, 과목 코드} -> 학과
- {학번, 과목 코드} -> 등록금
- 학번 -> 학과
- 학번 -> 등록금
- 학과 -> 등록금
학번 -> 학과, 학번 -> 등록금 두 개의 부분 함수 종속성을 가지고 있기 때문에
이를 제거해주는 것을 제 2 정규화라고 합니다.
위의 테이블에서 기본키는 {학번, 과목 코드}로 복합 키입니다.
그런데 여기서 학과나 등록금은 기본키의 부분집합인 학번에 의해 결정될 수 있습니다.
그렇기 때문에 위의 테이블에서 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되게 분리를 하면 아래와 같습니다.
<학생 테이블>
학번 | 학과 | 등록금 |
201510735 | 기계공학과 | 480 |
201810222 | 컴퓨터공학과 | 500 |
201910987 | 전기공학과 | 490 |
201610111 | 기계공학과 | 480 |
<성적 테이블>
학번 | 과목코드 | 성적 |
201510735 | A011011 | A+ |
201510735 | A022022 | A |
201510735 | A033033 | B |
201810222 | B066066 | B |
201910987 | C011011 | A |
201610111 | D044044 | A+ |
두 테이블 모두 제 1 정규형에 속하고, 기본키를 제외한 모든 속성이 기본키에 완전 함수 종속되므로 제 2 정규형을 만족하게 됩니다.
하지만 제 2 정규형을 만족하더라도 이상 현상이 발생할 수 있는데
갱신 이상
기계공학과의 등록금이 480에서 500으로 인상되어 데이터를 갱신하였지만 다른 레코드에서는 480으로 표시되기 때문에 데이터 불일치 문제가 발생하게 됩니다.
삽입 이상
새로운 학과가 개설되고 등록금이 정해지지 않았다면 등록금 속성을 NULL로 하지 않는 이상 테이블에 추가를 할 수 없게 됩니다.
삭제 이상
201610111 학번을 가진 학생이 자퇴하는 경우 기계공학과에 대한 정보도 함께 사라지게 됩니다.
제 3 정규화(Third Normal Form, 3NF)
제 2 정규화에 속하면서, 기본키를 제외한 모든 속성이 기본키에 이행적 함수 종속이 되지 않는 형태입니다.
이행적 함수 종속이란 A, B, C에 대해 A -> B이고 B -> C 이면 A -> C 가 성립하는 경우입니다.
C가 A에 이행적으로 함수 종속되었다고 하며, 삼단논법 같은 관계를 가진 함수 종속이라고 생각하시면 됩니다.
<학생 테이블>
학번 | 학과 | 등록금 |
201510735 | 기계공학과 | 480 |
201810222 | 컴퓨터공학과 | 500 |
201910987 | 전기공학과 | 490 |
201610111 | 기계공학과 | 480 |
제 2 정규화 과정을 거친 학생 테이블에서 함수적 종속성은 아래와 같습니다.
- 학번 -> 학과
- 학과 -> 등록금
- 학번 -> 등록금
통상적으로 학과에 의해 등록금이 결정되는 것이지 학번에 의해 등록금이 결정되는 것은 아니기 때문에 분리해줍니다.
<학생 테이블>
학번 | 학과 |
201510735 | 기계공학과 |
201810222 | 컴퓨터공학과 |
201910987 | 전기공학과 |
201610111 | 기계공학과 |
<학과 테이블>
학과 | 등록금 |
기계공학과 | 480 |
컴퓨터공학과 | 500 |
전기공학과 | 490 |
<출처>
https://wkdtjsgur100.github.io/database-normalization/
https://yaboong.github.io/database/2018/03/09/database-normalization-1/
'💾Database' 카테고리의 다른 글
[Database] 데이터 무결성(Data Integrity)이란? (3) | 2021.12.13 |
---|---|
[Database] 데이터베이스 기본 용어 정리 (0) | 2021.11.29 |
[Database] 데이터베이스란? (0) | 2021.10.30 |
[Database] 데이터베이스 인덱스(Index)란? (0) | 2021.10.15 |
[Database] DBMS, RDBMS, SQL, NoSQL 용어 정리 (0) | 2021.10.13 |