[DATABASE] 정규화(Normalization)

seheo·2022년 7월 24일
0

Database

목록 보기
1/3
post-thumbnail

정규화란

테이블과 컬럼이 많은 DB일수록 모델링을 잘 못 하거나
내가 모델링한 DB가 좋은 DB인지 판단하기가 힘들어진다.
이 문제를 해결하기 위해 정규화 도입한다.

  • DB의 테이블이 잘 만들어 졌는지 평가하고, 잘 만들지 못한 테이블을 고쳐나가는 과정
  • 가장 큰 목표는 테이블 간 중복된 데이터를 허용하지 않는 것
  • 테이블을 정규형(normal form)이라고 불리는 형태에 부합하게 만든다.
  • 삽입, 수정, 삭제 성능을 향상 시킨다.
  • 조회 성능이 향상될 수도, 저하될 수도 있다.

정규화 목적

  • 데이터베이스에서 이상 현상을 없앨 수 있다 (3NF 테이블의 대부분이 이러한 이상현상을 방지)
  • 데이터의 중복을 없애고 불필요한 데이터를 최소화 한다
  • 새로운 종류의 데이터를 추가할 때 테이블 구조를 수정을 많이 하지 않아도 된다.

정규형(Normal Form)

  • 1NF(제1 정규형), 2NF(제2 정규형), 3NF(제3 정규형), BCNF(보이스/코드 정규형), 4NF(제4 정규형), 5NF(제5 정규형)
    • 더 많은 정규형들이 존재하지만 3NF 정도를 만족하면 대부분 잘 정규화된 데이터 베이스라고 평가하고 정규화되었다고 한다.
  • 순서에 따라 규칙이 누적
    • 2NF가 될려면 선행 조건으로 1NF를 만족해야한다.

함수 종속성(FD, Functional Dependency)

함수 종속이란 DB 릴레이션(relation)에서 두 개의 속성(attribute) 집한 간의 제약의 일종

  • table - R
  • R의 attribute - X, Y
    • X의 한 값이 Y에 속한 오직 하나의 값에만 사상(Mapping)
    • Y는 X에 함수적 종속적이다라고 한다.
    • 표기법 : X -> Y
    • X는 결정자 / Y는 종속자라고 한다.

완전 함수 종속(FFD, Full Functional Dependency)

  • 종속자가 기본키에만 종속
    • X(주민번호) -> Y1(이름)
    • X(주민번호) -> Y2(성별)
    • X(주민번호) -> Y3(주소)
  • "주민번호"에만 종속하는 완전 함수 종속 테이블

부분 함수 종속(Partial Functional Dependency)

  • 기본키가 복합키일 경우 기본키를 구성하는 속성 중 일부에게 종속

    기본키(복합키) : [이름, 성별]
    • X(이름, 성별) -> Y1(주소)
    • X(이름, 성별) -> Y2(지역번호)
  • 기본키 관계 이외의 관계
    • X(이름) -> Y(주소)의 관계가 성립
  • 기본키가 여러 속성으로 구성되어 있어 기본키를 구성하는 속성 중 일부에게 종속된 경우 부분 함수 종속 테이블

이행 함수 종속(Transitive Functional Dependecy)

  • attribute X, Y, Z가
    • X -> Y,   Y -> Z 종속 관계이면 X -> Z
    • X를 통해 Z를 알 수 있는 경우 이행 함수 종속
  • X(사원번호) -> Y(사원이름),    Y(사원이름) -> Z(주소, 전화번호, 직책....)
  • X를 알면 Y를 알고 Y를 통해 Z를 알 수 있는 경우 이행 함수 종속 테이블

나머지 함수 종속

BCNF ~ 5NF까지 종속되는 함수 종속성

  • 결정자 함수 종속(Boyce-codd Normalization)
  • 다중값 종속(Multi-Valued Dependency)
  • 조인(결합) 종속 (Adjoin Dependency)

정규화 과정

제1 정규형(1NF, FirstNormal Form)

1NF를 만족하지 못하면 관계형 데이터베이스(RDB, Relational Database)가 될 수 없다.

  • 릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성되어야함
  • 1NF를 만족해도 이상 현상이 발생한다
    • 부분 함속 종속을 제거해서 2NF로 만들어 이상 현상 줄임

제2 정규형(2NF, Second Normal Form)

"1NF를 만족" and "부분 함수 종속"을 제거 -> 완전 함수 종속된 정규형

  • 모든 속성이 기본키에 완전 함수 종속
  • 2NF를 만족해도 이상 현상 발생
    • 이행적 함수 종속을 제거해서 3NF로 만들어 이상 현상을 줄임

제3 정규형(3NF, Third Normal Form)

"1NF, 2NF"를 만족 and "이행 함수 종속" 제거

  • 모든 속성이 기본키에 이행적 함수 종속이 아님

마지막으로

  1. DB의 설계에서 중복을 최소화하고 이상현상을 방지하는 프로세스를 정규화라고 한다.
  2. 1NF ~ 6NF... 등 더 많은 정규형이 있지만 3NF가 되었으면 정규화 되었다고 한다.
  3. 일반적으로 3NF, BCNF에 속하도록 릴레이션을 분해하여 사용
  4. 높은 차수의 정규형으로 갈 수록 조건이 까다롭기 때문에 정규화하기 더 힘들지만 꼭 높은 차수의 속해야 바람직한 정규형이 아니다
  5. 정규화된 릴레이션은 원하는 자료가 여러 릴레이션에 나뉘어 있기 때문에 조회 시에 join을 해서 사용해야 한다.
  6. 조회 join시 일어나는 성능 저하 때문에 정규화를 한 릴레이션을 다시 합치는 반정규화를 하는 경우도 있다.

참고자료

0개의 댓글