정규화

김규원·2025년 12월 9일

DB

목록 보기
14/22
post-thumbnail

논리 데이터 모델링 정의 및 절차

정규화란?

  • 데이터처리에 있어 입력, 수정, 삭제의 이상현상을 제거하여 안정적 처리를 보장하기 위한 방법
  • 기본 원칙은 테이블에 중복된 데이터가 없도록 하는 것임
  • 다양한 유형의 검사를 통해 데이터 모델을 더욱 구조화 하고 개선시켜 나가는 절차에 관련된 이론
  • 정규화는 본질적으로 속성들 간의 함수 종속성을 기준으로 테이블을 분해하는 과정임.
  • 즉, 어떤 속성이 다른 속성을 결정한다면(결정자→ 종속자) 그 관계를 올바르게 표현하고 “이상(anomaly)”이 없도록 구조를 재조정하는 것이 정규화 목표임.

함수 종속성

  • 하나의 속성(또는 속성 집합)이 다른 속성(또는 속성 집합)의 값을 결정한다는 의미임.
  • 이 관계가 있어야만 어떤 속성을 기준으로 테이블을 나누거나 합치는 게 정당화 됨.

정규화의 단계

1차 정규화(중복제거)

반복적인 속성값이 나타나는 경우 별도의 엔터티로 분리

입력이상

  • 하나의 주문에 여러 제품(빵, 딸기)이 있을 때, 이를 하나의 행(빵, 딸기)에 넣는게 아니라 여러 행을 넣어야 함

수정이상

  • 마우스의 재고 수량을 900개에서 1000개로 변경하려면, 3번을 수정해야 함.
    => 여러 행에 반복해서 저장되어 있기 때문에 발생하는 문제로, 제품 정보 수정은 단 한번만 수정해도 가능해게 해야 함

삭제이상

  • 제품번호 1201인 스피커를 주문한 CB231 주문을 삭제하려고 한다면 제품에 대한 정보까지 삭제됨
    => 주문 정보를 삭제하면 제품 정보까지 함께 삭제 되면 안됨.

왜 이상이 발생할까?

  • 입력, 수정, 삭제 이사잉 발생하는 이유는 테이블 설계가 비정규화되어 중복 데이터가 존재하기 때문
  • 이를 방지하기 위해 정규화를 수행해야 함.

2차 정규화(부분 함수 종속 제거)

  • 제품번호에 제품명이 종속적임 => 정규화 필요

입력 이상

  • "새로운 제품을 추가할 때 주문이 같이 되지 않으면 제품을 추가하는 것이 불가능"
  • 제품 정보(제품명, 재고수량)를 저장하려면 주문번호와 제품번호로 구성된 복합 키 전체가 필요합니다. 아직 주문된 적이 없는 새로운 제품은 주문번호가 없으므로 테이블에 삽입할 수 없습니다.
    => 제품 정보는 주문 정보와 분리하여 제품 테이블에 저장되어야 합니다.

수정 이상

  • "하나의 제품에 대해서 재고수량을 변경하기 위해서는 주문 목록에서 해당 제품의 모든 재고수량을 수정해야 함"
  • 특정 제품의 정보(예: 재고수량)가 해당 제품이 포함된 모든 주문 행에 반복적으로 저장되어 있기 때문입니다.
  • 제품 정보는 제품 테이블에서 단 한 번만 수정되도록 분리되어야 합니다.

삭제 이상

  • "주문 목록을 삭제할 경우 한 번만 주문되었던 제품인 경우 해당 주문 목록도 같이 삭제됨"
  • 특정 제품이 유일하게 포함된 주문 행을 삭제하면, 그 주문 행에 포함되어 있던 제품의 정보(제품명, 재고수량)까지 함께 삭제되어 해당 제품에 대한 데이터가 데이터베이스에서 완전히 소실됩니다.
  • 제품 정보는 제품 테이블에 별도로 저장되어야 하며, 주문 정보가 삭제되어도 제품 정보는 그대로 유지됩니다.

3차 정규화(이행적 함수 종속 제거)

입력 이상

문제: "새로운 고객을 등록하려고 해도 주문을 하지 않으면 등록할 수 없음"

원인: 고객 정보(사업자번호, 고객등급)를 저장하기 위해서는 기본 키인 주문번호가 반드시 필요합니다. 주문번호는 고객이 주문을 해야만 생성되므로, 주문하지 않은 고객의 정보를 미리 입력할 수 없습니다.

해결: 고객 정보는 주문 정보와 분리하여 고객 테이블에 저장되어야 합니다.

2. 수정 이상

문제: "여러 번 주문한 고객의 사업자번호를 변경하려고 할 경우 여러 번 수정해야 함"

원인: 한 고객의 정보(사업자번호)가 해당 고객의 모든 주문 행에 반복적으로 중복 저장되어 있기 때문입니다.

해결: 고객 정보는 고객 테이블에서 단 한 번만 수정되도록 분리되어야 합니다.

3. 삭제 이상

