자격증/SQLD

[SQL 첫걸음] 35강. 정규화

동호다찌 2022. 4. 4. 09:33

정규화

  • 정규화(Normalization)는 데이터베이스의 테이블을 규정된 올바른 형태로 개선해나가는 걸 의미합니다.
  • 보통 설계 단계에서 행해지지만 기존 시스템을 바꿔야할 때도 정규화하는 경우가 있습니다.
  • 정규화에는 순서가 존재하는데 이를 참고하여 관계형 데이터베이스가 효율적으로 동작하도록 만들 수 있습니다.
  • 물론 최적의 설계란 상황에 따라 다르기 때문에 반드시 모든 걸 따라야하는 것은 아닙니다.

정규화

예를 들어 아래와 같은 주문 데이터가 저장된 주문 테이블이 존재한다고 가정해봅시다.


제1정규형

  • 관계형 데이터베이스의 테이블에는 하나의 셀에 하나의 값만 저장할 수 있다는 제약이 있습니다.
  • 따라서 아래와 같이 기존 주문상품열을 아래와 같이 상품코드, 상품명, 개수라는 열로 가지고 있는 주문상품이라는 테이블로 따로 분리하는 게 좋습니다.이때 유의할 점은 주문번호라는 열을 기본키로 지정하여 사용자가 주문한 내역과 관계를 형성하여 중복된 부분을 제거할 수 있다는 것입니다.

  • 이처럼 제1정규형은 반복되는 부분을 찾아내서 테이블을 분할하고 기본키가 될 열을 작성하는 것입니다.

  • 한번의 주문으로 여러 개의 상품을 주문할 수 있어 주문번호, 날짜, 성명, 연락처가 동일한 값을 가지는 행이 여러개 존재할 수 있습니다.
  • 동일한 값을 가지는 행이 여러개 존재하지 않도록 정리하는 것이 정규화입니다.
  • 주문 테이블을 주문상품테이블과 주문 테이블로 나누어 주문 상품 테이블에는 주문 테이블과 결합할 수 있도록 주문번호 열을 추가하는 것입니다.

제2정규형

  • 이때 주문상품이라는 테이블 속 상품명은 상품코드에 종속적입니다.
  • 따라서 상품코드, 상품명을 열로 가지고 있는 상품이라는 테이블을 따로 분리하는 게 좋습니다. > 이때 유의할 점은 상품코드라는 열을 기본키로 지정하여 두 테이블 간의 관계를 형성해야 한다는 것입니다.

  • 이렇게 되었을 때 상품코드 혹은 상품명에 수정사항이 생길 때 더 간편하게, 실수없이 기존의 데이터를 변경할 수 있습니다.
  • 이처럼 제2정규형은 부분 함수종속성을 찾아내서 테이블을 분할하는 것입니다.
  • 여기서 함수종속성이란 키 값을 이용해 데이터를 특정지을 수 있는 것을 가리킵니다.
  • 위 예시에서는 상품코드라는 키 값을 통해 상품이라는 데이터를 특정지을 수 있었습니다.

제3정규형

  • 앞서 주문 테이블에도 고객 정보가 중복되어 있었습니다.
  • 이를 아래와 같이 고객번호, 성명, 연락처라는 열을 가진 고객 테이블로 분리할 수 있습니다. - 이때 고객번호를 기본키로 설정하여 주문 테이블의 외래키로 연결해 관계를 형성할 수 있습니다.

  • 제3정규형은 기본키 이외의 부분에서 중복이 없는 지를 조사하여 테이블을 분할하는 것입니다.

실제로 정규형은 제5규형까지 존재하지만 보통 제3정규형까지의 정규화를 채택합니다.


정규화의 목적

정규화의 목적은 결국 데이터를 쉽게 관리하는 데 있습니다.

  • 이를 조금 더 구체적으로 설명하자면 정규화를 통해 하나의 데이터를 무조건 한 곳에만 위치하게 하고 테이블 간의 관계는 키를 통해 형성하게 합니다.
  • 이를 통해 갱신 등의 작업을 행할 때 저장된 한 곳만 변경하여 데이터의 정합성을 유지할 수 있습니다.

  • 정규화의 종류는 앞서 이야기 한 것처럼 4정규형, 5정규형은 물론 원래는 3정규형 다음에 BCNF(Boyce-Codd Normal Form) 또한 존재합니다.
  • 더욱이 정규화의 목적 또한 조금 더 구체적으로는 이상현상(Anomarly)을 위한 것으로 이상현상의 종류에 대해서도 한 번 살펴볼 필요가 있습니다.