개념정리/SQLD

SQLD 데이터 모델링과 SQL

춘핑이 2023. 10. 24. 13:30

2.0 성능데이터 모델링

데이터베이스의 성능을 향상시키기 위해 설계단계부터 성능과 관련된 사항들을 모델링에 반영하는 것이다.

성능 데이터 모델링의 순서는

1.데이터 모델에 맞게 정규화를 수행한다.

2.데이터베이스의 용량 및 트랜잭션 유형을 파악하여 성능저하를 일으키는 부분이 없는지 검토한다.

3.용량과 트랜잭션 유형에 맞게 반정규화를 수행한다.

4.성능향상을 위한 이력모델의 조정 PK/KF 조정 슈퍼서브타입 조정 등을 수행한다.

5.데이터모델의 성능을 검증한다.

2.1 정규화

데이터 정합성(정확성과 일관성)을 위해 엔티티를 작은 단위로 분리하는 과정
정규화는 조회성능은 처리 조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만 입력 수정 삭제 성능은 일반적으로 향상된다.
무작정 분리하면 안되고 일정한 룰에 따라 분리해야한다.

2.1.1 제1정규형

모든 속성은 반드시 하나의 값만 가져야한다.
하나의 속성이 다중값을 가지면 데이터를 꺼내 사용할때 불필요한 SPLIT을 사용해야하는 번거로움이 생길 수 있다.
또한 엔티티내 유사한 속성이 반복되는 경우 속성을 계속 추가해야해서 모든 인스턴스가 추가된 속성의 개수만큼 속성값을 가지고 있지 않을 수 있기때문에 불필요한 공간의 낭비가 생길 수 있다.

따라서 다음의 과정을 거친다.
1.속성값이 하나가 되도도록 엔티티를 분리한다.
2.유사한 속성이 반복되지 않도록 엔티티를 분리한다.

2.1.2 제2정규형

엔티티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야한다.
주식별자가 단일식별자가 아닌 복합식별자인 경우 일반속성이 주식별자의 일부에만 종속될 수 있다.

부분함수 종속성제거이다.

 

예시
주식별자-주문번호+음료코드 주문수량 음료명일때 음료명이 주식별자중 음료코드에만 종속된다. 이런경우 분리해야한다.

2.1.3 제3정규형

주식별자가 아닌 모든 속성간에는 서로 종속될 수 없다.

이행함수종속성제거이다.

 

예시)
주식별자-일련번호 소속사코드 소속사명 이럴때 소속사명이 일반 속성인 소속사코드에 종속된다.

2.1.4 주의사항

적절한 정규화는 성능상 이롭지만 지나친 정규화는 오히려 성능저하를 일으킬 수 있다.

2.2 반정규화

데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정이다.
조회 성능은 향상될 수 있으나 입력 수정 삭제 성능은 저하 될 수 있으며 데이터 정합성 이슈가 발생할 수 있다.
정규화가 끝난후 거치게 되며 정규화와 마찬가지로 일정한 룰이 있다.

2.2.1 테이블 반정규화

1.테이블 병합
1대1 관계 테이블 병합, 1대m관계 테이블 병합, 슈퍼 서브타입 테이블 병합
업무 프로세스상 JOIN이 많아 테이블을 통합 하는 것이 성능 측면에서 유리할 경우 고려한다.
1대M 관계 테이블 병합의 경우 1쪽에 해당하는 엔티티의 속성 개수가 많으면 병합했을 경우 중복데이터가 많아지므로 테이블 병합에 적절하지 못하다.

2.테이블 분할
2.1. 테이블 수직분할
엔티티의 일부속성을 별도의 엔티티로 분할(1대1관계 성립)
자주 사용하는 속서잉 아니거나 대부분의 인스턴스가 해당 속성값을 NULL로 갖고 있을때 고려한다.
1대1관계의 테이블이 두개 생기는 것이다.
예시)
회원번호(PK) 아이디 회원명 핸드폰번호 배우자명 배우자핸드폰번호일때 배우자가 없을 경우가 많으니 뒤 두 속성이 NULL일 경우가 많을 것이다.
그래서 회원번호(PK) 아이디 회원명 핸드폰번호 / 회원번호(FK) 배우자명 배우자핸드폰번호로 나누는 것이다.

2.2. 테이블 수평분할
엔티티의 인스턴스를 특정기준으로 별도의 엔티티로 분할한다.(파티셔닝)
파티션 기능으로 주문일자에 따라 데이터를 물리적으로 분리한다.
예시)
주문이라는 테이블이 있을때 2020년의 주문 테이블, 2021년의 주문테이블로 나누는 것이다.

2.3. 테이블추가
중복테이블 추가 : 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔티티를 추가한다.
예시)
통계테이블 추가 : 주문데이터를 이용하여 월매출 테이블에 통계치를 미리 계산하여 저장한다.
이력테이블 추가 : 상품가격 이력테이블에서 과거의 상품가격에 대한 데이터를 관리한다.
부분테이블 추가 : 회원 대상 메일 발송건이 다량으로 생기는 경우 메일발송에 필요한 정보만 부분 테이블로 생성.

 

테이블 반정규화기법 정리

테이블병합 1대1 관계테이블병합
1대M 관계테이블병합
슈퍼/서브타입테이블병합
테이블분할 수직분할
수평분할
테이블 추가 중복 테이블 추가
통계테이블 추가
이력 테이블 추가

2.2.2 컬럼 반정규화

1.중복 컬럼 추가
업무 프로세스상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려한다.

2.파생컬럼추가
프로세스 수행시 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식으로 상품의 재고나 프로모션 적용할인가 등이 이에 해당할 수 있다.

3.이력 테이블 컬럼추가
대량의 이력테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해놓는 방식 최신 데이터 여부 등이 이에 해당할 수 있다.

2.2.3 관계 반정규화(중복관계추가)

업무 프로세스상 JOIN이 필요한 경우가 많아 중복관계를 추가하는 것이 성능 측면에서 유리할 경우 고려한다.

데이터의 무결성을 깨트릴 위혐성없이 데이터 처리 성능을 향상시킬 수 있는 기법이다.

2.3 트랜잭션

데이터를 조작하기 위한 하나의 논리적인 작업단위

데이터모델로 표현할 수 있으며 데이터는 트랜잭션 범위로 묶일 수 있다.
예시)
계좌이체를 할때
A의 계좌에서 출금되고 B의 계좌로 입금되는 과정까지 거쳐야 하나의 작업단위를 모두 수행한것이다.
중간에 문제가 생기면 롤백되어야 정상적인 시스템이다.

2.4 NULL

2.4.1 NULL이란?

NULL은 존재하지 않음 즉 값이 없음을 의미한다.
0과 NULL은 엄연히 다른의미를 가지고 있다. 어떠한 사유로 데이터가 입력되지 않아 NULL값이 된 것이다.

1.가로연산
수입 - 지출을 계산할때 NULL이 있다면 결과값도 NULL이다.

2.세로연산
SUM(수입) 다른 인스턴스의 데이터와 연산할때는 NULL값을 제외한다.

2.5 이상

삽입이상 : 기본적으로 주문되지 않는 상품의 정보를 삽입할 수없는데 강제로 삽입하기 위해 존재하지 않는 가짜 주문번호를 만들어 주어야한다.

갱신이상 중복된 데이터 중 일부만 업데이트되어 데이터의 불일치가 발생하게 되는 현상

삭제이상 데이터 삭제시 삭제되면 안되는 데이터까지 덩달아 삭제되는 현상