본문 바로가기

오라클 데이터베이스

SQL 14일차 [논리모델링][반정규화]

반정규화(역정규화)

 

4.  PK분리 컬럼

차량번호를 통해서 차량들을 관리했지만 사용하다 보니 지역별로 조회를 할때가 많았다. 

그래서 역정규화를 통해서 지역을 관리하는 컬럼을 추가 해주었다 이제 조회는 쉬워졌지만 삽입할때 차량번호를 substr을 통해 조작된 지역을 넣어줘야하기 때문에 관리의 불편함이 있다.

5. 테이블 복구를 위한 컬럼추가

어떤 테이블의 속성의 값을 변경하고 난 다음 이전의 값을 저장할 컬럼을 추가한다. 이렇게 쓰면 쓸데 없는 값을 많이 저장하게 되서 쓰지는 않는다.

반정규화

1. 관계병합(슈퍼 타입, 서브타입) 병합

학생의 직업이 학부생인지 대학원생인지에 따라 나누는 등 배타적관계에 해당하는 관계에서 구분코드를 사용해서 테이블을 분리하고 나면 조회를 할때 조인해서 검색해야하므로 성능저하의 문제가 발생한다. 이를 해결하기 위해서 반정규화를 실행한다. 

 

 

슈퍼타입과 서브타입 구분코드로 분리되어 공통 컬럼으로 보관했던 슈퍼타입 테이블과 서브타입 테이블을 합칠 수있다.

슈퍼타입을 푸는 3가지 방법

 

 

 

1. 1:1 (one to one)

1:1로 분리하면 각각의 테이블 별로 조회를 하면 이 경우가 가장 성능상 유리하다. 하지만 조인을 해서 사용하는 경우가 많다면 이 경우에는 조회성능이 떨어진다.

2. 슈퍼타입과 서브타입을 테이블 통합하기

각각 학생 종류별로 나눴던 애들을 조인해서 데이터를 찾는 경우가 많다면 슈퍼타입테이블과 서브타입 테이블을 합쳐서 2개의 테이블로 만드는 편이 낫다. 하지만 중복 컬럼이 생긴다는 단점을 안고 가야한다.

3. All in one(single type)

조회성능을 가장 높일 수있는 방법은 한테이블에 다 때려넣는 것이다. 한테이블에서 조회하는 것이 가장 효율이 높다. 하지만 데이터를 삽입할때 null값이 발생할 수 있다는 단점을 안고 가야한다.

 

 

 

 

2. 수직분할과 수평분할

회원테이블은 두개만든다 master detail구조로 뺀다 자주 참조하는거랑 회원의 전체정보랑 분리한다

DB의 사용량분석을 통해 결정하는일인데 일부 컬럼의 조회가 많이 발생한다면 마스터와 상세테이블로 빼서 관리하는게 맞다

 

수직분할은 정규화가 잘 되어있으면 할 것이 없다. 수직분할은 컬럼을 나눈다. 특정컬럼의 조회가 많다면 분리하는게 맞다

 

일부 컬럼만 조회를 많이 한다면 테이블을 용도에 맞게 분리해서 사용하는게 맞다