PART1 데이터 모델링의 이해 / Chapter2 데이터 모델과 SQL
자격증 & 언어/SQLD
PART1 데이터 모델링의 이해 / Chapter2 데이터 모델과 SQL
코린이살려
2022. 8. 24. 14:32
정규화(Nomalization)
- 데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장)을 위해 엔터티를 작은 단위로 분리하는 과정이다.
- 정규화를 할 경우 데이터 조회성능은 처리조건에 따라 향상되는 경우도 있고 저하되는 경우도 있다.
- 일반적으로 입력, 수정, 삭제 성능은 향상된다.
- 제1 정규형
- 모든 속성은 반드시 하나의 값만 가져야 한다. (Table 1)
- 유사한 속성이 반복되는 경우도 1차 정규화 대상이 된다.(Table2)
- 하나의 속성이 다중값을 가지는 경우 데이터를 꺼내 쓸 때 불필요한 Split을 사용해야 하는 번거로움이 발생한다.
- 한 엔터티 내 유사한 속성이 반복되는 경우는 데이터가 늘어날 때 공간낭비가 발생할 여지가 있다.
Table 1
이름 |
생년월일 |
직업 |
이지은 |
1993.05.16 |
배우, 가수, 작곡가 |
↓
이름 |
직업 |
이지은 |
배우 |
이지은 |
가수 |
이지은 |
작곡가 |
Table 2
이름 |
생년월일 |
사이트1 |
사이트2 |
이지은 |
1993.05.16 |
인스타그램 |
페이스북 |
김향기 |
2000.08.09 |
인스타그램 |
싸이월드 |
↓
이름 |
생년월일 |
이지은 |
1993.05.16 |
김향기 |
2000.08.09 |
이름 |
사이트 |
이지은 |
인스타그램 |
이지은 |
페이스북 |
김향기 |
인스타그램 |
김향기 |
싸이월드 |
- 제2 정규형
- 엔터티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 한다.(Tabel 3)
Tabel 3.
주문번호 |
음료코드 |
주문수량 |
음료명 |
1234567890 |
A123 |
2 |
아메리카노 |
1234567891 |
A124 |
3 |
라떼 |
1234567892 |
A125 |
1 |
카푸치노 |
↓
주문번호 |
음료코드 |
주문수량 |
1234567890 |
A123 |
2 |
1234567891 |
A124 |
3 |
1234567892 |
A125 |
1 |
음료코드 |
음료명 |
A123 |
아메리카노 |
A124 |
라떼 |
A125 |
카푸치노 |
- 제3 정규형
- 주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없다.
- 일반속성이 다른 일반속성에 종속된 경우에 제3 정규형을 적용한다. (Table 4)
Table 4
일렬번호 |
이름 |
생년월일 |
소속사코드 |
소속사명 |
1 |
이지은 |
1993.05.16 |
A1001 |
EDAM엔터테인먼트 |
2 |
김향기 |
2000.08.09 |
B1004 |
지킴엔터테인먼트 |
↓
일렬번호 |
이름 |
생년월일 |
소속사코드 |
1 |
이지은 |
1993.05.16 |
A1001 |
2 |
김향기 |
2000.08.09 |
B1004 |
소속사코드 |
소속사명 |
A1001 |
EDAM엔터테인먼트 |
B1004 |
지킴엔터테인먼트 |
주의사항
- 과유불급, 지나친 정규화는 오히려 성능 저하를 일으킬 수 있다.
- 정보를 얻기 위해 여러 번의 JOIN이 불가피한 경우 반정규화를 통해 성능을 개선하여야 한다.
반정규화(De-Nomalization)
- 데이터 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정이다.
- 조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 수 있으며 데이터 정합성 이슈가 발생할 수 있다.
- 반정규화 과정은 정규화가 끝난 후 거치게 되며 정규화와 마찬가지로 일정한 룰이 존재한다.
테이블 반정규화
테이블 병합 |
1:1 관계 테이블 병합 |
1:M 관계 테이블 병합 |
슈퍼 서브 타입 테이블 병합 |
테이블 분할 |
테이블 수직 분할(속성 분할) |
테이블 수평 분할(인스턴스 분할, 파티셔닝) |
테이블 추가 |
중복테이블 추가 |
통계테이블 추가 |
이력테이블 추가 |
부분테이블 추가 |
- 테이블 병합
- 업무 프로세스상 JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려한다.
- 1:M 관계 테이블 병합의 경우 1쪽에 해당하는 엔터티의 속성 개수가 많으면 병합했을 경우 중복 데이터가 많아지므로 테이블 병합에 적절하지 못하다.
- 테이블 분할
- 테이블 수직 분할 : 엔터티의 일부 속성을 별도의 엔터티로 분할 (1:1 관계 성립)
- 테이블 수평 분할: 엔터티의 인스턴스를 특정 기준으로 별도의 엔터티로 분할(파티셔닝)
- 파티션 기능을 사용하여 데이터를 물리적으로 분리 → 관계가 없는 다수의 테이블이 생성된다.
- 테이블 추가
- 중복 테이블 추가: 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔터티를 추가한다.
- 단순히 같은 데이터를 여러 테이블에 저장하는 것을 데이터 정합성에 위배되는 상황을 발생시킬 수 있다.
- 통계 테이블 추가
- 이력 테이블 추가
- 부분 테이블 추가
- Ex. 회원 대상 메일 발송건이 다량으로 생기는 경우 메일 발송에 필요한 정보만 부분 테이블로 생성
칼럼 반정규화
- 중복 컬럼 추가
- 업부 프로세스상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려한다.
- 파생 컬럼 추가
- 프로세스 수행 시 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식으로 상품의 재고나 프로모션 적용 할인가 등이 이에 해당할 수 있다.
- 이력 테이블 컬럼 추가
- 대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식이다. 최신 데이터 여부 등이 이에 해당할 수 있다.
관계 반정규화(중복관계 추가)
- 업무 프로세스상 JOIN이 필요한 경우가 많아 중복 관계를 추가하는 것이 성능 측면에서 유리할 경우 고려한다.
트랜잭션(Transaction)
- 데이터를 조작하기 위한 하나의 논리적인 작업 단위이다.
NULL이란?
- NULL은 존재하지 않음, 즉 값이 없음을 의미한다.
- NULL ≠ 0, 데이터가 입력되지 않은 것이다.
- SQL NULL 처리 방식 (Table 5)
- SELECT 수입 - 지출 FROM Table 5
- 가로 연산: NULL이 포함되어 있으면 결과 값은 NULL이 된다. → NULL
- SELECT SUM(수입) FROM Table 5
- 세로 연산: 다른 인스턴스의 데이터와 연산할 때는 NULL 값을 제외한다. → 0
Table 5.
이름 |
수입 |
지출 |
강산 |
0 |
10 |
지원 |
NULL |
20 |
※ 추가 정보 (문제 풀이 중 나온 개념 정리)
성능 데이터 모델링의 순서
- 데이터 모델이 맞게 정규화를 수행한다
- 데이터베이스의 용량 및 트랜잭션 유형을 파악하여 성능 저하를 일으키는 부분이 없는지 검토한다.
- 용량과 트랜잭션 유형에 맞게 반정규화를 수행한다.
- 성능 향상을 위한 이력모델의 조정, PK/FK 조정, 슈퍼/서브타입 조정 등을 수행한다.
- 데이터 모델의 성능을 검증한다.
트랜잭션
- 트랜잭션은 데이터를 조작하기 위한 논리적인 작업 단위로, 데이터 모델로 표현할 수 이쓰며 데이터는 트랜잭션 범위로 묶일 수 있다.
- 트랜잭션은 하나의 커밋 단위로 묶여야 한다.
NULL
- ㉮ WHERE COL IS NULL 조건과 ㉯ WHERE COL = NULL 조건은 다르다.
- ㉮ 조건은 값이 NULL인 행을 반환한다.
- ㉯ 조건의 결과는 항상 False이므로 아무 행도 반환하지 않는다.
집계함수
COL1 |
COL2 |
10 |
NULL |
NULL |
15 |
30 |
25 |
- SELECT COUNT(COL1)*10 FROM TABLE;
- NULL을 제외하고 계산되어 2*10 = 20
- SELECT SUM(COL1+COL2)/4 FROM TABLE;
- NULL과 사칙연산 결과는 제외되어 55/4 = 13.75
- SELECT SUM(COL2)/2 FROM TABLE;
- NULL을 제외하고 계산되어 40/2 = 20
- SELECT AVG(COL1) FROM TABLE;
- NULL을 제외하고 계산되어 40/2 = 20
정규화
- 1차 정규화
- 2차 정규화
- 3차 정규화
- 4차 정규화
이력 테이블 추가
- 이력 테이블 컬럼 추가는 대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식이다.
- Ex. 최신 가격 여부 컬럼 추가 등
슈퍼-서브 타입
- 공통 속성을 조회하는 빈도수가 개별 속성을 조회하는 빈도수보다 높을 경우 공통 속성과 개별속성을 별도로 관리하는 슈퍼-서브 타입의 설계가 적절하다.
중복 관계 추가
- 반정규화 기법 중 하나로 데이터 무결성을 깨뜨릴 위험성이 없어 데이터 처리 성능을 향상시킬 수 있는 기법이다.
- 테이블 반정규화는 데이터의 무결성을 깨트릴 위험성을 가지고 있다.