Tech

Diary

Lecture

About Me

개발중

정규화

JeongSeulho

2025년 01월 20일

준비중...
클립보드로 복사

정규화

데이터 중복과 insertion, update, deletionanomaly를 최소화 하기 위해 일련의 normal form에따라 relation을 구성하는 과정

normal form이란 정규화되기 위해 준수해야 하는 규칙
이 각각의 규칙을 normal form(NF)이라고 함

정규화 과정

Image

  • 1NF부터 시작하여 순차적으로 진행
  • 해당 규칙을 만족하도록 테이블 구조를 조정
  • 앞 단계의 규칙을 만족해야 다음 단계로 진행 가능

예시를 통한 정규화 과정

  • 임직원의 월급 계좌를 관리하는 테이블블

Image

정책 설명

  • 계좌는 국민은행 OR 우리은행
  • 한 임직원은 2개 이상의 월급 계좌를 등록하고 월급 비율을 조정 가능
  • 계좌마다 등급 존재
    • 국민은행 : START -> PRESTIGE -> ROYAL
    • 우리은행 : BRONZE -> SILVER -> GOLD
  • 한 계좌는 2개 이상의 현금카드와 연동 가능

해당 테이블의 key, attribute 파악

  • super key : tuple을 유니크하게 식별할 수 있는 속성 집합
  • candidate key : super key 중 최소한의 속성만으로 구성된 속성 집합
    • {account_id}, {bank_name, account_num}
  • primary key : candidate key 중 식별자로 선택된 candidate key
    • {account_id}
  • prime attribute : candidate key에 포함된 속성
    • account_id, bank_name, account_num
  • non-prime attribute : candidate key에 포함되지 않은 속성

해당 테이블의 FD 파악

  • account_id -> 나머지 모든 속성
  • bank_name, account_num -> 나머지 모든 속성
  • class -> bank_name(등급을 보면 어느 은행인지 알 수 있음)
  • empl_id -> empl_name

Image

1NF 설명 및 테이블 수정

  • attributevalue는 나눠질 수 없는 단일한 값이어야 함(배열 안됨)
  • 1NF 규칙 만족을 위해 테이블 수정

Image

  • card_id를 분리하여 튜플 추가

2NF 설명

  • 모든 non-prime attribute는 모든 candidate keyfully functionally dependent해야 한다.
  • 1NF로 인하여 바뀐 candidate key
    • {account_id, card_id}
    • {bank_name, account_num, card_id}
  • 1NF로 인하여 바뀐 non-prime attribute
    • {class}, {ratio}, {empl_id}, {empl_name}

Image

현재 {account_id, card_id}candidate key이지만 {account_id}만으로도
non-prime attribute{class}, {ratio}, {empl_id}, {empl_name}를 유일하게 결정할 수 있음

마찬가지로 {bank_name, account_num, card_id}candidate key이지만 {bank_name, account_num}만으로도
non-prime attribute{class}, {ratio}, {empl_id}, {empl_name}를 유일하게 결정할 수 있음

따라서 현재 2NF 규칙을 만족하지 않음

2NF 테이블 수정

Image

3NF 설명

  • 모든 non-prime attribute는 어떤 candidate key에도 transitively functionally dependent하지 않아야 한다.

transitive FD란 X -> Y && Y -> Z일때 X -> Ztransitive FD라고 함
단, YZcandidate key의 부분집합이 아니어야 함

  • 또다른 설명으로는 non-prime attribute가 다른 non-prime attribute에 FD가 없어야 한다.

Image

현재 {account_id} -> {empl_id}이고 {empl_id} -> {empl_name}이므로 {account_id} -> {empl_name}가 성립, 3NF 규칙을 만족하지 않음
또다른 설명으로 non-prime attribute{empl_id}{empl_name} 사이에 FD가 있으므로 3NF 규칙을 만족하지 않음

3NF 테이블 수정

Image

BCNF 설명

  • 모든 유효한 non-trivial FDX -> Y에 대해서 Xsuper key이어야 한다.

non-trivial FDX -> Y가 성립할때, XY의 부분집합이 아니어야 함을 의미

Image

현재 {class} -> {bank_name}non-trivial FD이지만 {class}super key가 아니므로 BCNF 규칙을 만족하지 않음

BCNF 테이블 수정

Image

2NF 참고 사항

  • 2NF는 모든 candidate keycomposite key(원소 개수가 2 이상인 집합의 키)가 아니라면 2NF는 자동적으로 만족한다.
  • 즉, 모든 candidate key의 원소 개수가 1이라면 2NF는 자동적으로 만족한다.
  • candidate key가 1개인 경우 항상 fully FD하고, partial FD가 없으므로
  • 단, 어떤 속성의 값이 모두 같은 경우 예외

Image

위에서 {empl_id} -> {empl_name, birth_date, position, salary, company}이고
{} -> {company}
{}(공집합)은 {empl_id}의 부분집합이므로 {company}{empl_id}partially FD임.
따라서 2NF를 만족하지 않음

비정규화

  • 정규화된 테이블을 정규화되지 않은 테이블로 변환하는 과정
  • DB의 과도한 조인중복 데이터 사이의 trade-off를 고려하여 비정규화 진행
  • 일반적으로 실무에서는 3NF 또는 BCNF까지 정규화 진행