[데이터베이스] 정규화

Yoon Uk·2023년 8월 18일
0

데이터베이스

목록 보기
16/20
post-thumbnail

정규화(Normalization)란?

정규화(Normalization)란 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 말합니다.
정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것입니다.

정규화의 장점

정규화는 다음과 같은 장점을 가집니다.

  • 데이터의 무결성과 일관성을 유지할 수 있습니다.
  • 데이터의 삽입, 삭제, 갱신 이상을 방지할 수 있습니다.
  • 데이터베이스의 저장 공간을 절약할 수 있습니다.
  • 쿼리의 성능을 향상시킬 수 있습니다.

정규화의 단계

정규화에는 여러 단계가 있으며, 각 단계마다 특정한 조건을 만족해야 합니다. 일반적으로 사용되는 정규화 단계는 다음과 같습니다.

  • 제 1정규화
    테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것입니다.

  • 제 2정규화
    제1정규화를 진행한 테이블에 대해 완전 함수 종속(Full Functional Dependency)을 만족하도록 테이블을 분해하는 것입니다. 완전 함수 종속이란 기본키의 부분집합이 결정자가 되어서는 안된다는 것을 의미합니다.

  • 제 3정규화
    제2정규화를 진행한 테이블에 대해 이행적 종속(Transitive Dependency)을 없애도록 테이블을 분해하는 것입니다. 이행적 종속이란 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미합니다.

  • BCNF 정규화
    제3정규화를 진행한 테이블에 대해 모든 결정자가 후보키(Candidate Key)가 되도록 테이블을 분해하는 것입니다.

제 1 정규형

제 1 정규형이란, 데이터베이스에서 테이블의 속성들이 원자값을 가지고 있고, 기본키에 완전히 종속되는 정규형입니다.
제 1 정규형을 만족하려면, 테이블의 모든 속성들이 하나의 값을 가지고 있어야 하며, 속성들의 순서나 반복되는 값이 없어야 합니다.

예를 들어, 학생 테이블에서 학생의 이름과 수강한 과목들을 저장하고 싶다면, 과목들을 하나의 속성으로 묶어서 저장하는 것은 제 1 정규형을 위반하는 것입니다. 왜냐하면 과목들은 여러 개의 값을 가지고 있고, 기본키인 학생 이름에 완전히 종속되지 않기 때문입니다.

따라서, 제 1 정규형을 만족하기 위해서는 과목들을 별도의 테이블로 분리하고, 학생 이름과 과목 이름을 기본키로 사용하는 것이 좋습니다. 이렇게 하면, 테이블의 속성들이 원자값을 가지고 있고, 기본키에 완전히 종속되므로 제 1 정규형을 만족하게 됩니다.

제 2 정규형

제 2 정규형은 제 1 정규형을 만족하면서, 부분 함수 종속성을 제거한 테이블의 형태를 말합니다.

부분 함수 종속성이란 기본키가 여러 개의 속성으로 구성되어 있을 때, 기본키의 일부 속성에만 의존하는 다른 속성이 존재하는 경우를 말합니다. 이런 경우에는 데이터의 중복과 불일치가 발생할 수 있습니다.

예를 들어, 학생-과목 테이블에서 학번, 과목명, 성적, 학과, 지도교수가 있다고 가정해 봅시다. 이 테이블의 기본키는 학번과 과목명입니다. 그런데, 학과와 지도교수는 학번에만 의존하고 과목명과는 관련이 없습니다. 즉, 부분 함수 종속성이 존재합니다. 이렇게 되면 같은 학생의 학과와 지도교수가 여러 번 반복되어 저장될 수 있고, 데이터의 크기가 증가하며 수정 시에도 불일치가 발생할 수 있습니다.

따라서 제 2 정규형을 만족하기 위해서는 이러한 부분 함수 종속성을 제거해야 합니다. 방법은 기본키를 분리하여 새로운 테이블을 생성하는 것입니다. 위의 예에서는 학번, 학과, 지도교수를 가진 테이블과 학번, 과목명, 성적을 가진 테이블로 나눌 수 있습니다. 이렇게 하면 데이터의 중복과 불일치를 줄일 수 있습니다.

제 3 정규형

제 3 정규형은 제 2 정규형을 만족하면서, 테이블의 모든 속성이 기본키에만 의존하고 다른 속성에는 의존하지 않는 형태를 말합니다. 제 3 정규형을 적용하면 데이터의 중복과 이상 현상을 줄일 수 있습니다.

예를 들어, 다음과 같은 테이블이 있다고 가정해봅시다.

학번이름학과학과장
1001김철수컴퓨터공학이영희
1002박영희컴퓨터공학이영희
1003최민수수학김철수

이 테이블은 제 2 정규형을 만족합니다. 왜냐하면 기본키인 학번에 의해 모든 속성이 결정되기 때문입니다. 하지만 이 테이블은 제 3 정규형을 만족하지 않습니다. 왜냐하면 학과장 속성이 학과 속성에 의존하기 때문입니다.
즉, 학과가 같으면 학과장도 같다는 것을 알 수 있습니다. 이렇게 되면 데이터의 중복과 이상 현상이 발생할 수 있습니다.

