본문 바로가기
카테고리 없음

# 04. DB 정규화 (정규화 필요성, 이상현상, 함수 종속성)

by 파프리카_ 2024. 4. 25.
728x90
반응형

1. 정규화의 필요성

  • 잘못된 데이터베이스 설계는

    • 데이터의 일관성을 훼손하고,

    • 데이터의 무결성을 손상한다.

데이터의 일관성 훼손과 무결성 손상이 왜 나쁜가?

=> 데이터에 대한 활용과 신뢰성이 떨어지게 된다.

==> 결론적으로, 잘못된 정보를 운용하게 됨

데이터의 일관성 훼손과 무결성 손상은 왜 발생하는가?

  • 대부분의 경우, 불필요한 데이터 중복으로 인해 발생

    👍 좋은 설계 = 데이터 중복 최소화!

이상 현상

  • 데이터 이상 : 불필요한 데이터 중복으로 인해 발생하는 부작용

  • 종류

    • 삽입 이상 : 데이터 삽입 시, 현재 필요한 컬럼의 데이터 외에 테이블의 다른 불필요한 컬럼의 값을 강제로 같이 입력해주어야만 데이터 삽입이 가능한 경우

    • 갱신 이상 : 데이터 수정 시, 중복된 속성값 중 일부가 수정되지 않을 경우 데이터 불일치가 발생하는 경우

    • 삭제 이상 : 데이터 삭제 시, 삭제 대상 컬럼의 데이터 외의 다른 컬럼의 데이터까지도 같이 삭제되어 데이터 손실이 발생하는 경우

  • 이상현상 예시

    • '학교' 테이블

      • 속성 : 학번, 과목, 성적, 강의실
    • 삽입 이상

      • 신규 과목을 추가하고자, row를 insert하고자 한다. 그런데 '학번'과 '과목' 둘 다 기본키이기 때문에, 신규 과목과 관련없는 '학번'을 추가해야 한다.
    • 갱신 이상

      • '수학' 과목의 '강의실'이 2강의실에서 3강의실로 변경되어서 일괄 수정하려 한다. 현재 테이블에 '과목':수학-'강의실':2강의실 데이터가 2개 이상일 때, 중복된 속성(과목='수학')에서 '강의실'을 같이 수정하는 것을 빼먹을 경우, 데이터 불일치가 발생한다.
    • 삭제 이상

      • 학교에서 더 이상 '미술' 과목을 수행하지 않는다. '미술' 과목을 삭제하려 했는데, 같은 row에 학생의 '학번'이 존재한다. '미술' 과목을 가진 row 삭제 시, 부득이 하게 해당 '학번'을 가진 학생의 정보도 사라지게 된다.

이러한 이상 현상의 주원인은 "불필요한 데이터의 중복" 이 원인이다.

이는 릴레이션 안에 너무 많은 속성이 있어, 연관성이 낮은 속성까지도 한 릴레이션으로 구성되기 때문이다.

=> 그렇다면 이를 분리하는 척도에 대해 알아보자.

2. 함수 종속성

함수 종속성 은 연관성이 높은 속성들을 하나의 릴레이션으로 구성하기 위한 기준의 척도를 의미한다.

=> 하나의 릴레이션에는 하나의 종속성(속성 사이의 연관관계)만 표현되도록!

결정자종속자

  • 결정자

    • 릴레이션에서 해당 속성이 결정되면, 대응되는 다른 속성들의 값들이 자동으로 결정됨

    • 결정자가 같다면 반드시 대응되는 다른 속성들도 같음

    • ==> 결정자가 결정되면, 나머지 속성 값들도 유일하게 결정됨

  • 종속자

    • 결정자에 의해 결정되는 나머지 속성들
  • 표현

    결정자 → 종속자 

예시

  • '학생' 테이블

    • 컬럼 : 학번, 이름, 주소, 학년, 성별
  • '학번'이 결정되면 '이름', '주소', '학년', '성별'의 값도 결정됨

  • '학번'은 다른 속성값들은 고유하게 결정하며, 반대로 다른 속성들은 '학번'에 의해 값이 결정됨

  • 표현

    학번 → (이름, 주소, 학년, 성별)

