정규화란
정규화(Normalization)의 기본 목표는 테이블 간에 중복된 데이타를 허용하지 않는다는 것이다.
중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.
이러한 테이블을 분해하는 정규화 단계가 정의되어 있는데, 여기서 테이블을 어떻게 분해되는지에 따라 정규화 단계가 달라지는데, 각각의 정규화 단계에 대해 자세히 알아보도록 하자.
제 1 정규화
: 테이블 컬럼이 원자값을 갖도록 테이블을 분해하는 것을 의미한다.
아래의 양식을 살펴보면 주문 상품이라는 컬럼에서 다중 값과 다중 속성을 가지고 있는 것을 확인 할 수 있다.
이는 제 1 정규형에 위배되고 이를 분리시켜 각 각의 테이블로 분해하는 것을 제 1정규화라고 한다.
주문번호 | 날짜 | 성명 | 연락처 | 주문상품 |
1 | 1/1 | 짱구 | 123 | 01-양파 x 2 02-사과 x 10 |
2 | 1/2 | 맹구 | 234 | 03-물 x 1 04-사이다 x 2 |
3 | 1/4 | 철수 | 456 | 05- 쌀20kg 06- 보리1kg |
1. 주문 상품을 다중값 형식에서 나눠주어 컬럼을 추가한다. ( 레코드 증가)
주문번호 | 날짜 | 성명 | 연락처 | 주문상품 |
1 | 1/1 | 짱구 | 123 | 01-양파 x 2 |
1 | 1/1 | 짱구 | 123 | 02-사과 x 10 |
2 | 1/2 | 맹구 | 234 | 03-물 x 1 |
2 | 1/2 | 맹구 | 234 | 04-사이다 x 2 |
3 | 1/4 | 철수 | 456 | 05- 쌀20kg |
3 | 1/4 | 철수 | 456 | 06- 보리1kg |
2. 주문 상품을 본다면 코드와 상품명이 합쳐져 있는 것을 확인 할 수 있다.
이는 [상품코드] [상품명] [주문갯수] 이라는 3가지 정보가 하나의 속성에 존재하는 "복합속성"의 정보를 가진다.
이를 또 분리해줘야 할 필요가 있다. 분리한다면 아래와 같다.
주문번호 | 날짜 | 성명 | 연락처 | 상품코드 | 상품명 | 갯수 |
1 | 1/1 | 짱구 | 123 | 01 | 양파 | 2 |
1 | 1/1 | 짱구 | 123 | 02 | 사과 | 10 |
2 | 1/2 | 맹구 | 234 | 03 | 물 | 1 |
2 | 1/2 | 맹구 | 234 | 04 | 사이다 | 2 |
3 | 1/4 | 철수 | 456 | 05 | 쌀 | 20kg |
3 | 1/4 | 철수 | 456 | 06 | 보리 | 1kg |
제 2정규화
: 제 1정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해한다.
(완전함수 종속 : 기본키의 부분집합이 결정자가 되어선 안된다. )
아래 그림을 보면 DB에서 중복되는 정보가 다수 생겨났다.
표를 확인하면, < 주문번호, 날짜, 성명, 연락처 > 라는 정보가 상품에 대해서 반복되게 나타나는 것을 확인할 수 있는데.
DB의 성능을 높이기 위해선 이러한 정보도 제거해주어야 할 필요성이 있다.
즉, 제 1정규화는 데이터의 중복을 제거하기 위한 테이블의 분할이다.
- 데이터 중복을 제거하기 위한 테이블 분할
- 고유 식별자가 결정되고, 이를 프라이머리 키 PK라고 부름
주문번호 | 날짜 | 성명 | 연락처 | 상품코드 | 상품명 | 갯수 |
1 | 1/1 | 짱구 | 123 | 01 | 양파 | 2 |
1 | 1/1 | 짱구 | 123 | 02 | 사과 | 10 |
2 | 1/2 | 맹구 | 234 | 03 | 물 | 1 |
2 | 1/2 | 맹구 | 234 | 04 | 사이다 | 2 |
3 | 1/4 | 철수 | 456 | 05 | 쌀 | 20kg |
3 | 1/4 | 철수 | 456 | 06 | 보리 | 1kg |
사용자 주문 테이블 | 1:M 관계 |
주문 항목 테이블 | ||||||
PK | FK | |||||||
주문번호 | 날짜 | 성명 | 연락처 | 주문번호 | 상품코드 | 상품명 | 갯수 | |
1 | 1/1 | 짱구 | 123 | 1 | 01 | 양파 | 2 | |
2 | 1/2 | 맹구 | 234 | 1 | 02 | 사과 | 10 | |
2 | 03 | 물 | 1 | |||||
3 | 1/4 | 철수 | 456 | 2 | 04 | 사이다 | 2 | |
3 | 05 | 쌀 | 20kg | |||||
3 | 06 | 보리 | 1kg |
제 2 정규화
- 두 개 이상으로 구성된 PK에서, 식별자 일부에 종속되는 어트리뷰트는 제거해야 한다.
위에서 살펴본 표를 살펴보면, 주문 테이블에서 상품명은 상품 코드에만 종속되고 , 주문 번호에는 종속되지 않는다.
하지만 PK는 상품 코드 + 주문 번호다.
즉, 주문 번호는 상품명을 구별하는데 전혀 사용하지 않는 것이다. 이 같은 경우 별도로 테이블을 분리시킬 필요가 있다.
주문 테이블 | |||
FK | |||
주문번호 | 상품코드 | 상품명 | 갯수 |
1 | 01 | 양파 | 2 |
1 | 02 | 사과 | 10 |
2 | 03 | 물 | 1 |
2 | 04 | 사이다 | 2 |
3 | 05 | 쌀 | 20kg |
3 | 06 | 보리 | 1kg |
주문 테이블 | 제품 테이블 | ||||
주문번호 | 상품코드 [FK] | 갯수 | 상품코드 [PK] | 상품명 | |
1 | 01 | 2개 | 01 | 양파 | |
1 | 02 | 10개 | 02 | 사과 | |
2 | 03 | 1개 | 03 | 물 | |
3 | 05 | 20kg | 05 | 쌀 |
제 3 정규화
- 식별자 이외에 속성간에 종속 관계가 생겨서는 안된다.
- 종속 관계가 존재하면 중복 값이 생기게 된다.
- 제 3정규화는 이행 종속 관계를 분해하는 것이다.
아래 표를 보면 주문번호를 PK로 독립시켰다.
그런데 일반 속성에서 PK와 관계 없이 성명과 연락처는 서로 종속적인 관계를 가지게 된다.
제 3정규형은 테이블 분리를 통해서 해결 할 수 있다.
주문번호 [PK] | 날짜 | 성명 | 연락처 |
1 | 1/1 | 짱구 | 123 |
2 | 1/2 | 철수 | 234 |
3 | 1/4 | 맹구 | 567 |
- 성명과 연락처는 주문번호와 관계없이 서로 종속관계를 가지고 있다.
주문 이력 테이블 | 고객 정보 테이블 | |||||
주문번호 | 날짜 | 고객 번호 | 고객번호 | 성명 | 연락처 | |
1 | 1/1 | 1 | 1 | 짱구 | 123 | |
2 | 1/2 | 2 | 2 | 철수 | 234 | |
3 | 1/4 | 3 | 3 | 영구 | 567 | |
4 | 1/9 | 1 |
정규화의 예시
'Tech Stack > Database ( TSDB, NOSQL, SQL )' 카테고리의 다른 글
InfluxDB CQ ( continuous query ) (0) | 2022.08.12 |
---|---|
Telegraf (0) | 2022.07.15 |
InfluxDB (1) | 2022.06.27 |
Redis Command (0) | 2022.04.04 |
Redis 기초 (0) | 2022.04.04 |