정규화
테이블(엔터티 = 테이블 = 릴레이션)에다가 데이터를 입력 수정 삭제하는 과정에서, 예컨대 한쪽에 있는 데이터는 수정 한쪽은 그대로 두면 일관성이 깨지는 상황이 발생한다. 이런 사고를 방지하기 위해 데이터 중복을 최소화 하는 것이 정규화.
정규화를 수행하면 통상적으로 입력,수정,삭제 성능은 올라가지만 조회성능은 떨어진다.(정보의 보안과는 관련 없음)
- 제1정규화 : 엔터티의 속성값이 여러 개로 구성 => 중복값 제거, 기본값 설정하여 주식별자와 1:1 관계
('속성의 원자성을 확보한다'고 표현한다.)
- 제2정규화 : 기본키가 2개 이상인 경우 => 주식별자에 종속적이지 않는 테이블은 별도 분리
('부분 함수종속성을 갖고 있어 2차정규화 대상이다' 라는 문장으로 표현된다)
- 제3정규화 : 일반 속성 간에 종속성이 있는 경우 이를 제거(주식별자와는 관계없음)
('이행 함수종속성이 제거된 상태'이다.)
- BCNF(보이스-코드 정규화) : 후보키가 아닌 속성이 결정자인 함수종속성이 존재하는 경우 = 일반 속성 중 하나가 일부 주식별자의 결정자가 되는 경우 수행
JOIN
엑셀에서 VLOOKUP을 생각하면 된다. 두 표를 공통의 식별자를 통해 합치는 과정이다. 엑셀에서도 많은 셀에 VLOOKUP이 걸리면 과부하가 걸리듯, 조인은 많은 연산이 발생하여 높은 부하가 걸린다. 이를 방지하기 위해서는 데이터에 중복값을 애초에 넣어주면 되는데, 이러면 위에 서술한 것 처럼 일관성이 깨질 우려가 있다. 데이터의 정합성과 조회성능 사이에는 서로 상충하는 관계(Trade-Off)가 성립한다.
반정규화
정규화의 반대로 데이터의 중복을 허용하여 조회성능을 높히는 작업이다. 구조의 단순화를 통한 성능향상, 비용절감 등이 필요한 상황에서 사용한다.(대상 조사 및 검토 -> 대안 검토 -> 적용 순) 반정규화는 모델의 유연성을 낮춘다.
- 테이블 반정규화 : 병합, 분할, 추가 등
* 수직분할
- 일부 칼럼에 빈번한 접근 발생시 -> 별도 테이블로 분리하여 1:1 관계
- 로우체이닝 발생 시 -> 칼럼의 일부 분리
* 수평분할
- 속성값에 따른 구분 조회 발생 시 -> 그룹핑하여 분할 (예> 연도별 조회)
* 슈퍼타입-서브타입 변환 방법
1. One to One : 슈퍼타입, 서브타입 테이블들을 각각 개별테이블로 구성
2. Plus Type : 각각의 서브타입에 슈퍼타입을 더하여 슈퍼 + 서브 테이블로 구성 -> 슈퍼+서브 JOIN 연산 성능저하에 활용
3. Single Type(=All in One) : 전체를 하나의 테이블로 통합 -> 전체를 동시에 조회하는 UNION 성능저하에 활용
* 로우체이닝 : 한 테이블에 너무 많은 컬럼이 존재할 경우 두 개 이상의 블록에 걸쳐 저장됨. 수직분할해야함.
* 파티셔닝 : 한 테이블에 너무 많은 데이터가 존재할 경우 동일한 여러 테이블로 나눠 저장하는 기법.
* 클러스터링 : 여러 개의 서버를 하나로 묶어 사용하는 기법
* 샤딩 : 동일한 스키마를 가진 여러 대의 데이터베이스에 데이터를 분산 저장하는 수평 분할 기법
- 컬럼 반정규화 : 중복추가, 파생추가, 이력 테이블 추가, PK에 의한 칼럼 추가, 이전데이터 추가 등
- 관계 반정규화 : 중복된 관계를 추가하는 방법
트랜잭션
데이터를 읽고 쓸 때 한번에 실행되는 연산 작업 단위. 예컨대 데이터를 하나 추가하는 작업을 수행했다고 가정하면, 데이터 삽입 과정의 시작과 끝이 하나의 트랜잭션이다. 이 작업은 All or Nothing, 실행이 되었거나 실패했거나 둘 중 하나의 결과만 존재할 수 있다. 추가가 되다 말았다와 같은 어중간한 결과는 없는데, 이것을 원자성이라 부른다. 또한 일관적으로 트랜잭션의 전에 데이터베이스에 오류가 없었다면, 실행 후에도 오류가 없어야 한다. 데이터 추가 중에 수정이 일어날 수 없는 것처럼 개별 작업 단위는 독립적으로 수행되는 고립성을 띄고 있으며, 실행되면 그 결과는 데이터베이스에 영구적으로 저장되는 영속성(=지속성)을 갖는다.
본질식별자와 인조식별자
본질식별자는 데이터 모델링이 기본적으로 가지는 고유한 원래의 식별자를 말한다. 반면, 인조식별자는 업무 상 편의를 위해 임의로 인위적으로 만든 식별자를 말한다. 예컨대 도서관 DB가 있다고 생각해보자. 기본적인 본질식별자로는 회원을 구분하는 회원번호, 도서를 구분하는 도서번호, 책 대여 오더에서 발생하는 대여번호 등이 있을 수 있다. 개별 회원별 주문 목록을 리스트화 하기 위해서는 회원번호-도서번호-주문번호의 연결이 필요하기에 주문목록 테이블은 복합식별자를 가지게 된다. 이를 쉽게 구분짓기 위해 회원번호와 도서번호와 주문번호를 하나로 합쳐서 이를 '주문목록번호'라는 식별자로 만든다면, 이것이 인조식별자이다. 인조식별자는 주식별자 생성 시 추가적 연산 없이 시퀀스 객체를 사용할 수 있어 편의성이 있지만 중복데이터 발생의 우려가 있다.
성능을 고려한 모델링 활동
성능 데이터 모델링은 [ 모델링 시 정규화 수행 -> DB 전체 용량 산정 -> 트랜잭션 유형 분석 -> 반정규화 -> 기본키/외래키, 슈퍼/서브타입 조정 -> 성능 관점에서 검증 ] 순으로 진행한다.
성능 개선 작업은 가급적 초기에 이루어져야 한다. 데이터 모델 자체가 시스템의 특성을 잘 반영하여 설계되어야 하며, 미진한 설계가 이루어지게 되면 많은 재작업 비용이 발생한다.
'공부노트' 카테고리의 다른 글
[SQLD] 1. 데이터 모델링의 이해 핵심 키워드 요약 (1) | 2025.02.10 |
---|---|
신용관리사 핵심정리 (0) | 2023.08.29 |
댓글