본문 바로가기
Tech Stack/Database ( TSDB, NOSQL, SQL )

정규화

by jaeaemin 2022. 3. 10.

 

정규화란 

정규화(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