[DB] 역정규화

역정규화

정규화된 스키마는 데이터를 입력, 수정, 삭제할 때 관계를 맺고 있는 테이블을 참조해야 하며 가장

작은 단위로 테이블에 나뉘어져 있기 때문에 연관된 정보를 보기 위해서 조인을 수행해야 한다. 이때 외래키를 참조하는 과정이 잦아지면서 정규화된 스키마는 시스템의 부하를 유발하게 된다.

역정규화란 시스템의 퍼포먼스 향상을 위해서 정규화에 위배되는 행위를 말한다.

일부러 역정규화를 한다.

역정규화 고려사항

역정규화를 수행하기 위해서는 우선 정확한 업무 분석과 사용자들의 업무 프로세스를 분석해야 한다.

역정규화는 우선 데이터 사용량이 많은 테이블을 기준으로 해서 우선적으로 역정규화를 고려한다.

모든 테이블에 역정규화를 디테일 하게 할 필요는 없다. 몇개의 테이블만 정확하게 하면

전체 시스템에 향상이 많이 된다.

역정규화의 유형

1. 컬럼 역정규화 (데이터 중복)

:관계테이블의 복합키는 해당 부모테이블에 대표되는(많이조회되는) 컬럼을 가져온다.

적절히 고려를 해야함. 사이즈가 클수록 역정규화를 하면 오히려 많은 중복데이터를 같는다.(주소록)

예)

학생(학번,이름)

동아리등록(동아리코드_FK, 학번_FK, 이름, 동아리명)

동아리(동아리코드, 동아리명)

2. 파생 컬럼의 생성

:계산을 통해서 얻어질 수 있는 결과 값을 테이블의 컬럼으로 만들어서 값을 저장하게 하면

조회할 때 마다 연산을 통해 결과값을 얻지 않아도 되기 때문에 조회의 성능을 향상시킬 수 있다.

예1) 판매테이블의 판매금액을 컬럼으로 만든다.

판매금액 = 판매수량 * 판매단가

예2) 성적 테이블의 총점과 평균 컬럼으로 만든다.

3. 테이블 분리 (※ 중요 ※)

:컬럼을 기준으로 테이블 분리. 분리시 성격으로 나눈다. 업무적으로 자주 활용하는것. 자주 활용하지않는 것으로 나눈다.

예)사원 테이블(사원번호) - 기본인적사항과 개인인적사항(신체적사항)

사원테이블에 개인인적사항을 부가정보테이블로 식별관계 테이블로 나눈다. (1:1 관계)

4. 레코드를 기준으로 테이블 분리 (※ 중요 ※)

:성적테이블에서 성적이 상위, 중위, 하위를 나눌때 처음부터 성적 순위에 맞게 분리를 한다.

–> 공부잘하는 학생 상위, 공부를 중간정도하는 학생 중위, 공부를 못하는 학생 하위

  (3개로 나눈다.) 만약 이 3개 테이블을 하나로 묶겠다. (union 으로 묶으면 하나의 테이블 인식)

–> 나눠진 3개의 테이블은 물리적으로 따로 만들면 각 처리는 해당 서버에서 처리를 해서

  서버의 부하를 분산 시켜 시스템의 성능을 향상시킬 수 있다. (파티션 뷰)

5. 요약 테이블 생성

:판매테이블에서 판매된것에 대한 요약을 보고 싶을때 -> 매출액요약 테이블 하나를 만든다.

판매테이블(판매번호, 회원번호, 상품코드, 판매일자, 판매금액, 판매단가, 판매수량)

매출액요약테이블(상품코드, 판매일자, 판매금액)

※ 요약시 관계제거 ->자식 부모 데이터 검증 관계를 안하겠다. 임의로 추가 해서 데이터 입력

관계제거시 데이터의 무결성이 손상 받는다.

판매테이블 전체를 묶어서 조회보다 매출액요약테이블만 조회해서 부하를 줄일 수 있다.

6. 테이블 통합

:개인신상테이블(이름_PK) , 자동차테이블(이름_FK)

->서로 데이터를 수정시 관계를 따져가며 수정하는데 그럴 필요 없이 서로 검증하지 않고

조인 하지 않게 해 굳이 데이터 입력 수정 삭제시 검증 하지 않아도 된다. 개인신상을 통으로 가져온다.

->일부데이터가 쓸때 없이 낭비 되지만 오히려 서로 상관을 안해 유연성이 증가 될 수 있다.