관계형 데이터베이스(RDB)에서 정규화란 데이터의 중복을 최소화하여 구조화하는 과정을 말한다.
이는 일반적으로 크고 제대로 조직되지 않은 테이블 하나를 > 작고 제대로 조직된 테이블 여러 개로 나누는 것을 말한다.
정규화의 목표는 이상(anomaly)이 있는 테이블의 관계를 재구성해서 이상 현상을 제거하고, 중복된 종속성을 여러 테이블로 분할하여 효과적인 검색 알고리즘을 생성하는 등에 있다.
즉, 쉽게 설명하자면, 데이터의 일관성과 유연성은 높이고, 중복은 제거하여 논리적인 테이블 구조를 짜는 것이 정규화다.
정규화를 하게 되면 DB의 테이블 수는 많아지고, 각 테이블에 저장되는 데이터의 양은 적어진다.
이렇게 정규화가 된 데이터 모델에는 일관성, 안정성, 정확성, 단순성, 비중복성이 보장된다.
정보처리기사 시험에도 단골로 등장하는 주제인데, 시험 때는 그냥 단순히 암기했었지만 내용을 제대로 이해하지 못했다.
예시와 함께 정규화에 대해 정확히 알아보자.
제1정규형 (1NF, 1st Normal Form)
컬럼의 값이 원자값(atomic value)이어야 한다. 즉, 어떤 컬럼에 있는 값이 여러 개여서는 안 된다는 것이다.
다음의 예시는 제1정규형을 위반한 예시다.
이름 | 학년 | 수강과목 |
영수 | 1 | 대학수학,운영체제 |
영철 | 2 | 자바,운영체제 |
영호 | 3 | 알고리즘 |
수강과목 컬럼에 여러 값이 들어간 행이 존재하므로, 원자값 규칙을 위배한다. 이를 제1정규화한 경우 다음과 같다.
이름 | 학년 | 수강과목 |
영수 | 1 | 대학수학 |
영수 | 1 | 운영체제 |
영철 | 2 | 자바 |
영철 | 2 | 운영체제 |
영호 | 3 | 알고리즘 |
모든 컬럼이 원자값을 가지므로 제1정규형이 완성되었다.
제2정규형 (2NF, 2nd Normal Form)
1NF를 만족하며, 모든 컬럼의 부분적 함수 종속이 제거되고, 완전 함수 종속이 만족되어야 한다.
부분적 함수 종속은 기본키 중에서 특정 컬럼에만 종속된 컬럼이 없어야 한다는 것이다.
완전 함수 종속은 이러 부분적 함수 종속이 제거되어, 기본키가 특정 컬럼에만 종속되지 않는 것을 말한다.
이게 대체 무슨 소리인지 위의 제1정규형 테이블을 예시로 살펴 보자.
이름 | 학년 | 수강과목 |
영수 | 1 | 대학수학 |
영수 | 1 | 운영체제 |
영철 | 2 | 자바 |
영철 | 2 | 운영체제 |
영호 | 3 | 알고리즘 |
이 테이블에서 기본키는 <이름,수강과목>의 복합키이다.
그런데 여기서 학년 컬럼의 경우, 해당 학생의 학년을 의미하므로 이름 컬럼만 알면 수강과목을 몰라도 알 수 있다.
즉, 학년 컬럼이 이름 컬럼에 부분적 종속되어 있다는 것이다.
이런 경우에는 컬럼의 삽입/삭제/갱신 시 이상 현상이 발생할 가능성이 높아진다.
그러므로 컬럼을 성격에 따라 나눠서 테이블을 분리해 줘서 제2정규형을 만족하도록 해주어야 한다.
이름 | 학년 |
영수 | 1 |
영철 | 2 |
영호 | 3 |
이름 | 수강과목 |
영수 | 대학수학 |
영수 | 운영체제 |
영철 | 자바 |
영철 | 운영체제 |
영호 | 알고리즘 |
테이블을 2개로 분리해 완전 함수 종속을 이루어 제2정규형이 완성되었다.
제3정규형 (3NF, 3rd Normal Form)
2NF를 만족하며, 이행적 함수 종속이 제거되어야 한다.
이행적 함수 종속이란, A가 B에 종속되고(A→B), B가 C에 종속될 때(B→C), 결과적으로 A가 C에 종속되는 것(A→C)을 말한다.
예시는 다음과 같다.
이름 | 등급 | 학점 |
영수 | A+ | 4.5 |
영철 | B | 3.0 |
영호 | B+ | 3.5 |
위의 예시에서, 이름을 알면 등급을 알 수 있고 (이름 → 등급), 등급을 알면 학점을 알 수 있다. (등급 → 학점)
그리고 이름을 알면 학점을 알 수 있다. (이름→학점)
즉, 이름→등급, 등급→학점, 이름→학점을 만족하므로 이행적 함수 종속이 발생했음을 알 수 있다.
다음과 같이 테이블을 분리하면 이행 종속이 제거되어 제3정규형이 만들어진다.
이름 | 등급 |
영수 | A+ |
영철 | B |
영호 | B+ |
등급 | 학점 |
A+ | 4.5 |
B+ | 3.5 |
B | 3.0 |
BC정규형 (BCNF, Boyce-Codd Normal Form)
3NF를 만족하며, 모든 결정자가 후보키가 되어야 한다.
결정자란, 다른 속성의 값을 고유하게 결정할 수 있는 속성을 말한다.
후보키란, 기본키가 될 수 있는, 즉 기본키의 후보가 될 수 있는, 데이터를 유일하게 식별할 수 있는 unique한 속성을 말한다.
다음의 예시로 함께 살펴보자. (제3 정규화가 완료된 상태)
이름 | 수강과목 | 교수 |
영수 | 대학수학 | 김수학 |
영수 | 운영체제 | 김운영 |
영철 | 자바 | 김자바 |
영철 | 운영체제 | 이운영 |
영호 | 알고리즘 | 이리즘 |
영호 | 자바 | 김자바 |
위의 예시에서 한 학생이 어떤 과목을 수강할 때, 한 교수의 강의를 들을 수 있다고 가정하자.
단, 한 과목의 담당 교수는 여러 명일 수 있고, 한 교수는 한 개의 과목만 담당한다.
예를 들어 운영체제 과목의 경우 김운영, 이운영 2명의 교수가 담당한다.
위 예시에서 한 교수가 한 개의 과목만 담당하므로, 교수는 수강과목의 결정자가 될 수 있다.
그런데 교수는 후보키가 될 수 없다. 위의 경우 영철, 영호는 둘 다 김자바 교수의 자바 과목을 수강하므로 교수를 unique한 값이라고 볼 수 없기 때문이다. 즉, 교수는 결정자임에도 후보키가 될 수 없다.
다음과 같이 테이블을 분리하면 BCNF가 완성된다.
이름 | 교수 |
영수 | 김수학 |
영수 | 김운영 |
영철 | 김자바 |
영철 | 이운영 |
영호 | 이리즘 |
영호 | 김자바 |
교수 | 수강과목 |
김수학 | 대학수학 |
김운영 | 운영체제 |
김자바 | 자바 |
이운영 | 운영체제 |
이리즘 | 알고리즘 |
일반적으로는 BCNF까지 완료되면 정규화가 되었다고 본다.
4, 5차 정규화까지 가면 정규화의 단점이 발생할 수도 있다고 한다.
제4정규형 (4NF, 4th Normal Form)
BCNF를 만족하며, 다치 종속이 없어야 한다.
다치 종속이란, 한 릴레이션에서 어떠한 속성이 1:N 관계로 대응되는 것을 의미한다.
예시는 다음과 같다.
이름 | 수강과목 | 동아리 |
영수 | 대학수학,운영체제 | 밴드부,코딩동아리 |
영철 | 자바,운영체제 | 코딩동아리,연극부 |
영호 | 알고리즘,자바 | 댄스동아리 |
위의 예시는 컬럼의 값이 원자값이어야 한다는 1NF의 원칙을 위배한다.
이름과 수강과목은 다치 종속이고, (이름 ↠ 수강과목), 이름과 동아리도 다치 종속이다. (이름 ↠ 동아리)
이를 원자값으로 나누면 다음과 같다.
이름 | 수강과목 | 동아리 |
영수 | 대학수학 | 밴드부 |
영수 | 대학수학 | 코딩동아리 |
영수 | 운영체제 | 밴드부 |
영수 | 운영체제 | 코딩동아리 |
영철 | 자바 | 코딩동아리 |
영철 | 자바 | 연극부 |
영철 | 운영체제 | 코딩동아리 |
영철 | 운영체제 | 연극부 |
영호 | 알고리즘 | 댄스동아리 |
영호 | 자바 | 댄스동아리 |
???
다치 종속을 제거하려다 보니, 너무 불필요하게 수강과목, 동아리 값이 중복되었다.
수강과목과 동아리는 관련이 없는 독립적 관계이다. 따라서 한 행에 표현하려면 불필요하게 값이 중복될 수 있다.
독립적인 속성의 다치 종속을 제거하기 위해서는 속성별로 테이블을 분리해야 한다.
아래와 같이 테이블을 분해하면 제4정규형이 완성된다.
이름 | 수강과목 |
영수 | 대학수학 |
영수 | 운영체제 |
영철 | 자바 |
영철 | 운영체제 |
영호 | 알고리즘 |
영호 | 자바 |
이름 | 동아리 |
영수 | 밴드부 |
영수 | 코딩동아리 |
영철 | 코딩동아리 |
영철 | 연극부 |
영호 | 댄스동아리 |
제5정규형(5NF, 5th Normal Form)
4NF를 만족하며, 조인 종속성이 없어야 한다.
조인 종속성이란, 테이블을 분리한 뒤에 다시 조인시킨 결과가 분리하기 전 원래의 테이블과 같지만 불필요한 데이터가 생기는 것을 의미한다.
제5정규형을 만족하려면 중복을 피하기 위해 속성별로 테이블을 최대한 많이 나눠야 한다.
Project-Join 정규형(PJ/NF) 이라고 하기도 한다.
개발의 편의성을 증대시키고 복잡성을 낮추기 위해 역정규화 (Denormalization)를 하는 경우도 많다.
하지만 정규화는 데이터베이스 이론의 기초이니 잘 알아두도록 하자.
'개발 지식 > 데이터베이스' 카테고리의 다른 글
[DB/데이터베이스] 이상 현상(Anomaly)이란? 설명, 종류와 예시 (0) | 2023.06.07 |
---|
댓글