📢 공지합니다
이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.
데이터 모델링 순서
- 데이터 모델링을 할 때 정규화를 정확하게 수행한다.
- 데이터베이스 용량산정을 수행한다.
- 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.
- 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.
- 이력모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정 등을 수행한다.
- 성능관점에서 데이터 모델을 검증한다.
정규화
- 데이터 정합성 즉 데이터의 정확성과 일관성을 유지하고 보장을 위해 엔터티를 작은 단위로 분리하는 과정이다.
- 이것을 할 경우 데이터 조회성능은 처리조건에 따라 향샹되는 경우가 있지만 저하되는 경우도 있다.
- 하지만 입력, 수정, 삭제 성능은 일반적으로 향상된다.
제1정규형
- 모든 속성은 반드시 하나의 값만 가져야 된다. 즉 속성에 여러값이 있으면 따로 분리해서 엔터티를 만든다.
- 원자값이 아닌 도메인을 분해한다.
제2정규형
- 엔터티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 한다.
- 하지만 복합식별자일 경우 주식별자의 일부에만 종속될 수 있는데 이것을 분리해 엔터티를 만든다.
- 부분 함수 종속성을 제거한다.
제3정규형
- 주식별자가 아닌 모든 속성간에는 서로 종속될 수 없다. 즉 이것을 따로 분리해 엔터티를 만든다.
- 이행 함수 종속성을 제거한다.
https://lemonandgrapefruit.tistory.com/165
모델링 2 - 정규화 (1차, 2차, 3차 정규화)
▶ 단계별 정규화 과정 • 1차 정규화 : 반복그룹 속성을 추출한다. (도메인이 원자값) - 자식 개체가 추출되고 반드시 식별관계이다. - 주식별자를 가지고 나간다. - 자식 개체 주 식별자에 반드
lemonandgrapefruit.tistory.com
참고하자
반정규화
- 데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑 하는 과정이다.
- 정규화와 반대로 조회성능은 향상될 수 있으나 입력, 수정, 삭제 서능은 저하될 수 있다.
- 데이터 정합성 이슈가 발생할 수 있다.
- 이것은 무조건 정규화가 끝난후에 거치게 된다.
- 정규화를 마친 후 성능상 이슈가 있을때만 고려하는 것이 원칙이다.
- 테이블의 관계가 강결합이어서 같이 조회되는 경우가 대부분일 경우 비정규화를 고려해야한다.
테이블 반정규화
테이블 병합
- 업무 프로스세상 JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려한다.
- 1:M 같은 경우 중복 데이터가 많아지므로 테이블 병합에 적절하지 못한다.
- 1:1, 1:M, 슈퍼 서브 타입 테이블 병합이 있다.
테이블 분할
1. 테이블 수직 분할
- 엔터티의 일부 속성을 별도의 엔터티로 분할(1:1 관계 성립)
- 자주 사용하는 속성이 아니거나 대부분의 인스턴스가 해당 속성값을 NULL로 갖고있을때 고려
- DISK I/O를 경감할 수 있다.
2. 테이블 수평 분할
- 엔터티의 인스턴스를 특정 기준으로 별도의 엔터티로 분할(파티셔닝)
- 파티션 기능을 사용하여데이터를 물리적으로 분리
테이블 추가
- 중복 테이블
데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔터티 추가
동일한 테이블 구조를 중복하여 원격조인을 제거
- 통계 테이블
SUM, AVG 등을 미리 수행하여 계산
- 이력 테이블
마스터 테이블에서 자주 조회되는 레코드를 중복하여 테이블 추가
상품가격 이력 테이블에서 과거의 상품가격에 대한 데이터를 관리
- 부분 테이블
자주 이용하는 칼럼을 모아놓은 별도의 테이블 추가
컬럼 반정규화
중복 컬럼 추가
업무 프로세스상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려
파생 컬럼 추가
미리 값을 계산하여 칼럼에 보관
이력 테이블 컬럼 추가
대량의 이력 테이블 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가
관계 반정규화(중복관계 추가)
- 업무 프로세스상 JOIN이 필요한 경우가 많아 중복 관계를 추가하는 것이 성능 측면에서 유리할 경우 고려
- 무결성을 깨뜨릴 위험이 없다.
트랜잭션
- 데이터를 조작하기 위한 하나의 논리적인 작업 단위
- 트랜잭션은 하나의 커밋 단위로 묶여야한다,
- 데이터 모델로 표현할 수 있다.
- 데이터는 트랜잭션 범위로 묶을 수 있다.
- 항상 서브타입 개별로 처리하는데 테이블은 하나로 통합하여 변화하면 불필요하게 많은 양의 데이터가
집적되어 있어 성능이 저하될 수 있다.
- 논리적 연산단위로서 밀접히 관련되어 분리될 수 없는 한 개 이상의 데이터베이스 조작을 가리킨다.
Dirty Read: 다른 트랜잭션에 의해 수정되었고 커밋되지 않은 데이터를 읽는 것을 말한다.
Non-Repeatable Read: 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상이다.
Phantom Read: 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데 첫번째 쿼리에서 없던 유령 레코드가 두번째 쿼리에서 나타는현상이다.
NULL
- row연산은 NULL이 있으면 값이 NULL이고 column은 NULL값 무시하고 계산
- 0이 아니고 그냥 값이 없다.
- IS NOT NULL은 널이 아닌행을 출력!
- NULL로 계산하면 다 NULL이다.
CH3 SQL 활용(2) (0) | 2023.08.22 |
---|---|
CH3 SQL활용 (0) | 2023.08.21 |
CH2 SQL 기본(2) (0) | 2023.08.15 |
CH2 SQL 기본 (0) | 2023.08.15 |
CH1 데이터 모델링의 이해 (0) | 2023.08.08 |