정규화 (Normalization)
- 이상 현상이 있는 릴레이션을 분해하여 이상 현상을 없애는 과정
- 즉, 테이블 간에 중복된 데이터를 허용하지 않는다는 것
- 중복된 데이터 허용 X -> 무결성 유지, DB 용량 감소
장단점
장점
- DB 변경 시 이상 현상 제거 가능
- 정규화된 DB 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 구조 변경하지 않아도 되거나 일부만 변경해도 됨
- DB에 연동된 응용 프로그램에 최소한의 영향만을 미침 -> 응용프로그램 생명 연장
단점
- 릴레이션 분해 -> 릴레이션 수 증가 -> JOIN 연산 많아짐
- 데이터 처리 시간이 느려질 수도 빨라질 수도 있음.
-> 중복 속성 제거, 동일한 의미의 일반 속성이 하나의 테이블로 집약됨. -> 한 테이블의 데이터 용량이 최소화되는 효과가 있음.
- 만약 JOIN이 많이 발생하여 성능 저하 나타나면 반정규화를 적용할 수 있다.
정규화 단계
제 1 정규화 (1NF)
테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것.
다음과 같은 규칙 만족
- 각 컬럼이 하나의 속성만을 가짐
- 하나의 컬럼은 같은 종류나 타입의 값을 가져야한다.
- 각 컬럼이 유일한 이름을 가져야한다.
- 칼럼의 순서 상관없어야한다.
제 2 정규화 (2NF)
제 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것.
-> 완전 함수 종속 : 기본키의 부분집합이 결정자가 되어선 안된다는 것 의미
다음과 같은 규칙 만족
- 제 1 정규화를 만족
- 모든 컬럼이 부분적 종속이 없어야한다. 모든 칼럼이 완전 함수 종속을 만족해야한다.
제 3 정규화 (3NF)
제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
-> 이행적 종속 : A->B, B->C가 성립할 때 A->C가 성립되는 것 의미
다음과 같은 규칙 만족
- 제 2 정규화를 만족
- 기본키를 제외한 속성들 간의 이행 종속성(Transitive Dependency)이 없어야한다.
제 3 정규화를 좀 더 강화한 버전 -> 3차 정규화로 해결할 수 없는 이상현상을 해결할 수 있음
BCNF란 3차 정규화를 만족하면서 모든 결정자가 후보키 집합에 속한 정규형이다.
다음과 같은 규칙 만족
- 제 3 정규화를 만족
- 모든 결정자가 후보키 집합에 속해야 한다.
4차, 5차 정규화
반정규화
- DB 성능 향상을 위해, 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법
- 조회(SELECT) 속도를 향상시키지만, 데이터 모델의 유연성은 낮아짐.
수행 이유
- 정규화에 충실하여 종속성, 활용성은 향상 되었지만 수행속도가 느려진 경우
- 다량의 범위를 자주 처리해야하는 경우
- 특정 범위의 데이터만 자주 처리하는 경우
- 요약/집계 정보가 자주 요구되는 경우
절차
클러스터링이란?
- 클러스터링 인덱스라는 것은 인덱스 정보를 저장할 때, 물리적으로 정렬해서 저장하는 방법
- 조회 시 인접 블록을 연속적으로 읽기 때문에 성능 향상
반정규화 기법
테이블 통합
두 개의 테이블이 조인되는 경우가 많아 하나의 테이블로 합쳐 사용하는 것 -> 성능 향상에 도움될 경우 수행
테이블 분할
테이블을 수직 또는 수평으로 분할하는 것
중복 테이블 추가
여러 테이블에서 데이터를 추출해서 사용해야 하거나 다른 서버에 저장된 테이블을 이용해야 하는 경우 중복 테이블을 추가하여 작업의 효율성 향상
중복 속성 추가
조인해서 데이터를 처리할 때 데이터를 조회하는 경로를 단축하기 위해 자주 사용하는 속성을 하나 더 추가하는 것
반정규화 기법은 나중에 더 자세히 블로그에 정리할 예정