# 정규화

# 정규화란?

릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어났을 때 이를 해결하거나, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정입니다.

이상 현상

  • 갱신 이상(Update Anomaly)
    • 튜플 갱신 시 중복된 데이터의 일부만 갱신되어 일어나는 데이터 불일치 현상
  • 삭제 이상(Deletion Anomaly)
    • 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
  • 삽입 이상(Insertion Anomaly)
    • 데이터를 삽입해야 하는데 하나의 필드 값이 null이 되면 안 되어서 삽입하기 어려운 현상 :::

# 정규형 원칙

  • 정보의 무손실 표현, 하나의 스키마를 다른 스키마로 변환할 때 정보의 손실이 있어서는 안됩니다.
  • 자료의 중복성을 감소해야 합니다.
  • 독립적인 관계는 별개의 릴레이션으로 표현해야 하고, 각각의 릴레이션은 독립적인 표현이 가능해야 합니다.

# 정규화의 장점

  • 데이터베이스 변경 시 이상 현상을 제거할 수 있습니다.
  • 불필요한 쿼리(서브 쿼리) 제거로 성능이 향상 될 수 있습니다.
  • 올바른 데이터만 얻을 수 있습니다.(변칙 방지)

# 정규화의 단점

  • 릴레이션 간의 연산(JOIN 연산)이 많아져서 응답시간이 느려질 수도 있습니다.

# 제 1정규형

정의

릴레이션의 모든 도메인이 더 이상 분해될 수 없는 원자 값(atomic value)만으로 구성된 상태

릴레이션의 속성 값 중에서 한개의 기본키에 대해 두 개 이상의 값을 가지는 반복 집합이 있으면 이를 제거해 줘야 합니다.

  • 예시
    1정규화

# 제 2정규형

정의

릴레이션이 제1정규형이며 부분 함수의 종속성이 없는 상태

부분 함수의 종속성 제거

기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인 것.
기본키의 부분집합이 결정자가 되어선 안된다는 말과 같다.

  • 예시1
    2정규화_1
    기본키는 {유저ID, 수강명}인데, 유저번호는 유저ID에만 종속되어서 따로 릴레이션을 분리해야 합니다.
  • 예시2
    2정규화_2
    2정규화_3
    기본키는 {학생번호, 과목}인데, 지도교수 칼럼은 과목에만 종속되는 부분적 종속이여서 두 릴레이션으로 분리해야 합니다.

# 제 3정규형

정의

제2 정규형이고 기본키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않는 상태

이행적 함수 종속

A->B, B->C일 때 A->C가 성립한다면 C가 A에 이행적으로 함수 종속이 되었다고 합니다.

  • 예시
    3정규형_1
    ID를 알면 등급을 알 수 있고, 등급을 알면 할일율을 알 수 있습니다. 따라서 ID를 알면 할인율을 알 수 있어 제 3정규형을 만족하지 않습니다.
    3정규형_2
    따라서 위와 같이 두 릴레이션으로 분할해줘야 합니다.

# BCNF(Boyce-Codd Normal Form)

정의

제3 정규형이고, 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태

용어

결정자 : 함수 종속 관계에서 특정 종속자를 결정짓는 요소, 'X->Y'일 때 X는 결정자, Y는 종속자입니다.

  • 예시 : 학생이 어떤 교수의 수업을 듣는 지를 나타내는 릴레이션
    BCNF_1
    {학생번호, 과목}이 기본키로 지도교수를 알 수 있습니다. 하지만 같은 과목을 다른 교수가 가르칠 수도 있어 과목 -> 지도교수 종속은 성립하지 않습니다. 대신, 지도교수->과목 종속은 성립됩니다.이처럼 후보키가 아닌 컬럼이 결정자가 되어버리면 BCNF를 만족하지 못합니다.
    BCNF_2
    이렇게 학생번호-지도교수, 지도교수-과목 두개의 릴레이션으로 분할하면 BCNF를 만족하게 됩니다.

# 제 4정규형, 제 5정규형

정규화를 많이 진행하면 단점이 나타날 수도 있어 보통 BCNF까지만 정규화를 진행합니다.

제 4정규형

BCNF를 만족하고, 다치 종속 A ↠ B 가 성립하는 경우 릴레이션의 모든 속성이 A에 함수적 종속 관계를 만족하는 상태

다치종속

두개의 독립된 속성이 1:N 관계로 대응하는 관계

제 5정규형

릴레이션의 모든 조인 종속이 릴레이션의 후보키를 통해서만 성립되는 상태

조인 종속성

릴레이션 스키마의 모든 올바른 릴레이션 상태가 분해될 때, 비부가적 조인 분해, 무손실 분해를 가져야 함을 나타냅니다.

# 반정규화 (비정규화)

시스템의 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정입니다.
의도적으로 정규화 원칙을 위배하는 행위라고 생각할 수 있습니다.

  • 테이블 통합
    • 두 개의 테이블이 조인(Join)되는 경우가 많아 하나의 테이블로 합쳐 사용하는 것이 성능 향상에 도움을 줄 때 수행합니다.
  • 테이블 분할
    • 수평 분할
      • 레코드를 기준으로 테이블을 분할하는 방식입니다.
      • 레코드별로 사용 빈도의 차이가 큰 경우 사용 빈도에 따라 테이블을 분할합니다.
    • 수직 분할
      • 하나의 테이블에 속성이 너무 많은 경우 속성을 기준으로 테이블을 분할하는 방식입니다.
      • 데이터 갱신이 자주 일어나는 속성들이 있는 경우 사용합니다.
      • 자주 조회되는 속성이 극히 일부일 경우 이를 분할하여 사용합니다.
      • 이미지나 2GB 이상 저장될 수 있는 텍스트 형식 등으로 된 속성들을 분할하여 사용합니다.
      • 특정 속성에 대해 보안을 적용해야 하는 경우 사용합니다.
  • 중복 테이블 추가
    • 여러 테이블에서 데이터를 추출해서 사용해야 하거나 다른 서버에 저장된 테이블을 이용해야 하는 경우 중복 테이블을 추가하여 작업의 효율성을 향상시킬 수 있습니다.
  • 중복 속성 추가
    • 조인해서 데이터를 처리할 때 데이터를 조회하는 경로를 단축하기 위해 자주 사용하는 속성을 하나 더 추가하는 것입니다.

# 참고자료