문제: "고객이 주문을 취소한 경우 주문정보만 삭제되는 것이 아니고 고객의 정보까지 같이 삭제됨"

원인: 고객이 마지막으로 한 번 주문한 주문 행을 삭제할 경우, 그 주문 행에 포함되어 있던 고객의 고유 정보(사업자번호, 고객등급)까지 함께 삭제되어 데이터가 소실됩니다.

해결: 고객 정보는 고객 테이블에 별도로 저장되어야 하며, 주문 정보가 삭제되어도 고객 정보는 유지됩니다.

보이스코드 정규화(BCNF)

  • 식별자 간에 종속성이 있는 경우 별도의 엔터티로 분리
  • 제 3정규형에서 모든 결정자가 후보키가 되도록 분할한 것

입력 이상

문제: "새로운 제품을 납품하기 위해서는 납품업체코드와 납품회사명이 같이 입력되어야 함" (새로운 납품업체 정보를 등록하기 위해서는 해당 업체에 대한 납품 기록이 있어야 함)

원인: 납품업체 정보(코드, 회사명)가 오직 납품 행을 통해서만 저장될 수 있기 때문입니다.

해결: 납품업체 정보(코드, 회사명)를 분리하여 납품업체 테이블에 독립적으로 저장해야 합니다.

수정 이상

문제: "납품회사명을 수정하기 위해서는 여러 건의 데이터를 수정해야 함"

원인: 특정 납품업체의 정보(납품회사명)가 해당 업체와 관련된 모든 납품 기록 행에 반복적으로 중복 저장되어 있기 때문입니다.

해결: 납품업체 정보는 납품업체 테이블에서 단 한 번만 수정되도록 분리되어야 합니다.

삭제 이상

문제: "특정 회사의 마지막 납품건을 삭제하면, 동시에 납품업체정보도 삭제됨"

원인: 특정 회사의 정보가 해당 회사의 유일한 납품 기록 행에만 존재할 경우, 그 행을 삭제하면 회사에 대한 고유 정보까지 소실됩니다.

해결: 납품업체 정보는 납품업체 테이블에 별도로 저장되어야 하며, 납품 기록이 삭제되어도 업체 정보는 유지됩니다.

4차 정규화(다치종속 제거)

  • 여러 값을 중복적으로 삽입해야 하는 종속성을 제거
  • A → B 인 의존성에서 단일 값 A와 다중 값 B가 존재한다면 다치 종속
  • 다치 종속은 최소 2개의 컬럼이 다른 컬럼에 종속되어야 하기 때문에 최소 3개의 컬럼이 필요

입력 이상

문제: "어떤 사원이 새로운 프로젝트에 투입되면 프로젝트와 관계없이 기술코드를 입력해야 함"

원인: 새로운 프로젝트에 투입(예: E100 \rightarrow PJT_C)되었을 때, 이 정보를 저장하려면 기존의 모든 기술(SQL, Java)과의 조합인 1×2=21 \times 2 = 2개의 행이 새로 추가되어야 합니다. 기술을 먼저 업데이트할 때도 프로젝트 수만큼 행을 추가해야 합니다.

해결: 사원-기술 관계와 사원-프로젝트 관계를 독립된 테이블로 분리해야 합니다.

수정 이상

문제: "어떤 직원이 경험한 프로젝트 코드를 변경해야 한다면 보유하고 있는 기술의 수만큼 변경을 해야 함"

원인: E100 사원의 PJT_A 프로젝트 코드가 PJT_Z로 변경될 경우, 이 사원이 가진 모든 기술(SQL, Java)에 대해 각각 프로젝트 코드를 수정해야 합니다 (총 2회 수정).

해결: 프로젝트 정보는 기술 정보와 분리되어 사원-프로젝트 테이블에서 한 번만 수정되어야 합니다.

삭제 이상

문제: "어떤 직원이 보유한 기술을 삭제하면 투입되었던 프로젝트도 같이 삭제되어 프로젝트 경력을 알 수 없음"

원인: E200 사원의 유일한 기술인 C++ 정보를 삭제하기 위해 해당 행을 삭제하면, 이 사원이 참여했던 프로젝트 경력(PJT_C) 정보까지 함께 삭제될 수 있습니다.

해결: 기술 정보와 프로젝트 정보는 독립적인 테이블에 저장되어야 하며, 하나의 관계를 삭제해도 다른 관계는 유지되어야 합니다.

요약

• 1차 정규화: 복수의 속성값을 갖는 속성을 분리
• 2차 정규화: 주식별자 전체에 종속적이지 않은 속성을 분리
• 3차 정규화: 속성에 종속적인 속성의 분리
• 보이스-코드 정규화: 주식별자 안에서 함수적 종속관계가 발생 다수의 주식별자 분리
• 4차 정규화: 여러 값을 중복적으로 삽입해야 하는 종속성을 제거
• 실제 데이터베이스 업무에서는 순서대로 진행되는 것은 아니다.

profile
행복한 하루 보내세요

0개의 댓글