SQLD를 준비하며 개인적으로 조금 외워두면 좋을 것 같은 것들만 적어보았습니다.
참고한 책은 "2024 유선배 SQL개발자(SQLD) 과외노트"입니다.
01 정규화(Normalization)
정규화란?
정규화는 데이터 정합성(데이터의 정확성과 일관성을 유지, 보장)을 위해 엔티티를 작은 단위로 분리하는 과정이다.
제1 정규화
하나의 속성은 반드시 하나의 값만 가져야 한다.
예를 들어, "취미"이라는 럼에 "농구, 영화감상, 클라이밍"과 같이 여러 개의 값이 들어가면 안 된다.
"취미" 컬럼에 여러 개의 값이 들어가던 것을 테이블을 분리해서 1 정규화에 만족하도록 수정했다.
제2 정규화
엔티티의 모든 일반 속성은 반드시 모든 주식별자에 종속되어야 한다.
주식별자(PK)가 단일 식별자가 아닌 복합 -식별자일 경우 제2 정규화를 통해 테이블을 분리한다.
제3 정규화
주 식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다.
(이행적 함수 종속성을 제거)
02 반정규화(De-Normalization)
반정규화는 데이터의 조회 성능을 향상하기 위해 데이터의 중복을 허용하거나, 데이터를 그룹핑하는 과정이다.
- 조회 성능 향상 가능성
- 입력, 수정, 삭제 성능 저하 가능성
- 데이터 정합성 문제 발생 가능성
- 반정규화는 반드시 정규화 과정이 끝난 후 진행된다.
테이블 반정규화 - 테이블 병합
업무 프로세스 상 JOIN이 많이 발생하는 경우, 테이블을 병합하는 것이 성능 측면에서 유리할 경우 테이블 병합을 고려한다.
1 : 1 관계 테이블 병합
1 : 1 관계를 맺고 있는 테이블을 하나의 PK를 갖는 하나의 테이블로 병합하는 방법이다.
1 : M 관계 테이블 병합
1 : M 관계를 맺고 있지만, 항상 같이 조회되어 JOIN이 많이 발생하는 경우, 테이블 병합을 고려할 수 있다.
단, 테이블은 병합되어도 일부 요소에 대해서는 중복 데이터가 생길 수 있다.
테이블 반정규화 - 테이블 분할
테이블 수직 분할
엔티티의 일부 속성을 별도의 엔티티로 분할한다. (1 : 1 관계 성립)
테이블 수평 분할
엔티티의 속성 중 하나를 기준으로 별도의 엔티티로 분할한다. (DB 파티셔닝)
예를 들면, "주문 일자" 컬럼을 기준으로 연도별로 테이블을 분리할 수 있다.
테이블 추가
- 중복 테이블 추가 : 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔티티 추가한다.
- 통계 테이블 추가 : 여러 엔티티를 조회하여 통계를 계산할 일이 많은 경우 미리 계산하여 엔티티로 저장한다.
(x월 지출 금액, x년도 인원 등) - 이력 테이블 추가 : 과거의 이력을 저장해야 하는 경우, 별도의 엔티티를 추가한다.
- 부분 테이블 추가 : 특정 프로세스를 진행 시에 특정 속성에 대한 조회가 다량으로 발생하는 경우, 해당 프로세스에서 필요한 정보만 부분 테이블로 추가한다.
백업 테이블 추가
컬럼 반정규화
- 중복 컬럼 추가 : 컬럼을 추가하는 것이 유리할 경우
- 파생 컬럼 추가 : 프로세스 수행 시 부하가 염려되는 계산 값을 미리 컬럼으로 저장하여 보관하는 방식 (조회수 등)
- 이력 테이블 컬럼 추가 : 대량의 이력 테이블을 조회하는 경우, 조회 기준이 될만한 컬럼을 미리 추가해 놓는 방식
(최신 데이터 여부 YN 등)
관계 반정규화
중복 관계를 추가하는 것이 성능 측면에서 유리할 경우 추가한다.
03 트랜잭션(Transaction)
데이터를 조작하기 위한 하나의 논리적인 작업 단위이다.
트랜잭션 자세한 설명 게시글
📁[Database/데이터베이스 이론] - [Database] 트랜잭션의 동작 원리와 ACID 속성
(ex)
OX 퀴즈를 맞힌 사람에 한해, 선착순 100개의 쿠폰을 지급하는 경우. 아래와 같은 하나의 단위로 묶을 수 있다.
1. OX 퀴즈 정답 여부 확인
2. 이벤트 응모 이력을 저장한다.
3. 쿠폰을 발행한다.
OX퀴즈의 정답 여부를 확인하고, 이벤트 응모 이력을 저장했는데 쿠폰을 발행하려는 순간 선착순 100개의 쿠폰이 모두 소진된 경우를 생각해 보자. 이 경우 쿠폰 발행은 실패하게 되고, 이벤트 응모 이력 저장 또한 취소되어야 한다.
이 경우, 롤백(rollback)하여 2번 이벤트 응모 이력 저장 이전으로 되돌리는 것이 바람직하다.
04 NULL 값 처리
NULL이란?
NULL은 존재하지 않음, 값이 없음을 의미한다.
A의 "지출" 컬럼에 해당하는 데이터는 0이고, B의 "지출" 컬럼에 해당하는 데이터는 NULL인 경우를 생각해 보자.
언뜻 보면 두 가지 경우가 같아 보일 수 있으나, 0은 데이터가 입력되었으나 0인 것이고, NULL은 데이터가 입력되지 않은 경우를 말한다.
- 데이터를 집계할 때, NULL은 집계 대상에서 제외된다.
- NULL이 포함된 사칙연산의 결과는 항상 NULL이다.
가로 연산에서의 NULL 처리
가로 연산(하나의 row에서의 값 처리)의 경우에 NULL이 포함되어 있으면, 해당 결괏값은 NULL이 된다.
ex) USER A의 "수입" - "지출"을 계산하는 것을 가정
- USER A의 "수입" = 100,000
- USER A의 "지출" = NULL
- USER A의 수입 + USER A의 지출 = NULL <- 계산 결과
"수입"은 100,000원이고, "지출"은 NULL인 경우 결과값은 NULL이다.
반면, "지출"이 0인 경우 결과값은 정상적으로 100,000원이 될 것이다.
세로 연산에서의 NULL 처리
세로 연산(다른 인스턴스의 데이터와 연산)의 경우에는 NULL 값을 그냥 제외한다.
ex) USER A의 "수입"과 USER B의 "수입"을 더하는 경우를 가정
- USER A의 "수입" = 100,000
- USER B의 "수입" = NULL
- USER A의 수입 + USER B의 수입 = 100,000 <- 계산 결과
+ 기타 정리
성능 데이터 모델링
데이터베이스의 성능을 향상시키기 위해 설계 단계부터 성능과 관련된 사항들이 모델링에 반영되는 것
순서
- 데이터 모델에 맞게 정규화 수행
- DB 용량 및 트랜잭션 유형을 파악하여 성능 저하를 일으키는 부분이 없는지 검토
- 용량과 트랜잭션 유형에 맞게 반정규화 수행
- 성능 향상을 위한 PK/FK 조정, 이력모델 조정, 슈퍼/서브타입 조정 등을 수행
- 데이터 모델의 성능을 검증.
'Database' 카테고리의 다른 글
[Database / SQLD] 데이터 모델링의 이해 (Part1 - Ch01) (0) | 2024.04.19 |
---|---|
[Redis] Redisson 분산락(DistributedLock) AOP 적용 (0) | 2023.11.10 |
[Redis] Redisson 분산 락을 간단하게 적용해보기 (0) | 2023.11.07 |
[Redis] 레디스 설치 및 기본 기능 (0) | 2023.11.07 |
[H2 DB] 인메모리 방식 연결 방법 (미설치) (1) | 2023.08.18 |