2) 데이터 모델과 SQL
※ 정규화, 비정규화는 성능 데이터 모델링 방법
** 성능 데이터 모델링의 순서
1) 데이터 모델에 맞게 정규화를 수행한다
2) 데이터베이스의 용량 및 트랜잭션 유형을 파악하여 성능 저하를 일으키는 부분이 없는지 검토한다
3) 용량과 트랜잭션 유형에 맞게 반정규화를 진행한다
4) 성능 향상을 위한 이력모델의 조정, PK/FK 조정, 슈퍼/서브타입 조정 등을 수행한다.
5) 성능 검
** 정규화(Normalization)
- 데이터의 정합성(정확성과 일관성을 유지하고 보장하는 능력)을 위해 엔터티를 작은 단위로 분리하는 과정
- 성능이 향상될 수도, 하향될 수도 있음. 일반적으로 입력, 수정, 삭제 성능은 향상됨
- 지나친 정규화는 오히려 성능저하를 일으킬 수 있음(여러번 join을 진행하는 것으로 인해)
1)제1 정규형
- 모든 속성은 반드시 하나의 원자값을 가져야 한다
- 하나의 속성에 여러 값이 있으면 안됨
2)제2 정규형
- 엔터티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 함
- 주식별자가 단일식별자가 아닌 복합식별자인 경우 일반속성이 주식별자의 일부에만 종속될 수 있음
3)제3 정규형
- 주식별자가 아닌 모든 속성간에는 서로 종속될 수 없음
- 이행적 종속을 제거하는 단계
** 반정규화(De-Normalization)
- 데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정
- 조회성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 수 있고 데이터 정합성 이슈가 발생할 수 있음
- 반정규화 과정은 정규화가 끝난 후 거치게됨
1. 테이블 병합
- 업무 프로세스상 join이 많아 테이블을 통합하는 것이 성능측면에서 유리할 떄 고려하는 방법
- 1:M 관계 테이블 병합의 경우, 1쪽에 해당하는 엔터티의 속성 개수가 많으면 중복데이터가 많아지므로 적절하지 못함
2. 테이블 분할
1) 테이블 수직 분할
- 엔터티의 일부 속성을 별도의 엔터티로 분할(1:1관계 성립)함 << 1:1 관계 테이블이 2개 생기는 것
2) 테이블 수평 분할
- 엔터티의 인스턴스를 특정 기준으로 별도의 엔터티로 분할(파티셔닝)함
- 주로 기간을 기준으로 분할하지만 다른 속성이 될 수도 있음
3. 테이블 추가
1) 중복테이블 추가
- 데이터의 중복을 감안하더라도 성능상 필요하다고 판단되는 경우 별도의 엔터티를 추가
2) 통계 테이블 추가 : 통계치를 미리 계산하여 저장
3) 이력 테이블 추가 : 과거 이력에 대한 데이터를 관리
4) 부분 테이블 추가 : 필요한 정보만 부분 테이블로 생성
** 컬럼 반정규화
1) 중복 컬럼 추가
- 컬럼을 추가하는 것이 성능면에서 유리하다고 생각되면 고려
2) 파생 컬럼 추가
- 프로그램 부하가 염려될 때 계산값을 미리 컬럼으로 추가하여 보관하는 방식
3) 이력 테이블 컬럼 추가
- 대량의 이력을 조회할 때 미리 컬럼을 추가해놓아 대기
** 트랜잭션(Transaction)
- 데이터를 조작하기 위한 하나의 논리적인 작업 단위