본문 바로가기

Back-End 공부/Database

[Database] 정규화란? 정규화 예시(1NF, 2NF, 3NF, BCNF)

📌 정규화

도부이결다조

 

 

 

 함수적 종속성

  • f(x)=y
  • 함수적 종속이라는 표현은 수학의 함수에서 유래
  • y는 x의 값에 의해 결정되는 관계로서, y는 x에 종속적이고, 이를 수학적인 표현에서는 y는 x에 함수종속적이다 라고 표현
  • 정규화 관련해서 빈번히 사용되는 표현으로서, a가 b에 함수종속적이다 하면 b의 값에 의해 a가 결정됨을 의미
    • 예시)
    • 학번과 학부
      • 학번 -> 학부
      • 즉, 학번에 따라 학부가 결정되므로, 학부는 학번에 함수 종속적
    • 등록금과 학부
      • 학부 -> 등록금
      • 학부에 따라 등록금이 결정되므로, 등록금은 학부에 함수 종속적

 

 

정규화 적용 전 테이블 모습

 

 

1차 정규화(메인 분해)

  • 모든 열의 값이 원자적이어야 함. 즉, 각 열에는 하나의 값만 있어야 함을 의미
  • 하나의 컬럼에 여러 원자값이 존재시, 조회조건을 통한 조회 어려움 발생
    • 수정/삭제가 발생할때 특정 데이터를 찾아 수정/삭제의 어려움
    • FK 및 index 지정이 불가능함
  • 즉, 1차 정규화는 여러 원자값의 컬럼을 쪼개는 과정

 

-> STUDENT_ID, COURSE_ID 다중 컬럼 키여야 유일하게 구별 가능

 

 

 

2차 정규화(분종속 제거)

  • 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속된 상태를 의미
  • 복합키로 이루어진 기본키 중에 특정 키에도 종속적이면 2차 정규화가 안된 상황
  • 2차 정규화를 위한 방법
    • 기본키가 아닌 키에 부분적으로 종속돼 있는 특정 컬럼값을 제거
    • 기본키에 종속적이지 않다면 해당 테이블에 어울리지 않는 컬럼이라는 생각 필요
    • 사실상 해당 테이블에 어울리지 않는 컬럼 분리 작업
  • 불필요한 컬럼을 제거하면 공간 효율적

키워드 : 복합키(다중 컬럼 키)

STUDENT_ID에 종속적인 다른 컬럼(STUDENT_NM, DEPARTMENT, FEES)이 존재

= STDENT_ID만 있으면 STUDENT_NM, DEPARTMENT, FEES 값 확인이 가능하다

-> 다른 테이블로 분리 -> 분리될 때 PK키 하나를 가져감

 

ex)

STUDENT_NM은 STUDENT_ID 정보만 있어도 조회할 수 있음

= 학생 이름은 학번이 있으면 조회 가능 => 분리 대상

 

GRADE는 STUDENT_ID 혹은 COURSE_ID 중 하나만 있으면 확인할 수 없음

= 성적은 학생 이름만 알고 있으면 조회 불가능, 과목명만 알고 있어도 조회 불가능 => 분리 비대상

= ( STUDENT_ID, STUDENT_ID ) 복합키에 의해서만 구분됨

 

2차 정규화를 마치고, 학생 수가 늘어나면 DEPARTMENT와 FEES에 엄청난 중복이 발생됨 -> 중복 제거해야 함!

 

 

 

 

 3차 정규화(행종속(transitive depency)제거)

    • X ->Y 이고 Y->Z 이면 X->Z 가 성립. Z가 X에 이행적으로 함수 종속
    • 모든 속성이 기본키에 이행적 함수 종속이 되지 않아야 함
    • 즉, 이행종속이 되는 부분종속을 제거해야 하는 특성상, 부분종속과 구분 이 어려운 부분
    • 만약 학번이 PK. pk -> 학부, 학부 -> fees. 즉, pk -> fees가 되어 fees가 pk에 이행종속적

키워드 : PK를 제외한 컬럼들이 자기들끼리 의존관계

-> 다른 테이블로 분리 -> 분리될 때 PK키 하나를 가져가지 않고 컬럼들만 떼감 (기본키와 종속 관계가 없기 떄문)

 

 

 

 

BCNF 정규화 (정자이면서 후보키가 아닌 것 제거)

  • 결정자이면서 후보키가 아닌 것 제거
  • 후보키 집합에 속하지 않은 결정자가 존재하면 BCNF 위반
  • 후보키란 테이블 내에 유일성을 가질 수 있는 key 중 하나
  • BCNF(Boyce and Code Normal Form)은 제 3 정규형을 조금 더 강화시킨 개념

 

과목별담당교수는 후보키가 아닌데 과목명을 결정짓는 결정자다

= 학생수강관련정보 테이블에서 담당교수가 맡는 과목명이 바뀌면 수강생 수만큼 과목명이 다 변경된다

갱신에 있어서 문제가 발생할 수도 있음 => 분리

 

BCNF 정규화로 우측 두 테이블로 나눌 경우, 담당교수의 과목명이 바뀌어도 학생에게 영향을 주지 않는다.

 

 

 

4차 정규화 (치 종속 제거)

 

하나의 릴레이션에서 여러 속성과의 관계가 1:N 관계인 경우

-> 학생이 과목과도 1:N이고, 동호회화도 1:N인 경우 분리

 

 

 

 5차 정규화 (인 종속 제거)

 

- 하나의 릴레이션을 여러 개의 릴레이션으로 분해하였다가, 다시 조인했을 때 데이터 손실이 없고 필요없는 데이터가 생기는 것

- 하나의 컬럼이 두 개 이상의 컬럼에 종속적일 경우 발생하는 문제

  • 만약 홍길동이 C언어를 택하게 되면 무조건 야구부도 가입이 된다면?
  • 학생+과목이 프레임워크를 결정짓는 raw 데이터가 있다면 다치종속을 제거하더라도 조인종속성 이슈 발생
  • 이 경우, 과목, 프레임워크 테이블을 하나 더 만들어 3테이블 조인 필요

 

 

학생+과목, 프레임워크+학생 2개의 테이블을 다시 JOIN하게되면 분해 전 결과와 다르다. => 조인 종속성 위반

 

 

과목, 프레임워크 테이블을 하나 더 만들어 3테이블 조인을 해야 동일한 결과가 나온다