반정규화 뜻과 개념에 대해서 이야기해봅시다.
반정규화 뜻과 개념 알기
반정규화 뜻(De-Normalization)은 데이터 베이스(DataBase)의 테이블(Table)들에 대해서 정규화된 엔티티, 속성, 관계에 대한 데이터 조회 성능을 향상 시키기 위해서 진행하는 절차와 과정을 의미합니다.
반정규화(De-Normalization)은 테이블(엔티티)들을 작은 단위로 분리하는 정규화(Normalization) 과정과 반대되는 개념으로 테이블들을 병합하고 분할하고 추가하거나 중복 컬럼 추가, 파생 컬럼 추가, 이력 테이블 컬럼을 추가하고 중복 관계를 추가하는 방법을 진행하는 절차입니다.
반정규화를 진행하면 데이터의 조회 성능이 높아질 수 있지만 반대로 데이터의 입력, 수정, 삭제에 대한 성능은 낮아질 수 있습니다. 정규화를 너무 많이 진행하면 데이터의 입력, 수정, 삭제에 대한 성능은 높아질지라도 테이블 간의 조인(JOIN)이 많아지기 대문에 데이터 조회 성능이 낮아질 수 있으므로 정규화를 진행한 다음 데이터 조회 성능이 심각하게 낮아졌다면 반정규화 진행을 고려하게 됩니다.
즉, 반정규화는 데이터를 조회할 때 조인(JOIN)으로 인해 데이터 조회 성능이 저하가 될 경우나 저하 될 것으로 예상되는 경우 조회 성능을 높이기 위해서 수행하는 방법입니다.
반정규화에는 테이블 반정규화, 컬럼 반정규화, 관계 반정규화가 있습니다.
반정규화 뜻과 개념 설명
반정규화 뜻(De-Normalization)은 데이터 베이스에서 데이터의 조회 성능을 향상 시키기 위해서 오히려 데이터 중복을 허용하거나 데이터를 그룹핑(Grouping) 하는 과정을 의미합니다.
반정규화(De-Normalization)은 정규화(Normalization)와 반대되는 개념입니다.
반정규화는 정규화가 진행 된 다음에 진행 여부 검토 후 이루어집니다.
정규화(Normalization)은 데이터의 정확성과 일관성을 유지하기 위해서 데이터베이스 안에 있는 엔티티들을 작은 단위로 분리하는 과정을 의미합니다. 정규화 과정을 거치게 되면 적절할 경우 성능이 높아지지만 지나치면 오히려 성능이 저하될 수 있습니다. 특히 정규화의 경우 데이터의 입력, 수정, 삭제에 대한 성능이 향상됩니다. 다만, 조회의 경우는 엔티티(Entity)가 여러 개로 더 분리되기 때문에 SQL 쿼리(SQL Query) 상 조인(JOIN)을 많이 걸어야 해서 성능이 저하될 수 있는 것입니다.
반정규화는 반대로 데이터의 입력, 수정, 삭제 성능은 저하될 수 있지만 데이터 조회가 더 빨라질 수 있습니다. 반정규화는 데이터 조회 성능을 높이기 위해서 사용될 수 있습니다. 반정규화는 데이터의 정합성 이슈는 발생할 수 있는 문제점은 있습니다. 반정규화 과정의 경우 정규화 과정이 끝난 다음에 진행하게 됩니다. 반정규화의 경우도 정규화처럼 룰이 존재합니다.
반정규화는 성능 향상을 위해서 정규호된 데이터 모델에서 중복, 통합, 분리 등을 수행하는 모든 절차와 과정을 통칭하는 개념이기도 합니다. 반정규화를 진행하면 데이터 무결성 측면에서는 불리합니다.
정규화를 진행하였는데 만약 데이터 조회의 성능이 심각하게 저하되어 있다면 반정규화를 진행합니다. 반정규화를 진행하게 되면 데이터 무결성 측면에서는 저해 될 수 있고 입력, 수정, 삭제 성능은 낮아질 수 있지만 조회 성능은 높일 수 있습니다.
반정규화 방법에는 3가지 방법이 있습니다.
반정규화 3가지 방법은 테이블 반정규화, 컬럼 반정규화, 관계 반정규화 입니다.
[반정규화 방법 3가지]
구분 | 내용 |
1 | 테이블 반정규화 |
2 | 컬럼 반정규화 |
3 | 관계 반정규화 |
테이블 반정규화 방법에는 다시 3가지가 있습니다. 반정규화 방법 3가지는 테이블 병합, 테이블 분할, 테이블 추가입니다. 그리고 각각의 방법에는 추가적인 방법들이 존재합니다.
[테이블 반정규화 방법]
구분 | 내용 |
1 | 테이블 병합 |
2 | 테이블 분할 |
3 | 테이블 추가 |
테이블 병합은 2 개 이상의 엔티티들을 합체하는 것입니다.
즉, 테이블 병합은 2개 이상의 테이블을 합치는 개념입니다.
테이블 병합은 비즈니스와 업무 프로세스 상에서 테이블들의 조인(JOIN)이 많이 필요한 경우 테이블을 통합하는 것이 오히려 성능 측면에서 유리하다고 판단될 경우 진행합니다.
테이블 병합 방법에는 1:1 관계 테이블 병합, 1:M 관계 테이블 병합, 슈퍼 서브 타입 테이블 병합 방법이 있습니다. 1:M 관계 테이블 병합의 경우는 한 쪽에 해당하는 테이블의 속성 개수가 많으면 병합했을 경우 중복 데이터가 많아지는 형태가 되기 때문에 테이블 병합에 적절하지 못할 수 있습니다. 1:M 관계에서는 테이블 병합이 한 쪽에 해당하는 테이블의 속성 개수가 적어야 유리합니다.
테이블 병합은 1:1 관계의 병합도 가능합니다. 1:1 관계 테이블 병합은 비교적 판단하기 쉽기 때문에 부작용이 적은 장점이 있습니다. 테이블 병합은 중복된 데이터가 생길 수 있습니다.
테이블 분할은 테이블의 수직 분할과 테이블의 수평 분할 2가지가 있습니다.
테이블의 수직 분할은 테이블의 일부 속성을 별도의 테이블로 분할하는 방법입니다. 이 경우 1:1 관계가 성립하게 됩니다. 이는 자주 사용하는 속성이 아니거나 대부분의 인스턴스가 해당 속성 값을 NULL로 가지고 있을 때 고려합니다.
테이블의 수직 분할은 일부 속성을 별도의 테이블로 분리하는 것입니다. 테이블을 수직 분할하게 되면 한 개의 블록에 더 많은 인스턴스를 저장할 수 있게 됩니다. 속성의 사용 빈도와 속성 값의 NULL 여부에 따라서 분할할 수 있습니다.
테이블의 수평 분할은 엔티티의 인스턴스들을 특정 기준으로 별도의 엔티티로 분할하는 것을 말합니다. 테이블의 수평 분할은 파티셔닝이라고 합니다. 파티션 기능을 사용하여 데이터를 물리적으로 분리할 수 있습니다. 테이블의 수평 분할은 특정 인스턴스를 별도의 테이블로 분할하는 것이며 데이터 베이스의 파티셔닝 기법으로 주로 사용하게 됩니다. 테이블 수평 분할을 진행하게 되면 관계가 없는 여러 개의 테이블들이 생성될 수 있습니다.
테이블 추가에는 4가지 방법이 있습니다. 테이블 추가의 4가지 방법은 중복 테이블 추가, 통계 테이블 추가, 이력 테이블 추가, 부분 테이블 추가입니다. 이 중에서 중복 테이블 추가는 데이터의 중복이 발생하더라도 성능 관점에서 반드시 필요하다고 판단될 경우 진행하는 방법입니다.
컬럼 반정규화는 3가지 방법이 있습니다. 컬럼 반정규화의 3가지 방법은 중복 컬럼 추가, 파생 컬럼 추가, 이력 테이블 컬럼 추가입니다.
[컬럼 반정규화 3가지 방법]
구분 | 내용 |
1 | 중복 컬럼 추가 |
2 | 파생 컬럼 추가 |
3 | 이력 테이블 컬럼 추가 |
중복 컬럼 추가는 비즈니스와 업무 프로세스 상 조인(JOIN)이 많이 필요한 경우가 많아져서 컬럼을 추가하는 것이 성능 측면에서 유리하다고 판단될 경우 진행합니다.
파상 컬럼 추가는 업무 프로세스를 진행할 때 부하가 걱정되는 계산 값에 대해서 미리 컬럼으로 추가하여 보관하는 방법입니다. 이는 복잡한 계산을 거친 후 결과로 도출되는 데이터 값들에 대해서 미리 컬럼으로 추가하여 보관하면 빠르게 데이터를 조회할 수 있게 됩니다.
이력 테이블 컬럼 추가의 경우 대량의 이력 테이블들을 조회하게 되면 데이터 조회 속도가 매우 느려질 것을 고려하여 조회 기준으로 볼 수 있는 컬럼을 미리 추가해 놓는 방법입니다. 이력 테이블 컬럼 추가는 최신 데이터 여부에 대한 컬럼 값이 대표적인 예시입니다.
이 이외에도 PK(Primary Key)에 의한 컬럼 추가 방법이 있습니다. 여러 컬럼으로 이루어진 PK를 가진 테이블들을 조인하는 경우 단순성을 위해서 인공적으로 PK를 지정하고 활용할 수 있습니다.
관계 반정규화의 경우 중복 관계를 추가하는 방법입니다. 비즈니스와 업무 프로세스 상 조인(JOIN)
이 필요한 경우가 많아서 중복 관계를 추가하는 것이 성능 측면에서 유리하다고 판단 될 경우 고려하는 방법입니다. 관계 반정규화는 중복 관계 추가를 의미합니다. 관계반정규화는 여러 경로를 통해서 조인할 수 있지만 성능이 낮아지는 것을 막기 위해서 추가적인 관계를 맺도록 하는 것입니다.