예를 들어, 컴퓨터공학 학과의 학과장이 바뀌면 테이블의 여러 행을 수정해야 하고, 그 과정에서 실수나 누락이 발생할 수 있습니다.

따라서 이 테이블을 제 3 정규형으로 만들기 위해서는 학과장 속성을 분리하여 다른 테이블로 만들어야 합니다. 예를 들어, 다음과 같이 두 개의 테이블로 나눌 수 있습니다.

학번이름학과
1001김철수컴퓨터공학
1002박영희컴퓨터공학
1003최민수수학
학과학과장
컴퓨터공학이영희
수학김철수

이렇게 하면 테이블의 모든 속성이 기본키에만 의존하고 다른 속성에는 의존하지 않으므로 제 3 정규형을 만족합니다. 또한 데이터의 중복과 이상 현상을 방지할 수 있습니다.

BCNF 정규형

BCNF 정규형이란 Boyce-Codd Normal Form의 약자로 제 3정규형보다 더 강력한 조건을 만족해야 합니다. 바로, 모든 결정자가 후보키의 일부가 되는 것입니다. 결정자란 다른 속성을 유일하게 결정하는 속성의 집합을 말합니다. 후보키란 테이블에서 각 행을 식별할 수 있는 최소한의 속성의 집합을 말합니다.

예를 들어, 학생-과목 테이블이 있다고 가정해봅시다. 이 테이블은 학번, 이름, 과목코드, 과목명, 성적으로 구성되어 있습니다. 이 때, 학번과 과목코드가 후보키가 됩니다. 왜냐하면 이 두 속성만으로도 테이블의 각 행을 구분할 수 있기 때문입니다. 그러나 이 테이블은 BCNF 정규형을 만족하지 않습니다. 왜냐하면 이름과 과목명이 결정자인데, 후보키의 일부가 아니기 때문입니다. 즉, 이름으로 학번을 알 수 있고, 과목명으로 과목코드를 알 수 있습니다.

이런 경우에는 BCNF 정규형을 만족하기 위해 테이블을 분리해야 합니다. 즉, 학생 테이블(학번, 이름)과 과목 테이블(과목코드, 과목명)과 성적 테이블(학번, 과목코드, 성적)으로 나누는 것입니다. 이렇게 하면 각 테이블에서 결정자가 모두 후보키의 일부가 되므로 BCNF 정규형을 만족하게 됩니다.

BCNF 정규형을 적용하면 데이터베이스의 성능과 관리가 향상됩니다. 중복된 데이터를 줄여서 저장공간을 절약하고, 데이터의 일관성과 정확성을 유지할 수 있습니다. 또한 삽입, 삭제, 갱신 시 발생할 수 있는 이상 현상(anomaly)을 방지할 수 있습니다.

반정규화

반정규화란 데이터베이스의 성능을 향상시키기 위해 정규화된 테이블을 다시 합치거나 중복되는 데이터를 추가하는 과정입니다.

반정규화는 정규화의 장점인 데이터의 일관성과 무결성을 포기하고, 대신 데이터의 조회 속도와 처리 효율을 높이는 것을 목적으로 합니다.
반정규화를 적용하기 전에는 정규화를 완벽하게 수행해야 하며, 반정규화를 적용할 테이블과 컬럼을 신중하게 선택해야 합니다.

반정규화 방법

반정규화의 방법에는 테이블 통합, 테이블 분할, 중복 테이블 추가, 중복 컬럼 추가, 계산 컬럼 추가 등이 있습니다.

테이블 대상 반정규화

  • 테이블 통합
    • 1:1 관계 테이블 병합 : 1:1 관계를 통합하여 성능향상
    • 1:M 관계 테이블 병합 : 1:M 관계를 통합하여 성능향상
    • 슈퍼/서브타입 테이블병합 : 슈퍼/서브 관계를 통합하여 성능향상
  • 테이블 분할
    • 수직분할 : 하나의 테이블의 속성을 분할하여 두 개 이상의 테이블로 분할
    • 수평분할 : 하나의 테이블에 있는 값을 기준으로 테이블을 분할
  • 테이블 추가
    • 중복 테이블 추가 : 동일한 테이블 구조를 중복하여 원격조인을 제거
    • 통계 테이블 추가 : SUM, AVG 등을 미리 수행하여 계산
    • 이력 테이블 추가 : 마스터 테이블에서 자주 조회되는 레코드를 중복하여 테이블 추가
    • 부분 테이블 추가 : 자주 이용하는 칼럼을 모아놓은 별도의 테이블 추가

칼럼 대상 반정규화

  • 중복 칼럼 추가

    • 조인 감소를 위해 중복된 칼럼을 추가
    • 갱신보다 조회 성능이 더 중요할 때 양쪽 테이블에 중복 저장
    • join 비용은 감소하나, 갱신 비용이 증가함
  • 계산 컬럼 추가

    • 여러 테이블 join 후 계산이 필요한 경우 계산 결과 컬럼 추가
    • join 비용은 감소하나, 갱신 비용이 증가함

2개의 댓글

comment-user-thumbnail
2023년 8월 18일

좋은 글 감사합니다. 자주 방문할게요 :)

1개의 답글