물리데이터베이스
반정규화 Denormalization 개념
- 시스템의 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로 의도적으로 정규화 원칙을 위배하는 행위
- 반정규화를 수행하면 시스템의 성능이 향상되고 관리 효율성은 증가하지만 데이터의 일관성 및 무결성이 저하될 수 있므
- 과도한 반정규화는 오히려 성능을 저하시킬 수 있음
- 데이터의 일관성과 무결성을 우선으로 할 지, 데이터베이스의 성능과 단순화를 우선으로 할 지를 사전에 결정해야 함
- 방법
- 테이블 통합
- 테이블 분할
- 중복 테이블 추가
- 중복 속성 추가
반정규화 방법
1. 테이블 통합
- 테이블 조인이 많은 경우 하나의 테이블로 합치는 것이 성능 향상에 유리
- 종류
- 1:1 관계 테이블 통합
- 1:N 관계 테이블 통합
- 수퍼타입/서브타입 테이블 통합
- 고려사항
- 데이터 검색은 간편하지만, 레코드 증가로 처리량 증가
- 입력, 수정, 삭제 규칙의 복잡도 증가
2. 테이블 분할
- 테이블에서 특정 레코드나 특정 속성에 집중적으로 접근할 경우 테이블 분할
- 종류
- 수평 분할
- 수직 분할
2.1 수평 분할
- Record 레코드를 기준으로 테이블을 분할
- 레코드별로 사용 빈도의 차이가 큰 경우 사용 빈도에 따라 분할
2.2 수직 분할
- 테이블의 많은 속성 중 특정 속성들만 접근이 잦을 경우 속성을 기준으로 테이블을 분할
- 갱신 위주의 속성 분할
- 데이터 갱신 시 레코드 잠금으로 인해 다른 작업을 수행할 수 없으므로 갱신이 자주 일어나는 속성 분할
- 자주 조회되는 속성 분할
- 자주 조회되는 속성이 극히 일부일 경우 자주 사용되는 속성을 수직 분할하여 사용
- 크기가 큰 속성 분할
- 이미지나 2GB이상 저장 될 수 있는 텍스트 형식 등으로 된 속성을 수직 분할하여 사용
- 보안을 적용해야 하는 속성 분할
- 테이블 내 특정 속성에 대한 보안ㅇ르 적용할 수 없으므로 보안을 적용해야 하는 속성들을 수직분할하여 사용
2.3 테이블 분할 시 고려사항
- 기본키의 유일성 관리가 어려움
- 데이터 양이 적거나 사용 빈도가 낮은 경우 테이블 분할이 필요한지를 고려
- 분할된 테이블의 전체 조회 시는 Union을 사용해야하므로 수행 속도가 느려짐
- 데이터 검색에 중점을 두어 테이블 부할 여부를 결정해야 함
3. 중복 테이블 추가
- 여러 테이블에서 데이터를 추가해서 사용해야 하는 경우
- 다른 서버에 저장된 테이블을 이용해야하는 경우
3.1 중복 테이블을 추가하는 경우
- 정규화로 인해 수행 속도가 느려지는 경우
- 많은 범위의 데이터를 자추 처리해야하는 경우
- 특정 범위의 데이터를 자추 처리해야하는 경우
- 처리 범위를 줄이지 않고는 수행 속도를 개선할 수 없는 경우
3.2 중복 테이블 추가하는 방법
- 집계 테이블 추가
- SUM, AVG 등 집계 데이터를 위한 테이블을 생성하고, 각 원본 테이블에 트리거를 설정하여 사용하는 것
- 이력 테이블 추가
- 이력 관리 드으이 목적으로 추가하는 테이블로, 적절한 데이터 양의 유지와 활용도를 제고하기 위해 기본키를 적절히 설정
- 부분 테이블 추가
- 하나의 테이블의 전체 칼럼 중 자주 이용하는 집중화 된 칼럼들이 있을 때 해당 칼럼들을 모아 놓은 별도의 반정규화된 테이블 생성
4. 중복 속성 추가
- 테이블을 조인해서 데이터를 처리할 때 데이터를 조회하는 경로를 단축하기 위해 자주 사용하는 속성을 추가하는 것
4.1 중복 속성을 추가하는 경우
- 조인이 자주 발생하는 속성인 경우
- 접근 경로가 복잡한 속성인 경우
- 기본키의 형태가 적절하지 않거나 여러 개의 속성으로 구성된 경우
4.2 중복 속성 추가 시 고려사항
- 테이블 중복과 속성의 중복을 고려
- 테이블 일관성 및 무결성에 유의
- SQL 그룹 함수를 이용하여 처리할 수 있어야 함
- 저장 공간의 지나친 낭비를 고려