[MySQL] 데이터베이스 정규화

2025. 12. 27. 21:36·Programming/SQL(DB)
728x90

이상현상(Anomaly)

  • 불필요한 데이터 중복이 발생하여 릴레이션에 대한 데이터의 삽입, 수정, 삭제 연산을 수행할 때 발생하는 부작용
  • 삽입 이상(insertion anomaly)
    • 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야하는 문제
  • 갱신 이상(update anomaly)
    • 중복 튜플 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제
  • 삭제 이상(deletion anomaly)
    • 튜플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제

 

정규화

  • 이상 현상의 원인
    • 관련 없는 속성들을 하나의 릴레이션에 모아두고 있기 때문이다.
  • 정규화(normalization)
    • 릴레이션을 관련 있는 속성들로만 구성되도록 릴레이션을 분해(decomposition)하는 과정이다.
    • 함수적 종속성으로 속성들 간의 관련성을 판단한다.

 

함수적 종속성

  • 릴레이션을 구성하는 속성들의 부분 집합을 X와 Y라고 할 때, 릴레이션 내의 모든 튜플에서 X 값에 대한 Y값이 항상 하나면 X가 Y를 함수적으로 결정한다(Y가 X에 함수적으로 종속되어 있다) 라고 한다.
  • 속성 자체의 특성과 의미를 기반으로 함수적 종속성을 판단해야 한다.
    • 속성 값은 계속 변할 수 있으므로 현재 릴레이션에 포함된 속성 값만으로 판단하면 안된다.
  • 일반적으로 튜플을 유일하게 구별하는 기본키와 후보키는 그 특성 때문에 릴레이션을 구성하는 다른 모든 속성들을 함수적으로 결정한다.
  • 기본키나 후보키나 아니더라도 속성 Y 값을 유일하게 결정하는 속성 X는 함수 종속 관계에서 모두 결정자가 될 수 있다.

완전 함수 종속(Full Functional Dependency)

  • 릴레이션에서 속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만, 속성 집합 X 전체에 종속된 것이지 일부분에 종속된 것이 아님을 의미한다.

 

부분 함수 종속성(Partial Functional Dependency)

  • 속성 집합 Y가 속성 집합 X의 전체가 아닌 일부분에도 함수적으로 종속됨을 의미한다.
  • 부분 함수 종속 관계가 성립하려면 결정자가 여러 개의 속성들로 구성되어 있어야 한다.

 

이행 함수적 종속성(Transitive FD)

  • 릴레이션을 구성하는 3개의 속성 집합 X, Y, Z에 대해 함수 종속 관계 X → Y와 Y → Z가 존재하면 논리적으로 X → Z가 성립한다.
  • 이때 속성 집합 Z가 속성 집합 X에 이행적으로 함수 종속되었다고 한다.

 

고려할 필요가 없는 함수적 종속 관계

  • 결정자와 종속자가 같거나, 결정자가 종속자를 포함하는 것처럼 당연한 함수 종속 관계는 고려하지 않는다.

정규화

  • 함수적 종속성을 이용해 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해해서 이상 현상이 발생하지 않는 올바른 릴레이션으로 만들어 가는 과정
  • 정규화를 통해 릴레이션은 무손실 분해되어야 한다.
    • 릴레이션이 의미상 동등한 릴레이션들로 분해되어야 하고, 분해로 인한 정보 손실이 발생하지 않아야 한다.
    • 분해된 릴레이션들을 자연 조인하면 분해 전의 릴레이션으로 복원 가능해야 한다.

 

제1정규형(1NF, First Normal Form)

  • 릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성되어 있으면 제 1 정규형에 속한다.
  • 방법1: 반복 그룹 속성에 나타나는 집합에 속한 각 값마다 하나의 튜플로 표현한다.
  • 방법2: 모든 반복 그룹 속성들을 분리해서 새로운 릴레이션에 넣는다. 원래 릴레이션의 기본 키를 새로운 릴레이션에 속성을 추가한다.

 

제2정규형(2NF)

  • 릴레이션이 제 1정규형에 속하고 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2정규형에 속한다.
  • 기본키가 두 개 이상의 속성으로 구성된 경우에만 1NF가 2NF를 만족하는지 고려할 필요가 있다.
  • 기본키가 한 개의 속성으로 이루어진 릴레이션이 1NF이면 2NF도 만족한다.
  • 기본키가 아닌 속성들 중에서 기본키 전체가 아닌 부분함수 종속을 제거하고 모든 속성이 기본키에 완전 함수 종속되도록 릴레이션을 분해하는 정규화 과정을 거쳐야한다.

 

제3정규형(3NF)

  • 릴레이션이 제 2정규형에 속하고 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 제 3정규형에 속한다.
  • 기본키가 아닌 속성들 중에서 기본키에 직접 종속되지 않고 이행적으로 종속하는 속성을 찾아 제거하는 과정

 

보이스/코드 정규형(BCNF)

  • 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키이면 보이스/코드 정규형에 속한다.
  • 릴레이션 R이 3NF이고, 모든 결정자가 후보 키이어야한다.
  • 후보키가 아닌 결정자를 제거하는 과정이다.
  • 후보키가 아니면서 결정자 역할을 하는 속성과 그 결정자에 함수적으로 종속하는 속성(종속자)를 하나의 릴레이션에 넣는다.
    • 이 렐레이션에서 결정자는 기본 키가 된다.
    • 기존 릴레이션에 결정자를 남겨서 기본키의 구성요소가 되도록 하며 또한 이 결정자는 새로운 릴레이션에 대한 외래키 역할도 한다.
728x90
저작자표시 (새창열림)

'Programming > SQL(DB)' 카테고리의 다른 글

[MySQL] 데이터베이스 물리적 설계  (0) 2025.12.27
[MySQL] 데이터베이스 설계(개념적 설계, 논리적 설계)  (0) 2025.12.26
[MySQL] 데이터 모델링  (1) 2025.12.26
[MySQL] 프로그래머스 서울에 위치한 식당 목록 출력하기  (0) 2025.02.13
[MySQL] 프로그래머스 평균 일일 대여 요금 구하기  (0) 2025.02.11
'Programming/SQL(DB)' 카테고리의 다른 글
  • [MySQL] 데이터베이스 물리적 설계
  • [MySQL] 데이터베이스 설계(개념적 설계, 논리적 설계)
  • [MySQL] 데이터 모델링
  • [MySQL] 프로그래머스 서울에 위치한 식당 목록 출력하기
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (278)
      • Programming (47)
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (3)
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (1)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (5)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    비트마스킹
    c언어
    구현
    깊이우선탐색
    우선순위 큐
    Leviathan
    백준
    DFS
    이분탐색
    에라토스테네스의 체
    정렬
    트리
    linux
    다익스트라
    그래프 이론
    투포인터
    DP
    Bandit
    시뮬레이션
    누적합
    백트래킹
    브루트포스
    코딩
    그리디
    우선순위큐
    wargame
    다이나믹 프로그래밍
    WebSecurity
    BFS
    재귀
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[MySQL] 데이터베이스 정규화
상단으로

티스토리툴바