ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [데이터베이스] 정규화
    IT/데이터베이스 2022. 10. 11. 02:25

    본 포스팅은 "데이터베이스 개론 [2판]" 도서로 공부한 내용을 요약하기 위한 포스팅입니다.


    1. 정규화의 개념과 이상 현상(Anomaly)

      데이터베이스를 잘못 설계하면 불필요한 데이터 중복이 발생하여 릴레이션에 대한 데이터의 삽입·수정·삭제 연산을 수행할 때 부작용이 발생할 수 있다. 이러한 부작용을 이상(Anomaly) 현상이라 한다.

     

      이상 현상은 관련이 없는 데이터, 즉 관련 없는 속성들을 하나의 릴레이션에 모아두고 있기 때문에 발생하며,
    관련 있는 속성들로만 릴레이션을 구성하기 위한 작업이 정규화이다.

    정규화는 릴레이션을 관련이 있는 속성들로만 구성하기 위해 릴레이션을 분해하는 과정이다.

     

      이상 현상에는 삽입 이상(Insertion anomaly), 갱신 이상(Update anomaly), 삭제 이상(Deletion anomaly)가 있다.

    • 삽입 이상 : 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제
    • 갱신 이상 : 중복 튜플 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제
    • 삭제 이상 : 튜플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 문제
    예시. 이상 현상을 설명하기 위한 릴레이션

    Case 1. 고객아이디 "Apple"의 등급 변경 시 일부만 수정되는 경우
    Case 2. 고객아이디 "Orange"의 이벤트 참여를 취소로 인해 튜플을 삭제하는 경우
    Case 3. 고객아이디 "Melon"이 신규 가입한 경우 (이벤트 참여 X)

    이상현상 설명을 위한 예시 (이벤트 참여 릴레이션)


    2. 함수 종속

      하나의 릴레이션을 구성하는 속성들의 부분 집합을 X와 Y라 할 때, 어느 시점에서든 릴레이션 내의 모든 튜플에서 하나의 X 값에 대한 Y 값이 항상 하나면 "Y가 X에 함수적으로 종속되어 있다"라고 한다.
    함수 종속 관계는 X→Y로 표현하고 X를 결정자, Y를 종속자라고 한다.

    함수 종속의 표현

     

      위에서 살펴본 이상현상 설명을 위한 예시 릴레이션에 존재하는 함수 종속 관계를 기호로 표현하면 아래와 같다.

    이벤트참여 릴레이션에 존재하는 함수 종속 관계

     

      이벤트참여 릴레이션에 존재하는 함수 종속 관계에서 {고객아이디, 이벤트번호}에 종속되어 있는 "고객이름" 속성은

    {고객아이디, 이벤트번호}의 일부분인 "고객아이디" 속성에도 종속되어 있다.

    이러한 경우를 부분 함수 종속이라고 표현한다.

     

      즉, 완전 함수 종속은 릴레이션에서 속성 집합 Y가 속성 집합 X 전체에 대해 종속된 것이지 일부분에 종속된 것이 아님을 의미한다. 

    이와 반대로 부분 함수 종속속성 집합 Y가 속성 집합 X의 전체가 아닌 일부분에도 함수적으로 종속됨을 의미한다.

     

    이벤트참여 릴레이션의 함수 종속 다이어그램 (부분 / 완전)


    3. 기본 정규형과 정규화 과정

      릴레이션이 정규화된 정도는 정규형(NF : Normal Form)으로 표현한다.

    정규형은 아래와 같이 분류된다.

     

    정규형의 종류

     

      각 정규형마다 만족시켜야 하는 제약조건이 존재하고, 릴레이션이 특정 정규형의 제약조건을 만족하면 릴레이션이 해당 정규형에 속한다고 표현한다. 정규형의 차수가 높아질수록 요구되는 제약조건이 많아지고 엄격해진다.

     

      일반적으로 차수가 높은 정규형에 속하는 릴레이션일수록 데이터 중복이 줄어 데이터 중복에 의한 이상현상이 발생하지 않는 바람직한 릴레이션일 수 있지만, 모든 릴레이션이 제 5 정규형에 속해야 되는 것은 아니므로 릴레이션의 특성을 고려해서 적합한 정규형을 선택해야 한다.

     

    3-1. 제1 정규형 (1NF : First Normal Form)

    릴레이션에 속한 모든 속성의 도메인이 원자 값(Atomic value)으로만 구성되어 있으면 제 1 정규형에 속한다.

     

    제 1정규형 표현 예시

      제 1 정규형으로 변환된 릴레이션의 경우 불필요한 데이터 중복으로 인해 이상 현상이 발생하는 릴레이션이 있을 수 있다. (위의 내용 참고)

     

    3-2. 제 2 정규형 (2NF : Second Normal Form)

    릴레이션이 제 1 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형에 속한다.

      위의 말은 제 1 정규형에 속하는 릴레이션에서 부분 함수 종속을 제거하고 모든 속성이 기본키에 완전 함수 종속되도록 릴레이션을 분해하는 정규화 과정을 의미한다. 제 2 정규화 과정에서 릴레이션을 분해할 때 주의할 점은, 분해된 릴레이션들을 자연 조인하여 분해 전의 릴레이션으로 다시 복원할 수 있어야 한다는 것이다.

     

      이를 위의 제 1 정규형 예시를 기준으로 함수 종속 다이어그램으로 표현하면 아래와 같다.

     

    제 2 정규형을 위한 릴레이션 분해

     

      그리고 이를 릴레이션 분해로 표현하면 아래와 같다.

     

    제 2 정규형으로의 분해 결과

     

      제 2 정규형에 속하더라도 오른쪽 릴레이션의 경우 함수 종속성을 단 하나만 포함하므로 이상 현상이 더는 발생하지 않지만 왼쪽 릴레이션은 부분 함수 종속 대신 함수 종속성을 아직도 여러 개 포함하고 있어 이상 현상이 발생할 수 있다.

     

    Case 1. 등급 "GOLD"의 할인율 변경 시 일부만 수정되는 경우
    Case 2. 고객아이디 "Orange"의 회원 탈퇴로 튜플이 삭제되는 경우 (SILVER 등급의 할인율 정보 삭제됨)
    Case 3. 등급 "BRONZE"를 추가하고 싶은 경우

    제 2 정규형 예제의 이상현상 예시

     

    3-3. 제 3 정규형 (3NF : Third Normal Form)

    릴레이션이 제 2 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 제 3 정규형에 속한다.

      이행적 함수 종속(Transitive FD)이란 X, Y, Z에 대해 함수 종속 관계 X → Y와 Y → Z가 존재하면 논리적으로 X → Z가 성립한다. 이때 속성 집합 Z가 속성 집합 X에 이행적으로 함수 종속 되었다고 한다.

     

      위의 제 2 정규형에서 생성한 예제로 살펴보면 아래와 같이 분해하는 것이 제 3 정규화 과정이다.

     

    제 3 정규형을 위한 분해

     

    3-4 보이스/코드 정규형 (BCNF : Boyce / Codd Normal Form)

    릴레이션의 함수 종속 관계에서 모든 결정자가 후보키이면 보이스/코드 정규형에 속한다.

      앞에서 설명한 제 3 정규형까지 모두 만족하더라도, 제 3 정규형에 속하는 릴레이션이 후보키를 여러 개 가지고 있다면 이상 현상이 발생할 수 있는데, 이러한 이상 현상을 해결하기 위해 제 3 정규형보다 좀 더 엄격한 제약조건을 제시한 것이 보이스/코드 정규형이고, 강한 제 3 정규형 (Strong 3NF)라고도 한다.

     

    아래의 조건으로 생성된 릴레이션을 예로 들어보자.

    한 고객이 인터넷 강좌를 여러 개 신청할 수 있지만 동일한 인터넷 강좌를 여러 번 신청할 수는 없다.
    그리고 강사 한 명이 인터넷강좌를 하나만 담당할 수 있다.
    하나의 인터넷강좌는 여러 강사가 담당할 수 있다.

    이 중에서 후보키로 {고객아이디, 인터넷강좌}를 기본키로 선정했다.

     

    강좌신청 릴레이션과 함수 종속 다이어그램 예시

     

      위의 예시를 살펴보면 제 1 정규형과, 제 2, 제 3 정규형 모두 만족하는 형태의 릴레이션이다. 하지만, 아래와 같이 여전히 이상현상이 발생한다.

    Case1. 새로운 인터넷 강좌를 추가하는 경우 → 고객 아이디에 NULL 값 발생으로 삽입 불가
    Case2. "P004" 강사의 강좌가 변경되는 경우 → 4행과 6행 2개의 튜플 중 부분만 수정되는 경우 데이터 불일치
    Case3. "Banana" 이 강좌를 취소해서 튜플을 삭제하는 경우 → 해당 튜플 삭제로 인해 "P002" 강사에 대한 데이터 손실

     

      이러한 이상 현상이 발생하는 이유는, 후보키가 아니면서 함수 종속 관계에서 다른 속성을 결정하는 담당강사번호 속성이 존재하기 때문이다. 따라서 이상 현상이 발생하지 않도록 하려면 모든 결정자가 후보키가 될 수 있도록 아래와 같이 릴레이션을 분해 해야 한다.

     

    보이스/코드 정규형을 만족하도록 분해한 릴레이션의 함수 종속 다이어그램

     


    4. 정규화 과정 정리

    정규화 과정 정리


     

Designed by Tistory.