심심한잉여의 잡동사니

[SQL/DB]정규화(Normalization)와 반정규화(De-Normalization) 본문

코딩일기

[SQL/DB]정규화(Normalization)와 반정규화(De-Normalization)

심심한잉여 2022. 3. 24. 23:09
반응형

정규화란?
- 정규화는 데이터의 일관성, 최소한의 데이터 중복, 최소한의 데이터 유연성을 위한 방법이며 데이터를 분해하는 과정이다.
- 정규화된 모델은 테이블이 분해된다. 테이블이 분해되면 직원 테이블과 부서 테이블 간에 부서코드로 조인(JOIN)을 수행하며 하나의 합집합으로 만들 수 있다.
- 정규화를 하면 불필요한 데이터를 입력하지 않아도 되기 때문에 중복데이터가 제거된다.


제 1 정규화
- 속성의 원자성을 확보
- 속성의 중복값을 제거한다.
- 기본키를 설정한다.

제 2 정규화
- 기본키가 2개 이상의 속성으로 이루어진 경우, 부분 함수 종속성을 제거한다.
- 부분 함수 종속성이란, 기본키가 2개 이상인 컬럼으로 이루어진 경우에만 발생한다. 기본키가 1개이면 이 과정을 스킵한다.
- 복합 인스턴스에 따라 각 인스턴스의 종속적 중복을 삭제한다.

제 3 정규화
- 기본키를 제외한 컬럼 간에 종속성을 제거한다.
- 즉, 이행 함수 종속성을 제거한다.
- 일반 속성의 종속성을 제거한다.

BCNF
- 기본키를 제외하고 후보키가 있는 경우, 후보키가 기본키를 종속시키면 분해한다.
- BCNF는 복수의 후보키가 있고, 후보키들이 복합 속성이어야 하며, 서로 중첩되어야 한다.

제 4 정규화
- 여러 컬럼들이 하나의 컬럼을 종속시키는 경우, 분해하여 다중값 종속성을 제거한다.

제 5 정규화
- 조인에 의해서 종속성이 발생되는 경우 분해한다.


정규화의 장점
 - 데이터베이스 변경 시 이상 현상 제거
 - 데이터베이스 구조 확장 시 재 디자인 최소화

정규화의 단점
 - 정규화는 데이터 조회(SELECT)를 실행할 때 조인(JOIN)을 사용해야 하기 때문에 CPU와 메모리를 많이 사용한다.

따라서 조회(SELECT)를 하는데 조인(JOIN)이 많이 발생한다면 반정규화를 진행하는 전략이 필요하다.


반정규화란?
반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복의 통합, 분리등을 수행하는 데이터 모델링 기법이다.
디스크 I/O량이 많아 조회 시 성능이 저하되거나 테이블끼리의 경로가 너무 멀어 조인으로 성능저하가 예상되거거나 컬럼 계산 시 조회 성능이 저하되는 것이 예상되는 경우 반정규화를 고려한다.

반정규화 대상
 - 자주 사용되는 테이블에 엑세스하는 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우
 - 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
 - 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우

반정규화의 주의점
반정규화를 과도하게 적용하다 보면 데이터의 무결성이 깨질 수 있다. 또한 입력, 수정, 삭제의 질의문에 대한 응답시간이 늦어질 수 있다. 즉 정규화로 부터 얻은 이점이 사라지게 된다.
데이터베이스의 성능을 판단하는 두 척도인 입력, 수정, 삭제에 대한 성능과 조회에 대한 성능을 고려해야한다.

다른 대책
복잡한 쿼리문에 대해서는 VIEW를 통해 해결이 가능할까?
조회 성능을 위해 반정규화를 진행하기 전에 인덱스를 적용하여 해결할 수 있는지 검토한다.


정규화는 데이터의 중복을 최소화하고 데이터를 구조화하는 작업을 뜻하고
장점으로는 데이터의 무결성 확보 및 중복된 데이터를 제거하여 리소스를 최소화 시킬 수 있다.
단점으로는 JOIN을 남용하게 될 수 있어 주의가 필요하며 그로인해 성능이 느려진다면 반정규화가 필요하다.

반정규화는 데이터베이스 성능 향상을 위해 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법

반정규화를 남용하게 되면 데이터의 무결성이 깨지고 데이터 입력/수정/삭제에 대한 성능이 낮아질 수 있다.
따라서 진행하기 전 뷰, 인덱스 등 다른 방법을 우선적으로 검토를 해보는것이 중요하다.

반응형

'코딩일기' 카테고리의 다른 글

[네트워크]Ethernet 통신(이더넷 통신)  (0) 2022.04.09
[네트워크] 통신이란  (0) 2022.04.08
[자료구조] 자료구조란?  (0) 2022.04.04
[API]API란?  (0) 2022.04.03
[SQL/DataBase]인덱스(Index)란?  (0) 2022.03.25