SQLD - 2주차 데이터 모델과 SQL

glory_young·2025년 7월 20일

SQLD

목록 보기
2/3

데이터 모델과 SQL

1. 정규화

  • 데이터베이스 이상현상 (Anomaly)
    : 데이터를 입력, 수정, 삭제하는 과정에서 일관성이 깨지는 경우
    - 삽입이상
    - 데이터 삽입 시 의도하지 않은 정보까지 삽입
    - 갱신이상
    - 중복 저장된 데이터 중 하나만 갱신
    - 삭제이상
    - 데이터 삭제 시 의도하지 않은 정보까지 삭제

⇒ 이러한 문제를 방지하기 위해 중복을 최소화하며 테이블을 잘 조직된 상태로 분해하는 과정을
정규화라고 함

제1정규형

모든 속성이 하나의 속성값을 가지는 상태 (atomic values) (속성의 원자성 확보)

제2정규형

주식별자가 복합식별자인 경우, 일반속성이 주식별자의 일부에만 종속성을 가질 때(→ 부분 함수종속성), 이를 제거한 상태

(ex)

(함수종속성)

[관서번호, 납부자번호] → {직급명, 통신번호}
[관서번호] → {관서명, 관서등록일자}

(테이블)

관서번호, 납부자번호 | 관서명, 관서등록일자, 직급명, 통신번호

⇒ 2차 정규화를 하면

관서번호 | 관서명, 관서등록일자
납부자번호, 관서번호 | 직급명, 통신번호

제3정규형

주식별자가 아닌 일반 속성간 함수종속성이 존재 (→ 이행함수종속성), 이를 제거한 상태

a→ b, b→c 이면 a→c 관계가 성립
제3정규화의 수행 결과 분리된 엔터티들은 서로 비식별자 관계임


2. 관계와 조인의 이해

정규화로 테이블이 분해된 상황에서는 조회 시 조인 발생이 많아지면서 성능이 떨어질 수 있음
데이터 정합성과 조회성능 간 트레이드 오프 관계가 성립

성능 데이터 모델링

  1. 데이터 모델링 시 정규화를 정확하게 수행
  2. 데이터베이스 용량산저을 수행
  3. 발생되는 트랜잭션의 유형 파악
  4. 용량과 트랜잭션의 유형에 따라 반정규화 수행
  5. 이력모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정 등을 수행
  6. 성능관점에서 데이터 모델을 검증

테이블의 반정규화

데이터의 조회성능이 중요한 경우 반정규화가 필요

데이터의 중복을 허용하거나 데이터를 그룹핑하여 조회성능을 높임

반정규화 수행 절차

  1. 반정규화 대상 조사
    : 범위처리 빈도수 조사, 통계성 프로세스 조사, 테이블 조인 개수 등
  2. 다른 방법 검토
    : 뷰 테이블 생성, 인덱스 조정, 클러스터링 적용, 응용 애플리케이션에서의 처리 등 대안 검토
  3. 반정규화 적용

1. 테이블 병합

발생빈도가 높아서 아예 하나로 합치는 것

※ 슈퍼타입/서브타입 관계 테이블 병합

2. 테이블 분할

  • 수직분할
    : 한 테이블에 너무 많은 칼럼이 존재하는 경우. 특정 속성에만 접근이 빈번한 경우.
  • 수평분할
    : 속성값에 따라 구분하여 조회하는 경우. 스키마는 원래 테이블과 동일.

3. 테이블 추가

  • 중복 테이블 추가
    : 다른 업무에 있는 테이블과 동일한 구조의 테이블을 추가하여 원격 조인을 제거
  • 통계 테이블 추가
    : 통계값 연산을 미리 계산하여 저장하는 테이블 추가
  • 이력 테이블 추가
    : 변경 이력 등 이력 데이터 관리를 위한 테이블 추가
  • 부분 테이블 추가
    : 디스크 I/O를 줄이기 위한 방법으로 특별히 자주 사용하는 속성만 모아서 추가

칼럼의 반정규화

  1. 중복 칼럼 추가
    : 조인을 감소시키기 위해 자주 사용하는 칼럼을 추가
  2. 파생 칼럼 추가
    : 트랜잭션 처리 시 계산에 의한 부하를 줄이기 위해 계산값을 별도의 칼럼으로 추가
  3. 이력 테이블 칼럼 추가
    : 이력 테이블에 조회 조건에 해당하는 기능성 칼럼 추가
  4. PK에 의한 칼럼 추가
    : PK를 파싱해서 추가적인 내용을 조회하는 경우 이를 일반속성으로 추가
  5. 응용 시스템 오작동을 위한 칼럼 추가
    : 이전 데이터를 임시적으로 중복하여 보관하는 기법 (백업 데이터)

관계의 반정규화

여러 관계를 거쳐 다수의 조인을 통해 처리가 가능하지만 중복된 관계를 추가로 맺음


3. 트랜잭션의 이해

All or Nothing
작업이 완전하게 처리되거나 전혀 처리되지 않아야 함. 중간에 미완결된 상태로 중단되어서는 안됨

트랜잭션 관련 명령

  • commit - 작업을 정상처리 완료 후에 DB 반영
  • rollback - 작업 취소하고 이전상태로
  • savepoint - 부분 작업 취소를 위한 저장점 지정

트랜잭션 특성

데이터를 읽고 쓸 때 한번에 수행되어야하는 논리적 작업단위

  • 원자성
  • all or nothing
  • 일관성
  • 트랜잭션 이전에 오류가 없다면 트랜잭션 이후에도 오류 없음
  • 고립성
  • 독립적으로 수행되어 다른 트랜잭션이 간섭하거나 영향을 미치지 않음
  • 영속성
  • 트랜잭션의 결과는 데이터베이스에 영구적으로 저장

트랜잭션 격리수준이 낮을때는

  • dirty read
  • non-repeatable read
  • phantom read
    문제가 생길 수 있음

4. NULL

값이 입력되지 않은 상태. 값이 없는 상태
0과 공백과 문자열 “NULL”과 다른 상태임


5. 본직식별자 & 인조식별자

본질식별자
: 업무에 존재하는 원래 식별자

인조식별자
: 원래 존재하지는 않지만 업무가 복잡하여 인위적으로 만든 식별자

읹조식별자를 주식별자로추가하는 경우 추가적인 연산없이 시퀀스나 키 제약조건 등을 통해 주식별자를 생성할 수 있어 편의성이 향상됨.

반면 데이터 중복이 발생하고 별도의 인덱스 생성 등이 필요하다는 단점있음.

0개의 댓글