정규화란?
나쁜 릴레이션
의 애트리뷰트들을 나눠 좋은 작은 릴레이션으로 분해하는 작업. 데이터의 중복을 제거해 데이터 무결성
을 유지하는 것
- 나쁜 릴레이션이란?
엔티티를 구성하고 있는 애트리뷰트 간에 함수적 종속성
을 판단한다. 각 정규형 마다 함수적 종속성이 존재하고 이를 만족하지 못하는 정규형을 나쁜 릴레이션이라 한다.
- 함수적 종속성
애트리뷰트 데이터들의 의미와 애트리뷰트들 간의 상호 관계로부터 유도되는 제약조건
X의 값이 Y의 값을 유일하게 결정한다면 "X는 Y를 함수적으로 결정한다"
- 데이터 무결성 : 여러 경로를 통해 잘못된 데이터가 발생하는 경우의 수를 방지하는 것
한 릴레이션에 여러 엔티티의 어트리뷰트들을 혼합하면 데이터가 중복될 수 있고, 저장공간의 낭비로 이어지게 된다. 또한 중복된 데이터의 갱신 이상
이 발생하게 된다.
- 갱신 이상
- 삽입 이상 : 원하지 않는 데이터의 삽입되는 문제
- 삭제 이상 : 하나의 자료만 삭제해야 하지만, 원하지 않는 데이터가 함께 삭제되는 문제
- 수정 이상 : 정확하지 않거나 일부 데이터만 수정되는 문제
정규형
제 1 정규형
테이블의 컬럼 값이 원자값 (하나의 값)을 갖도록 테이블을 분해하는 것
제 2 정규형
제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것.
- 완전 함수 종속
기본키의 부분 집합이 결정자가 되어선 안된다는 것
제 3 정규형
제 2 정규화를 진행한 테이블에 대해 이행적 종속을 제거하는 것
- 이행적 종속
A -> B -> C 가 성립될 때 A -> C 가 성립되는 것
BCNF(Boyce - Codd) 정규형
제 3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것.
정규화의 장점
- 데이터베이스 변경 시 이상현상 제거
- 데이터베이스 구조 확장 시 재 디자인 최소화. 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다. 이는 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되며 응용프로그램의 생명을 연장시킨다.
- 사용자에게 데이터 모델을 더욱 의미있게 제공. 정규화된 테이블들과 정규화된 테이블들간의 관계들은 현실 세계에서의 개념들과 그들간의 관계들을 반영한다.
반정규화
데이터베이스의 성능 향상을 위해, 데이터 중복을 허용하고 조인을 줄이는 방법
정규화를 통해 이상현상을 방지했지만 디스크 I/O량이 많아져 조회시 혹은 JOIN시 성능저하가 예상될 경우 반정규화를 진행하게 된다. 일반적으로 조회에 대한 처리 성능이 중요하다고 판단하면 부분적으로 반정규화를 고려해야 한다.
어떤것을 반정규화 해야할까?
- 자주 사용되는 테이블에 액세스하는 프로세스의 수가 가장 많고, 항상 일정범위만 탐색하는 경우
- 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우
- 테이블에 지나치게 조인을 많이 사용하는 경우
주의 점
반정규화는 정규화를 통해 얻은 데이터의 무결성을 깨는 것이다. 때문에 INSERT , DELETE, UPDATE시 성능저하가 발생할 수 있다는 점을 고려해야 한다.
References
https://mangkyu.tistory.com/110