본문 바로가기
정보처리기사

[정보처리기사] - 정규화 / 반정규화

by Laplace 2024. 7. 13.

정규화와 반정규화를 알아보기 앞서 이상과 함수적 종속에 대해 알아보자.

 

이상 (Anomaly)

- 이상이란 테이블에서 일부 속성들의 종속으로 인해 데이터의 중복이 발생하고, 그로인해 테이블 조작시 문제가 발생하는 현상이다.

- 이상의 종류로는 테이블 조작 중에 발생하는 삽입 이상, 삭제 이상, 갱신 이상 이렇게 있다.

 

삽입 이상 (Insertion Anomaly)

- 테이블에 데이터를 삽입할 때 의도와는 상관없이 원하지 않은 값들로 인해 삽입할 수 없게 되는 현상.

 

삭제 이상 (Delete Anomaly)

- 테이블에서 한 튜플을 삭제할 때 의도와는 상관없는 값들도 함께 삭제되는 현상.

 

갱신 이상 (Update Anomaly)

- 테이블에서 튜플에 있는 속성 값을 갱신할 때 일부 튜플의 정보만 갱신되어 정보에 불일치성이 생기는 현상

 

함수적 종속 (Functional Dependency)

- 어떤 테이블 R에서 속성 X와 Y가 있다고 할때, 속성 X의 값 각각에 대해 시간에 관계없이 항상 속성 Y의 값이 오직 하나만 연관되어 있을     때 Y는 X에 함수적 종속 또는 X가 Y를 함수적으로 결정한다고 하고, X -> Y 로 표기한다.

ex) 학번 -> 이름, 학번 -> 학년, 학번-> 학과, 학번 -> 이름, 학년, 학과  : 이름, 학년, 학과는 각각 학번 속성에 함수적 종속이다.

- X -> Y 일때,  X를 결정자 Y를 종속자라고 한다.

 

완전 / 부분 함수적 종속

- 완전 함수적 종속이라는 말은 어떤 속성이 기본키에 대해 완전히 종속적일 때를 말합니다.

ex) <수강>테이블은 (학번, 과목번호)가 기본키인데, 성적은 학번과 과목번호가 같을 경우에만 결정되므로 성적은 기본키(학번, 과목번호)에 완전 함수적 종속이 되는 것입니다. 반면에 학년은 기본키의 일부인 학번에 의해서 학년이 결정되므로 학년은 기본키에 부분 함수적 종속이 되는 것입니다.

 

이행적 함수적 종속

- X -> Y 이고 Y -> Z 일 때 X -> Z 를 만족하는 관계를 이행적 함수적 종속이라고 합니다. 

 

 

정규화 (Normalization)

- 정규화는 테이블의 속성들이 상호 종속적인 관계를 갖는 특성을 이용하여 테이블을 무손실 분해하는 과정이다.

- 정규화의 목적으로는 가능한 한 중복을 제거하여 삽입, 삭제, 갱신 이상의 발생 가능성을 줄이는 것이다.

- 정규형에는 제 1정규형, 제 2정규형, 제 3정규형, BCNF, 제 4정규형, 제 5정규형이 있으며, 순서대로 정규화의 정도가 높아진다.

 

제 1정규형 (1NF)

- 테이블의 모든 속성 값이 원자 값으로만 되어 있는 정규형.

 

제 2정규형 (2NF)

- 테이블이 제 1정규형이고, 기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족하는 정규형.

- 부분적 함수 종속 제거.

 

제 3정규형 (3NF)

- 테이블이 제 2정규형이고, 기본키가 아닌 모든 속성이 기본키에 대해 이행적 함수적 종속을 만족하지 않는 정규형.

- 이행적 함수 종속 제거.

 

BCNF

- 테이블에서 모든 결정자가 후보키인 정규형.

- 결정자이면서 후보키가 아닌 것 제거.

 

제 4정규형 (4NF)

- 다치 종속 제거

 

제 5정규형 (5NF)

- 모든 조인 종속이 테이블의 후보키를 통해서만 성립되는 정규형.

- 조인 종속성 이용

 

 

반정규화 (Denormalization)

- 반정규화는 시스템의 성능을 향샹하고 개발 및 운영의 편의성 등을 높이기 위해 정규화된 데이터 모델을 의도적으로 통합, 중복, 분리하여 정규화 원칙을 위배하는 행위이다.

- 반정규화를 수행하면 시스템의 성능이 향상되고 관리 효율성은 증가하지만 데이터의 일관성 및 정합성이 저하될 수 있다.

- 과도한 반정규화는 오히려 성능을 저하시킬 수 있다.

 

반정규화의 방법

- 테이블 통합

- 테이블 분할

- 중복 테이블 추가

- 중복 속성 추가

 

테이블 통합

- 두 개의 테이블이 조인되어 사용되는 경우가 많을 경우 성능 향상을 위해 아예 하나의 테이블로 만들어 사용하는 것.

- 두 개의 테이블에서 발생하는 프로세스가 동일하게 자주 처리되거나 항상 두 개의 테이블을 이용하여 조회하는 경우.

- 1:1 관계 테이블 통합, 1:N 관계 테이블 통합, 슈퍼타입(상위개체) / 서브타입(하위개체) 테이블 통합

 

테이블 분할

- 테이블을 수직 또는 수평으로 분할하는 것

- 수평 분할 : 레코드를 기준으로 테이블을 분할, 레코드별로 사용 빈도의 차이가 큰 경우 빈도에 따라 테이블을 분할

- 수직 분할 : 속성이 너무 많을 경우 속성을 기준으로 테이블을 분할

 

중복 테이블 추가

- 여러 테이블에서 데이터를 추출해서 사용하는 경우나, 다른 서버에 저장된 테이블을 이용해야 하는 경우.

- 집계 테이블 추가, 진행 테이블 추가, 특정 부분만을 포함하는 테이블 추가

 

중복 속성 추가

- 조인해서 데이터를 처리할 때 데이터를 조회하는 경로를 단축하기 위해 자주 사용하는 속성을 하나 더 추가하는 것.

- 중복 속성을 추가하면 데이터의 무결성 확보가 어렵고, 디스크 공간이 추가로 필요함.

- 조인이 자주 발생하는 경우, 접근 경로가 복잡한 경우.