2023. 6. 4. 10:43ㆍDatabase
Intro
지난 포스팅에서 정규화에 대해 알아보았습니다.
정규화는 요약하자면 데이터의 일관성을 지키고 중복을 막기 위해 데이터를 분해하는 과정입니다.
정규화를 거치면 불필요한 데이터를 입력하지 않아도 되므로, 중복 데이터가 제거된다는 장점이 있었습니다.
하지만 테이블을 분해할수록 조회 시 join 연산 수행이 많아지므로 CPU와 메모리를 많이 사용하게 된다는 단점도 존재합니다.
이때, join으로 인한 성능 저하가 예상될 때 반정규화를 적용해볼 수 있습니다.
반정규화란?
정규화된 엔티티, 속성, 관계에 대해 시스템의 성능향상과 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법으로, 의도적으로 정규화 원칙을 위배하는 행위입니다.
반정규화를 수행하는 이유
- 정규화에 충실하여 종속성, 활용성은 향상 되었지만 수행속도가 느려진 경우
- 다량의 범위를 자주 처리해야하는 경우
매출 데이터를 날짜, 지역, 제품 등 다양한 범위로 조회하고 분석해야 한다고 가정해 봅시다. 정규화된 데이터베이스 구조에서는 해당 데이터가 여러 테이블에 분산되어 있어서 데이터 액세스와 조인하는 데 시간이 걸릴 수 있습니다. 이런 경우에는 반정규화를 통해 다양한 범위의 데이터를 별도의 테이블에 중복 저장함으로써 읽기 성능을 향상시킬 수 있습니다. - 특정 범위의 데이터만 자주 처리하는 경우
특정 기간의 판매 데이터를 자주 처리해야 한다고 가정해 봅시다. 정규화된 데이터베이스 구조에서는 판매 데이터가 여러 테이블에 분산되어 있어서 데이터를 액세스하고 조인하는 데 시간이 걸릴 수 있습니다. 이 경우에는 반정규화를 통해 해당 기간의 판매 데이터를 별도의 테이블에 중복 저장함으로써 읽기 성능을 향상시킬 수 있습니다. - 요약/집계 정보가 자주 요구되는 경우
만약 애플리케이션에서 sum, avg 등의 연산을 자주 요구한다면 집계 함수의 결과를 저장하는 별도의 테이블을 이용할 수 있습니다.
반정규화 기법
반정규화 기법은 크게 다음 네가지로 나뉩니다.
1) 테이블 통합
2) 테이블 분할
3) 중복 테이블 추가
4) 중복 속성 추가
1. 테이블 통합
- 두 개의 테이블이 조인(Join)되는 경우가 많아 하나의 테이블로 합쳐 사용하는 것이 성능 향상에 도움이 될 경우 수행합니다.
- 두 개의 테이블에서 발생하는 프로세스가 동일하게 자주 처리되는 경우, 두 개의 테이블을 이용하여 항상 조회를 수행하는 경우 테이블 통합을 고려할 수 있습니다.
2. 테이블 분할
- 테이블을 수직 또는 수평으로 분할하는 것을 의미합니다.
- 수평 분할(Horizontal Partitioning) : 레코드(Record)를 기준으로 테이블을 분할하는 것입니다.
- 수직 분할(Vertical Partitioning) : 하나의 테이블에 속성이 너무 많을 경우 속성을 기준으로 테이블을 분할하는 것입니다.
- 수직 분할의 예시
✔ 갱신 위주의 속성분할: 데이터 갱신 시 레코드 잠금으로 인해 다른 작업을 수행할 수 없으므로 갱신이 자주 일어나는 속성을 수직분할하여 사용
✔ 자주 조회되는 속성 분할: 테이블에서 자주 조회되는 속성이 극히 일부일 경우 자주 사용되는 속성들을 수직 분할하여 사용
✔ 크기가 큰 속성 분할: 이미지나 2GB이상 저장될 수 있는 텍스트 형식 등으로 된 속성들을 수직 분할하여 사용
✔ 보안을 적용해야 하는 속성 분할: 테이블 내의 특정 속성에 대해 보안을 적용할 수 없으므로 보안을 적용해야 하는 속성들을 수직분할하여 사용
3. 중복 테이블 추가
- 여러 테이블에서 데이터를 추출해서 사용해야 하거나 다른 서버에 저장된 테이블을 이용해야 하는 경우 중복 테이블을 추가하여 작업의 효율성을 향상시킬 수 있습니다.
- 중복 테이블 추가 방법 : 집계 테이블의 추가, 진행 테이블의 추가, 특정 부분만을 포함하는 테이블의 추가
4. 중복 속성 추가
- 조인해서 데이터를 처리할 때 데이터를 조회하는 경로를 단축하기 위해 자주 사용하는 속성을 하나 더 추가하는 것입니다.
마무리
지금까지 반정규화의 개념과 기법에 대해 간략히 살펴보았습니다.
반정규화를 적용하기 전에 반정규화 대상을 조사하고, 다른 방법을 우선적으로 검토하는 것이 바람직합니다.
반정규화는 가급적이면 데이터를 중복하므로 데이터 무결성이 깨질 위험이 높기 때문입니다.
성능을 고려한 View 테이블을 생성하거나, 인덱스를 조정해서 성능 향상을 시도해보는 것이 좋겠습니다.
또, 반정규화는 데이터가 중복되다보니 데이터의 삽입과 변경, 삭제 측면에서는 정규화 된 구조보다 성능이 좋지 못합니다. 뿐만아니라 데이터의 정합성과 일관성을 위해 신경써야 할 부분도 많을 것입니다.
'Database' 카테고리의 다른 글
Row가 3억 개인 테이블에 column 추가/삭제하기(Online DDL) (2) | 2023.11.18 |
---|---|
AWS -> NCloud로 데이터베이스 옮기기(mysqldump, docker) (1) | 2023.06.18 |
[DB] 파티셔닝(partitioning) (1) | 2023.06.04 |
[DB] 정규화(Normalization)란? (0) | 2023.05.28 |