반정규화 혹은 역정규화라고 하는 기법에 대해
설명드리겠습니다
저번에 포스팅한 데이터베이스 정규화에 대한 포스팅을 보고 오시면 도움이 될 것입니다
데이터베이스 정규화 (1NF, 2NF, 3NF, BCNF)
오늘 알려드릴 데이터베이스 이론의 개념은 정규화입니다 정규화는 릴레이션이 중복되지 않게 효과적으로 데이터베이스 내에 표현해서 나중에 연산을 할 때 많은 비용이 소모되는 것을 방지하
suda-datanote.tistory.com
그럼 일단 용어 자체로만 본다면 반정규화는
말 그대로 정규화의 반대입니다
저는 정규화를 복잡한 데이터베이스 테이블을 분할해서
단순하게 만든다라는 개념으로 접근하고 있는데요
그 반대니까 데이터베이스 테이블을 좀 더 복잡(??)하게 만드는 것인가??
라고 생각했습니다
그럼 왜 사용하는 것인가??
저는 이 의문을 해결해야 뭔가 공부하기 편해지더라고요
우리는 이전 포스팅에서 '정규화'에 대해 배웠습니다
원래 큰 테이블을 정규화한다면
단계를 거치면 거칠수록 나눠지는 테이블의 개수는 많아집니다
물론 꼭 필요한 정규화도 있겠지만
원래 한 테이블에 있던 정보들이니 만큼
연관된 데이터들이 있을 것입니다
그럼 우리가 실제로 데이터를 조회할 때
다른 여러 테이블을 조인(JOIN)해서 데이터를 추출할 일이 많아질 것입니다
그러면 디스크가 데이터를 찾는 시간, 조인하는 시간들이 추가로 요구됩니다
즉, 성능이 줄어든다는 것이죠
이러한 비용들이 들기 때문에 데이터 테이블, 속성, 관계를
중복시키거나 분할하거나 추가해서
성능을 높여야 합니다
하지만 반정규화를 할 때 가장 유의해야 할 점은
반정규화를 많이 하면 '무결성'이 훼손된다는 것입니다.
데이터의 중복이 생기기 때문이죠
그래서 반정규화를 하기 전에
다른 방법이 있는지 확인해봐야 합니다
다른 방법이라 하면
뷰 테이블, 클러스터링, 인덱스 조정, 응용 애플리케이션, 파티셔닝 등이 있는데
이러한 방법은 솔직히 저도 잘 이해하지 못한 방법도 있어서
나중에 설명드리겠습니다
일단 중간 정리를 하겠습니다
반정규화는 지나친 정규화로 인해 생기는 성능 저하를 막기 위해 사용합니다
하지만 반정규화는 무결성을 해치기 때문에 다른 방법이 있는지 확인하고 사용합니다
그러므로 적절한 성능과 무결성, 정규화와 반정규화의 Trade-off가 필요합니다
그럼 반정규화가 왜 필요하고 어떤 개념을 가지고 있는지는 알았으니
어떤 기법을 사용하는지 알려드리겠습니다
1. 테이블 반정규화
(1) 테이블 병합
테이블을 병합하는 것은 해당 관계를 통합해서 성능을 향상합니다
이때 두 가지 경우를 고려하고 테이블을 병합해야 하는데
1. 두 개의 테이블에서 발생하는 작업이 자주 처리되는 경우
2. 항상 두 개의 테이블을 이용하여 조회를 수행하는 경우
이 두 가지 경우를 고려해보시고 병합해야 합니다
병합하는 관계의 종류는 밑의 세 가지입니다
- 1:1 관계 테이블 병합
- 1:M 관계 테이블 병합
- 슈퍼/서브타입 테이블 병합
(2) 테이블 분할
테이블 분할은 수직분할과 수평분할이 있습니다
이는 디스크 I/O에 영향을 줘서 빠른 처리가 가능하게 합니다
수직분할 :
- 하나의 테이블에 속성이 너무 많을 경우 속성을 기준으로 테이블을 분할하는 것
- 갱신 위주의 속성 분할, 자주 조회되는 속성 분할, 크기가 큰 속성 분할,
보안을 적용해야 하는 속성 분할이 있습니다
수평 분할 :
- 레코드(튜플)를 기준으로 테이블을 분할합니다
- 레코드 별로 사용 빈도의 차이가 큰 경우 사용 빈도에 따라 테이블을 분할합니다
(3) 테이블 추가
테이블을 추가하는 경우는 어떤 테이블을 추가하느냐에 따라 달라집니다
- 중복 테이블 추가 : 접근하는데 비용이 많이 들어가는 테이블에 있는 데이터가 필요하거나 여러 테이블에서 데이터를 추출해야 하는 경우 같은 서버에 똑같은 테이블을 생성하는 방법입니다.
- 통계 테이블 추가 : 집계 함수(SUM, AVG,...)들을 자주 사용할 때 이 결과들을 미리 계산하고 저장해두면 계산하는 비용을 아낄 수 있기 때문에 사용합니다
- 이력 테이블 추가 : 이력 관리에 필요한 로그들을 저장하는 테이블입니다
- 부분 테이블 추가 : 하나의 테이블 중 일부 속성만 자주 사용하는 경우 따로 추가해서 사용합니다
이러면 전체 테이블을 읽을 필요가 없어져서 더 빠르게 데이터를 추출할 수 있습니다
2. 칼럼 반정규화
- 중복 칼럼 추가 : 조인해야 하는 경우를 감소시키기 위해 중복된 칼럼을 추가합니다
중복 칼럼을 추가하면 무결성 확보가 어렵고, 디스크 공간이 추가로 필요합니다
- 파생 칼럼 추가 : 집계 함수 계산으로 인해 생기는 비용을 줄이기 위해 계산된 값을 미리 계산하여 칼럼에 보관합니다
- 이력 테이블 칼럼 추가 : 대량의 이력 데이터 중 특정 조건(날짜 등...)을 만족시키는 데이터만 추출할 때 나타나는 성능 저하를 예방하기 위해 이력 테이블에 기능성 칼럼(최근 값 여부, 시작과 종료일자 등)을 추가합니다
- PK에 의한 칼럼 추가 : 복합 의미를 갖는 PK를 단일 속성으로 구성하였을 경우 발생됩니다.
하나의 속성으로 만들어진 PK 안에서 특정 값을 별도로 조회하는 경우 성능 저하가 발생될 수 있습니다
그래서 성능 향상을 위해 일반 속성으로 포함하는 방법입니다
- 응용시스템 오작동을 위한 칼럼 추가 : 사용자가 데이터 처리를 하다가 잘못 처리하여 원래 값으로 복구하기를 원하는 경우 이전 데이터를 임시적으로 중복하여 보관하기 위해 사용하는 기법입니다
3. 관계 반정규화
- 중복 관계 추가 : 데이터를 처리하기 위한 여러 경로를 거저서 조인이 가능하지만 이때 발생할 수 있는 성능 저하를 예방하기 위해 추가적인 관계를 맺는 방법입니다
- 관계의 반정규화는 데이터 무결성을 깨뜨릴 위험을 갖지 않고서도 데이터 처리의 성능을 향상할 수 있는 반정규화 기법입니다
이렇게 오늘은 데이터베이스 이론 중 반정규화 이론에 대해 소개해드렸습니다
데이터진흥원에서 배포하는 가이드를 많이 인용했고 저도 아직 공부가 더 필요하다는 것을 느꼈네요
이 포스팅이 이해하기 어려웠던 분들에게 조금이나마 도움이 되셨길 바랍니다
그럼 다음 포스팅 때 뵙겠습니다
감사합니다!!
'학교 공부 > Database' 카테고리의 다른 글
DB에서 사용하는 여러 Key들[PK, FK, ...] (0) | 2021.06.17 |
---|---|
데이터베이스 정규화 (1NF, 2NF, 3NF, BCNF) (0) | 2021.03.11 |