정규화(Normalization)::데이터베이스

2020. 6. 26. 15:42computer science/database

1. 정규화 정의

 

 한 테이블에 여러 엔티티를 넣다 보면 중복된 정보로 인해 이상 현상이 발생하게 됩니다.

 이러한 문제를 해결하기 위해 정규화 과정을 거칩니다.

 

 즉, 관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업입니다.

 

 

2. 이상 현상(Anomaly)

 

삽입 이상(Insertion Anomaly) : 새 데이터를 삽입할 때, 불필요한 데이터를 함께 삽입해야 하는 현상

 

삭제 이상(Deletion Anomaly) : 튜플을 삭제할 때, 필요한 데이터까지 삭제되는 현상

 

갱신 이상(Modification Anomaly) : 반복된 데이터 중에 일부를 수정할 때, 데이터가 불일치되는 현상

 

 

3. 정규화 과정

 

 각 정규화 단계는 이전 정규화 단계를 만족해야 합니다.

ex) 제3 정규화를 만족하기 위해서는 제2 정규화, 제1 정규화를 만족하고, 이행적 함수 종속을 제거해야 한다.

 

제1 정규화(1NF) : 도메인이 오직 원자 값

 

 애트리뷰트의 도메인이 오직 원자 값만을 포함하고, 튜플의 모든 애트리뷰트가 도메인에 속하는 하나의 값을 가져야 합니다.

 즉, 복합 애트리뷰트, 다중 값 애트리뷰트, 중첩 릴레이션 등 비 원자적인 애트리뷰트들을 허용하지 않는 릴레이션 형태를 말합니다.

 

제2 정규화(2NF) : 부분 함수적 종속 제거

 

 모든 비주요 애트리뷰트들이 주요 애트리뷰트에 대해서 완전 함수적 종속(부분 함수적 종속 제거)을 만족해야 합니다.

 

 부분 함수적 종속이란 X(A) -> Z, Y(A, B) -> Z라고 가정했을 때, A만으로도 Z를 결정할 수 있습니다.

 (A, B) -> Z에서 Z는 Y에 대해서 부분적으로 함수 종속이 된다고 말할 수 있습니다.

 

 완전 함수적 종속이란 X(A, B) -> Y라고 가정했을 때, X의 어떠한 애트리뷰트(A 또는 B)라도 제거하면 더 이상 함수적 종속성이 성립하지 않는 경우를 말합니다.

 예를 들어 (A, B) -> C라고 한다면 A, B는 종속되어있지 않고, A만으로 C를 결정할 수 없고, B만으로도 C를 결정할 수 없는 상태입니다.

 

 즉, 키가 아닌 열들이 각각 후보키에 대해 결정되는 릴레이션 형태를 말한다.

 

제3 정규화(3NF) : 이행적 함수 종속 제거

 

 어떠한 비주요 애트리뷰트도 기본키에 대해서 이행적으로 종속되지 않아야 합니다.

 이행 함수적 종속이란 X -> Y, Y -> Z의 경우 추론될 수 있는 X -> Z 종속관계를 말합니다.

 즉, 비주요 애트리뷰트가 비주요 애트리뷰트에 의해 종속되지 않는 릴레이션 형태입니다.

 

Boyce-Codd Normal Function(BCNF) : 결정자면서 후보키가 아닌 것 제거

 

 결정자면서 후보키가 아닌 것을 제거한 것입니다.

 즉, 한 릴레이션 내 모든 결정자가 후보키가 되도록 합니다.

 

제4 정규화(4NF) : 다치 종속성 제거

 

 애트리뷰트가 원자 값이 아닌 여러 값을 가지고 있다면 릴레이션을 분해해 원자 값을 갖도록 합니다.

 

 다치 종속 : 여러 값을 가진 독립된 애트리뷰트가 1 : N로 대응하는 관계로 '↠'로 종속성을 표시합니다.

 

제5 정규화(5NF) : 조인 종속성 성립

 

 릴레이션의 모든 조인 종속성이 후보키를 통해서만 성립이 되도록 합니다.

 주어진 테이블보다 더 작은 테이블의 조인으로 재구성할 수 없는 경우를 말합니다.

 즉, 테이블을 분해하면 원래 가지고 있던 정보가 손실되어 더 이상 테이블을 분해할 수 없는 경우를 말합니다.

 

 단계가 높은 정규화일수록 데이터의 안정성을 높일 수 있지만, 여러 테이블을 사용하기 때문에 성능을 저하시킬 수 있습니다.

 보통의 경우 제3 정규화 또는 BCNF까지 만족한다면 정규화된 것으로 볼 수 있습니다.

 

 

4. 역정규화(Denormalization)

 

 정규화를 통해 분리되었던 릴레이션의 중복을 허용하고 다시 통합하거나 분할해 구조를 재조정하는 과정입니다.

 

 정규화는 릴레이션을 분해하기 때문에 원하는 자료가 하나의 릴레이션에 존재하지 않아 외래키를 사용해야 하는 상황이 발생합니다.

 이는 데이터베이스에 저장된 데이터 검색 시간을 증가시키기 때문에 성능을 저하시킬 수 있습니다.

 따라서 데이터베이스의 물리적 설계 과정에서 성능을 향상하는 역정규화를 실행합니다.

 

 역정규화의 종류로 릴레이션 역정규화, 속성 역정규화가 있습니다.

 

릴레이션 역정규화

 

 릴레이션의 역정규화에는 릴레이션을 병합하는 방법과 분할하는 방법이 있습니다.

 

릴레이션 병합

 두 릴레이션 간의 빈번한 참조로 성능이 저하되는 문제를 해결하기 위해 병합합니다.

 

릴레이션 분할

 데이터를 검색할 때, 릴레이션의 데이터 목록을 순차적으로 검색하게 되어 자주 사용하지 않는 속성이나 튜플이 있을 경우 성능을 저하시킵니다.

 

 따라서 자주 사용하는 속성이나 튜플을 분해하여 성능을 향상합니다.

 

    수직 분할 : 자주 사용하는 속성과 그렇지 않은 속성을 구분해서 분할하는 방법

    수평 분할 : 자주 사용하는 튜플과 그렇지 않은 튜플을 구분해서 분할하는 방법

 

속성 역정규화

 

 릴레이션의 성능을 향상하기 위해 속성 또는 파생 속성을 추가합니다.

 

파생 속성(Delivered Attribute): 현재 릴레이션에 없지만 작업의 효율을 위해 계산을 통해 추가한 속성입니다.