개발/MySQL

[SQL] 정규화란?

국두리 2021. 4. 6. 17:12

데이터 베이스에서 정규화란? 테이블을 올바른 형태로 변경하고 분할 하는것을 정규화라고 합니다.

 

주관적인 기준이지만 올바른 형태라는것은, 그동안의 많은 데이터베이스 기술자들이 고안해 정리한 것을 말합니다.

이를 참고하여, 정규화 하는 과정을 통해 관계형 데이터베이스가 효율적으로 동작하도록 만들수 있습니다.

 

정규화는 단계적인 순서가 존재합니다. 그 첫번째 단계가 '제1 정규화'로, 관계형 데이터 베이스 테이블에는

하나의 셀에 하나의 값만 저장할 수 있다는 제약이 있습니다.

 

예를 들어, 주문 데이터를 생각해 봅시다.

  주문번호 날짜 성명 주문상품
1 1 2021/04/06 오재호 맥북 2개 , 마우스 3개
2 2 2021/04/06 김국평 마우스 1개
3 3 2021/04/06 오재호 맥북 3개 , 마우스 5개

 

위 테이블을 제 1정규화를 하게되면, 상품코드, 상품명, 개수로 분할을 할수 있습니다.

주문번호 날짜 성명 상품코드 상품명 개수
1 2021/04/06 오재호 01 맥북 2개
1 2021/04/06 오재호 02 마우스 3개
2 2021/04/06 김국평 02 마우스 1개
3 2021/04/06 오재호 01 맥북 3개
3 2021/04/06 오재호 02 마우스 5개

 

하지만 제 1정규화에서는 중복을 제거하는 테이블의 분할도 이루어져야 합니다.

예를 들면,  주문번호, 날짜, 성명등의 정보가 중복이 되고 있는데 , 

두개의 테이블 주문과 주문상품으로 분할을 한다면 다음과 같이 중복된 데이터를 없애는것이 가능합니다.

이렇게 정규화가 진행된 후에, 주문 테이블에는 주문번호에 PK를 지정할수 있고

주문상품 테이블에는 주문번호와 상품코드를 한데 묶어 기본키로 지정할수 있습니다.

 

[주문]

주문번호 날짜 성명 연락처
1 04/06 오재호 010-1234-5678
2 04/06 김국평 010-4343-4343
3 04/06 오재호 010-9877-0987

[주문상품]

주문번호 상품코드 상품명 개수
1 01 맥북 2
1 02 마우스 3
2 02 마우스 1
3 01 맥북 3
3 02 마우스 5

 

 

 

제1정규화 후에도, 문제가 있습니다. 

바로, 함수종속성이라는 것 입니다. 특히 기본키에 중복이 없는지를 찾습니다.

 

주문상품에서 기본키는 주문번호와 상품 코드입니다. 

기본키에 특정되는 열은 (개수) 이고, 반면 상품명은 상품코드에만 특정되는 열 입니다.

이럴경우, [주문상품] 테이블을 [주문상품] + [상품] 으로 분할하는데 이 경우 제 2정규화를 한다. 라고 정의합니다.

 

[주문상품]

주문번호 상품코드 개수
1 01 2
1 02 3
2 02 1
3 01 3
3 02 5

[상품]

상품코드 상품명
01 맥북
02 마우스

 

제 3정규화는 기본키 이외의 부분에서 중복이 없는지를 조사합니다.

주문 테이블에 동일인이 여러번 주문을 하는경우 , 중복데이터가 존재합니다.

그런 경우 [주문] 테이블을 [주문] + [고객 ] 테이블로 분할 합니다.

 

주문번호 날짜 성명 연락처
1 04/06 오재호 010-1234-5678
2 04/06 김국평 010-4343-4343
3 04/06 오재호 010-9877-0987

 

 

[주문]

주문번호 날짜 고객번호
1 4/6 1
2 4/8 2
3 4/10 1

 

[고객]

고객번호 성명 연락처
1 오재호 010-xxx
2 김국평 016-xxx

 

정규화는 실제로는 5정규형까지 있습니다만 대부분의 시스템에서 제 3정규형까지의 정규화를 채택합니다.