정규화
관계형 데이터베이스의 정규화는 데이터의 중복을 소거하고 무결성을 유지하는 과정을 뜻한다. 그리고 이러한 정규화를 정도에 따라 1NF, 2NF, 3NF, BDNF, 4NF, 5NF로 정의한다.
Functional Dependancy (FD)
두 튜플 간의 관계를 함수형으로 정의한다.
FD: X → Y 라면 X는 항상 하나의 Y를 결정할 수 있어야 한다.
1NF
데이터가 단일 값(atomic)일 때, 1NF를 만족한다. atomic이란 원자와 같이 분해할 수 없는 하나의 속성 값을 뜻한다.
이름 | 나이 | 취미 |
김철수 | 23 | {축구, 코딩} |
위 데이터는 [취미]가 여러 항목을 가지기 때문에 1NF를 만족하지 않는다.
따라서 아래와 같이 데이터를 분리해 준다.
이름 | 나이 |
김철수 | 23 |
이름 | 취미 |
김철수 | 축구 |
김철수 | 코딩 |
2NF
2NF는 1NF를 만족하고 부분 종속을 허용하지 않는다. 즉, 'key의 부분 집합'이 'key 집합에 속하지 않는(non-prime) 속성'을 특정할 수 없어야 한다. 다시 말해 X → Y 에서 X는 key의 부분 집합이 아니여야 한다.
상품명 | 제조사 | 분류 | 가격 |
납작만두 | A | 식품 | 11,800 |
납작만두 | B | 식품 | 15,900 |
초록쿠션 | B | 인테리어 | 13,900 |
만약 key={상품명, 제조사} 라고 하자. 그런데 [분류]는 제조사와 관계없이 상품명에 따라 결정되어 버린다.
- key = {상품명, 제조사}
- 상품명 → 분류
여기서 key의 부분 집합인 [상품명]이 [분류]라는 속성을 지정해 버린다. 이 상황은 2NF를 위반한다. 따라서, 부분 종속되는 관계를 새로운 테이블로 분리해 준다.
상품명 | 제조사 | 가격 |
상품명 | 분류 |
3NF
이행 종속(transitive dependency)이란, (X → Y) & (Y → Z)이면 X → Z가 성립하는 것을 말한다. 이 때문에 불필요한 종속성이 발생한다. 따라서 3NF는 2NF를 만족하고 이행 종속이 발생하지 않아야 한다.
사번 | 이름 | 부서 | 근무 오피스 |
100231 | 김철수 | DevOps | 3F-04 |
key={사번}이지만 부서만 알아도 근무 오피스를 특정할 수 있다고 하자.
- key = {사번}
- 부서 → 근무 오피스
여기서 [사번] → [부서] → [근무 오피스]라는 이행 종속이 발생한다. 따라서 [부서] → [근무 오피스] 관계를 별도의 테이블로 분리해준다.
사번 | 이름 | 부서 |
부서 | 근무 오피스 |
BCNF
BCNF(Boyce-Codd Normal Form)은 X → Y 관계가 성립할 때, 모든 X는 Key여야 한다는 제약을 가지며 3NF를 만족한다. 다시 말해, key가 아닌 속성이 다른 속성을 결정해서는 안 된다.
메뉴 | 가게 이름 | 가게 주소 | 가격 |
감자튀김 | 동네맥주 | A-Street B32 | 9,800 |
key={메뉴, 가게_이름}이고, 가게 주소를 알면 가게 이름을 추론할 수 있다.
- key = {메뉴, 가게_이름}
- 가게 주소 → 가게 이름
하지만 [식당 주소]는 key에 속하지 않기 때문에 BCNF를 만족하지 않는다. 따라서 위반되는 관계를 별도의 테이블로 분리한다.
메뉴 | 가게 이름 | 가격 |
가게 주소 | 가게 이름 |
4NF
4NF는 다치(multi-valued) 종속을 허용하지 않고, BCNF를 만족한다. 다치 종속이란 A →→ B로 표현하며, 1:N의 관계를 뜻한다.
과목 | 학번 | 과제 |
DB | 2022011 | ER Modeling |
DB | 2022011 | Query |
DB | 2022011 | PostgreSQL 실습 |
DB | 2022379 | ER Modeling |
DB | 2022379 | Query |
DB | 2022379 | PostgreSQL 실습 |
위 표는 DB 과목에서 모든 학생이 동일한 과제를 제출했다고 가정한다. [과목] 1개, [학번] 2개, [과제] 3개이지만 (1 x 2 x 3)해서 총 6개의 튜플이 만들어졌다. 이렇게 데이터의 중복이 발생하는 상황을 다치 종속이라고 한다.
- 과목 →→ 학번
- 과목 →→ 과제
위 관계에서 발생한 다치 종속도 별도의 테이블로 분리해준다.
과목 | 학번 (수강 학생) |
과목 | 과제 |
5NF
5NF는 4NF를 만족하고, Join을 통한 정보 손실이 없어야 한다. 데이터 정규화를 위해 데이터를 여러 개의 테이블로 분리한다. 그리고 다시 Join을 통해 데이터를 복원할 때 정보의 손실(loss)이 없어야 한다. 이때 정보를 잃는 것뿐만 아니라 잘못된 정보가 생성되는 것도 허용하지 않는다.
문제점
정규화를 통해 테이블을 나누면 데이터를 복원할 때 JOIN 연산이 늘어나므로 성능에 영향을 준다. 따라서 처리 성능이 중요한 데이터에 대해 '반정규화(De-normalization)'하기도 한다.