DB 정규화(Normalization) 개념과 정규화 과정(1NF - BCNF)

최민수·2023년 3월 2일
0

CS 전공지식

목록 보기
13/36

movie

movie

DB 정규화란?

  • 데이터 중복, 삽입, 수정, 삭제 과정에서의 anomaly(이상 현상)을 최소화하기 위해서 normal forms(NF)에 따라 DB를 구성하는 과정.
    • Normal Forms(NF)?
      • 정규화 되기 위해 준수해야 되는 몇 가지 규칙(단계)를 뜻함.

정규화 단계

  • Init Table > 1NF > 2NF > 3NF > BCNF > 4NF...
    (보통 실무에서는 BCNF 이상은 진행하지 않음; 학술적인 목적이 강함)
    • 단계를 더 진행하고, 덜 진행하는 장단점을 잘 따져서 결정해야 함.
    • 보통 단계가 많이 진행되면 관리해야 할 테이블이 많아지고, join 쿼리가 많아지기 때문에 비용이 커진다.
    • 반면, 진행해야 할 단계보다 적게 진행하면 겹치는 데이터가 많이 분포하기 때문에 성능이 떨어진다.

알아둬야 할 용어

  • Super key - 테이블에서 튜플들을 unique 하게 식별할 수 있는 attribute 집합.
  • (Candidate) Key - Super key 중에서, 어느 한 attribute라도 제거하면 unique 하게 튜플들을 식별할 수 없게 되는 key.
  • Primary Key - Candidate Key 중에서, 선택된 key.
  • Prime Attributes - Key에 속하는 attributes.
  • Non-Prime Attributes - 어떠한 key에도 속하지 않는 attributes.

각 정규화 단계별 정의와 예시

  • Init Table

    Key: account_id(bank_name, account_num)
  • 1NF

    • Attribute의 값은 반드시 더이상 나눠질 수 없는 단일 값 이어야 한다.
      ex) EMPLOYEE_ACCOUNT에서의 마지막 row.
      card_id 의 값이 두 개를 가지면 단일 값이 아니다.

    • 1NF를 만족하기 위한 방법 - 두 개의 튜플로 분리 + primary key 수정(account_id, card_id), (bank_name, account_num, card_id)

    • 1NF를 만족한 결과의 테이블 (아래 그림)

  • 2NF

    • 모든 Non-prime attributes는 모든 Key에 fully functionally dependent 해야 한다.

    • 즉, partially FD 하면 안된다. (= 복합 Key 중 어느 한가지 attribute와 non-prime 간의 FD가 존재해선 안된다)
      ex) 모든 non-prime attributes (class, ratio, empl_id, empl_name) 은 account_id 만으로 의존관계가 성립한다. 따라서, paritally dependent 존재.

    • 판단을 쉽게 하는 법 - 한가지 값만으로 이뤄진 attribute가 없다면, composite key가 존재하지 않으면 2NF를 만족한다.

      • Why?) 복합 키가 아니면 Key의 부분집합에 의존할 여지가 애초에 생기지 않기 때문.
    • 2NF를 만족하기 위한 방법 - 문제가 되는 card_id의 테이블 분리

    • 2NF를 만족한 결과의 테이블 (아래 그림)

  • 3NF

    • Non-prime 간의 FD 관계가 존재하면 안된다.

    • 정확한 정의) X->Y, Y->Z 일 때, Y,Z 가 key의 부분집합이 아니고 X->Z 관계가 성립하는 경우가 있어서는 안된다. (Transitive FD)

      ex) emp_id -> empl_name 의존관계가 존재하기 때문에 3NF를 만족하지 못한다.

    • 3NF를 만족하기 위한 방법 - 문제가 되는 emp_id, empl_name의 테이블 분리.

    • 3NF를 만족한 결과의 테이블 (아래 그림)

  • BCNF

    • 모든 non-trivial FD X->Y 에서 X는 super key여야만 한다.

      • Non-trivial: X->Y 관계에서 Y가 X의 부분집합이 아닌 경우.
        ex) class -> bank_name 의존관계가 존재하는데 class는 super key가 아니므로 BCNF를 만족하지 못한다.
    • BCNF를 만족하기 위한 방법 - 문제가 되는 class와 bank_name를 다른 테이블로 분리.

    • BCNF를 만족한 결과의 테이블 (아래 그림)

  • BCNF 까지 만족한 최종결과

profile
CS, 개발 공부기록 🌱

0개의 댓글