본문 바로가기
CS/DataBase

데이터베이스 첫걸음 정리 - 35장. 정규화

by yongckim 2022. 10. 7.
728x90
반응형

정규화

정규화란 데이터베이스 테이블의 규정된 올바른 형태로 개선해나가는 것입니다.

정규화는 데이터베이스의 설계 단계에서 행해지며 경우에 따라서는 기존 시스템을 재검토할 때 정규화하는 경우도 있습니다.

먼저 예제를 통해 정규화를 진행하는 과정을 살펴봅시다.

먼저, 다음과 같이 쇼핑 사이트의 주문 처리 시스템 DB가 있다고 가정해봅시다.

현재 주문상품의 경우 특별한 형식 없이 만들어져 있어 문제가 발생할 수 있습니다.

현재 주문 상품이 주문 번호와 상품 명, 상품의 개수로 이루있는 상황에서 데이터를 정규화하면 데이터베이스의 테이블로 만들 수 있습니다.

정규화는 단계적으로 실시하며, 첫 번째 단계가 제 1 정규화로 이를 시행하면 제 1 정규형 테이블을 만들 수 있습니다.

제 1 정규형

관계형 데이터베이스의 테이블에는 하나의 셀에 하나의 값만 저장할 수 있다는 제약이 있습니다.

이로 인해 주문상품의 데이터를 그대로 테이블로 만들 수는 없기 때문에 주문 상품이 가진 데이터인 주문 번호, 상품 명, 상품의 개수로 나누어서 데이터테이블로 만들 수 있습니다.

이렇게 구분하면 하나의 셀에는 하나의 값만 저장되므로 테이블화 할 수 있습니다.

주문상품의 데이터를 상품코드와 상품명, 개수로 분할함에 따라 열과 행이 늘어난 것을 볼 수 있습니다.

이렇게 하나의 셀에 하나의 값만 저장할 수 있도록하고 반복되는 부분을 세로방향으로 늘려나가는 것이 제1정규화의 1단계입니다.

 

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

현재 테이블의 경우 한번의 주문으로 여러개의 상품을 주문할 수 있기 때문에 주문번호, 성명, 연락처가 동일한 값을 가지는 행이 여러 개 존재하는 상태입니다.

 

중복을 제거하기 위해 주문상품 테이블과 주문 테이블로 나눈 후 다음과 같은 데이터를 가지게 합니다.

  • 주문 테이블: 주문번호, 성명, 연락처
  • 주문 상품 테이블 : 주문번호, 상품코드, 상품명, 개수

여기서 주문번호 같은 경우 서로 다른 테이블의 결합을 위해 사용하게 됩니다.

그 결과 반복되는 부분이 하나로 깔끔하게 정리되었습니다.

그리고 이전과 달리 주문번호에 중복된 값이 존재하지 않으므로 기본키로 사용할 수 있게 되었습니다.

이처럼 제1정규화에서는 반복되는 부분으로 찾아내서 테이블을 분할하고 기본키가 될 열을 작성할 수 있습니다.

제2정규형

제2정규화에서는 데이터가 중복하는 부분을 찾아내서 테이블로 분할해나갑니다.

이때 기본키에 의해 특정되는 열과 그렇지 않은 열로 나누는 것으로 정규화가 이루어집니다.

다음과 같은 테이블이 있다고 가정해봅시다.

주문상품의 기본키는 주문번호와 상품코드라는 두 개의 열로 되어있습니다.

예를 들어, 주문번호 1에 상품코드가 0001인 상품 주문 개수는 1개인 것을 알 수 있습니다.

이렇게 상품 개수는 기본키가 결정되어야 개수를 파악할 수 있습니다.

 

이와달리 상품명은 주문번호와 관계없이 상품코드만으로도 특정할 수 있습니다.

상품코드는 기본키의 일부이긴 하지만 단독으로 기본키 역할을 할 수는 없습니다.

이처럼 상품코드와 상품명을 분리할 수 있으므로 현재 주문 상품테이블에서 상품코드와 상품명을 분리한 상품 테이블을 만들어봅시다.

상품 테이블 같은 경우 상품코드만으로 기본키를 지정했습니다.

이런식으로 함수 종속성을 찾아내서 테이블을 분할하는 것이 제2정규화입니다.

함수종속성이란 키 값을 이용해 데이터를 특정지을 수 있는 것을 가리킵니다.

 

제3정규형

제2정규화 같은 경우 기본키에 중복을 확인했다면 제3정규화에서는 기본키 이외의 부분에서 중복을 확인합니다.

예를들어 다음과 같이 같은 사용자가 주문을 두번했다고 가정해봅시다.

이런 경우 서비스 사용자에 대한 정보를 담는 고객 테이블을 만들어 주문 테이블과 고객 테이블로 분리하면 성명과 연락처와 같은 중복되는 데이터를 줄일 수 있습니다.

이렇게 이름과 연락처같은 기본키가 아닌 데이터의 중복을 줄이기 위해 사용하는 정규화를 제3정규화라고 합니다.

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

 

지금까지 정규화한 테이블을 ER 다이어그램으로 그려보면 다음과 같이 표현할 수 있습니다.

정규화의 목적

정규화에서는 중복하거나 반복되는 부분을 찾아내서 테이블을 분할하고 기본키를 작성해 사용하는 것을 기본 개념으로 삼습니다.

이는 “하나의 데이터는 한 곳에 있어야한다”는 규칙에 근거합니다.

 

하나의 데이터가 한 곳에만 존재한다면 데이터를 변경하더라도 한곳만 변경하는 것으로 수정을 끝낼 수 있습니다.

하지만 정규화되지 않은 경우 여기저기 중복되어 있는 데이터를 검색하고 일일이 변경해야하는 번거로운 작업을 할 수 있습니다.

또한 인덱스가 지정된 열의 데이터가 변경되는 경우에는 인덱스도 재구축해야 합니다.

하지만 기본키는 분할한 테이블끼리의 연계하기 위해 작성된 내부적인 데이터이므로 변경된 일은 거의없습니다.

따라서 정규화를 통해 테이블에 대한 인덱스의 재구축을 억제할 수 있습니다.

정리

  • 정규화란 데이터베이스 테이블의 규정된 올바른 형태로 개선해나가는 것입니다.
  • 제1정규화는 하나의 셀에 하나의 값만 저장할 수 있도록하고 반복되는 부분을 세로방향으로 늘려나가고 반복되는 부분을 테이블을 분할하고 기본키가 될 열을 작성할 수 있습니다.
  • 제2정규화는 키 값을 이용해 데이터를 특정지을 수 있는 것(함수 종속성)을 찾아내서 해당 데이터로 테이블을 분리하는 것을 의미합니다.
  • 제3정규화는 기본키가 아닌 데이터의 중복을 줄이기 위해 사용하는 정규화를 의미합니다.
  • 일반적으로 정규화를 진행할 시 제3정규화까지 진행하며, 제5정규화까지 존재합니다.
  • 정규화는 하나의 데이터는 한 곳에 있어야 한다는 규칙에 근거하여 진행되며, 정규화시 다음의 장점이 존재합니다.
    • 데이터를 변경하더라도 한곳만 변경하는 것으로 수정을 끝낼 수 있습니다.
    • 테이블에 대한 인덱스의 재구축을 억제할 수 있습니다.
반응형