==> 함수 종속성은 릴레이션의 모든 가능한 속성에 대해서 충족되어야 한다!

완전 함수 종속

  • 종속자가 기본키에만 종속되며

  • 기본키를 구성하는 모든 속성이 포함된 기본키의 부분집합에 종속된 경우

회원번호 이름 나이 거주지역
A001 송민지 17 서울
A002 박아람 15 부산
A003 이예은 16 대전
  • => 회원번호을 통해 (이름, 나이, 거주지역)을 식별할 수 있다.

  • (이름, 나이, 거주지역)은 회원번호에 완전함수종속 관계이다.

부분 함수 종속

  • 종속자가 기본키가 아닌 다른 속성에 종속되거나

  • 기본키가 여러 속성으로 구성된 경우 기본키를 구성하는 속성의 일부만 종속되는 경우

고객ID  제품코드 주문상품 수량 가격
AAAA01 T001 티셔츠 2 12000
AAAA01 B110 청바지 1 11000
AAAA02 B110 청바지 2 22000
AAAA03 T091 와이셔츠 1 15000
AAAA03 O100 원피스 1 19000
  • => 결정자는 (고객ID, 제품코드) 두 개인데, 주문상품은 제품코드만 알아도 식별이 가능하다.

  • 주문상품 속성은 기본키에 부분 함수 종속 관계이다.

이행적 항무 종속

  • 릴레이션에서 X, Y, Z라는 3 개의 속성이 있을 때

  • X→Y, Y→Z 이란 종속 관계가 있을 경우, X→Z가 성립되는 경우

  • 즉, X를 알면 Y를 알고 그를 통해 Z를 알 수 있는 경우

상품번호 상품명 소분류 대분류
A001 검은 체크무늬 셔츠 상의 의류
A002 유선 마우스 마우스 전자제품
A003 유기농 양배추 야채 식료품
A004 포테이토 칩 스낵 식료품
A005 32인치 4K 모니터 모니터 전자제품
A006 청바지 하의 의류
A007 분홍 스웨터 상의 의류
  • '상품번호'를 알면, '소분류'을 알 수 있고, => 상품번호->소분류

  • '소분류'을 알면, '대분류'를 알 수 있다. => 소분류->대분류


3. 정규화

정규화

  • 데이터 이상 방지를 위해 중복을 감소시키는 구조로,

  • 함수 종속성이 없는 비연관 속성 그룹을 분리하여,

  • 단계적으로 릴레이션을 분해하는 과정

정규화의 목표🙌

  • 모든 릴레이션을 연관 있는 속성들로만 구성

3-1. 제1정규형

  • 도메인이 원자값이 되도록 테이블을 분해하는 것
  • 테이블의 하나의 컬럼에 데이터는 여러값들이 한번에 들어갈 수 없다.
  • 제1정규형에 위배됨

  • 제1정규형을 만족함

3-2. 제2정규형

  • 제1정규화를 진행한 테이블에 완전함수종속을 만족하도록 테이블을 분해하는 것
    • 기본키의 부분집합이 결정자가 되어서는 안됨
  • 제2정규형에 위배됨 -> 부분함수종속 제거하도록 함

  • 제2정규형을 만족함 -> 모든 종속자가 결정자에 완전함수종속이 되었음

3-3. 제3정규형

  • 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것

    • X -> Y AND Y -> Z AND X -> Z
    • X는 기본키, Y는 기본키가 아님
    • Z는 기본키가 아닌 일반 속성인 Y에 함수적 종속되고 있는데 이를 이행적 종속이라 부름
  • 제3정규형에 위배됨 -> 수강료는 기본키인 학생번호와 일반 속성인 강좌이름에 의해 결정됨

  • 제3정규형을 만족함 -> 강좌이름이 기본키인 테이블로 분리

3-4. BCNF 정규형 (보이스코드 정규형)

  • 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것

    • 종속자가 기본키의 결정자의 역할을 할 때
  • BCNF정규형에 위배됨 -> 복합키인 (학생번호,특강이름)이 교수의 결정자 역할을 하지만, 교수가 기본키의 일부인 특강이름의 결정자 역할을 함

  • BCNF정규형을 만족함 -> 복합키를 각각 테이블의 기본키로 분리


728x90
반응형