02 데이터 모델과 SQL

seo0·2024년 2월 18일
post-thumbnail

정규화(Normalization)

데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장)을 위해 엔티티를 작은 단위로 분리하는 과정

정규화를 할 경우 데이터 조회성능은 처리조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만 입력, 수정, 삭제 성능은 일반적으로 향상

하지만 모든 엔티티를 무작정 분리하면 안되고 일정한 규칙에 따라 정규화 해야함



제 1정규형

모든 속성은 반드시 하나의 값만 가져야 함

하나의 속성이 다중값을 갖는 경우 어플리케이션에서 데이터를 꺼내 쓸 때 불필요한 split을 사용해야하는 식의 번거로움이 생길 수 있음

또한 한 엔티티 내에 유사한 속성이 반복되는 경우의 문제점은 데이터가 늘어갈 때 계속해서 속성을 추가해야 하고 반대로 모든 인스턴스가 추가된 속성의 개수만큼 속성값을 가지고 있지 않을 수 있으므로 공간의 낭비가 발생할 여지가 있음



제 2정규형

엔티티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 함

주식별자가 단일식별자가 아닌 복합식별자인 경우 일반속성이 주식별자의 일부에만 종속될 수 있음
이 경우 해당 데이터가 한 테이블에 존재하면 데이터 이상현상이 발생할 수 있음
-> 존재하지 않는 데이터를 더이상 입력할 수 없는 삽입 이상 현상과 하나의 데이터가 변경될 경우 해당 데이터에 대한 모든 데이터를 변경해야하는 수정 이상 현상 발생



제 3정규형

주식별자가 아닌 모든 속성간에는 서로 종속될 수 없음



주의사항

적절한 정규화는 성능상 이롭지만 지나친 정규화는 오히려 성능 저하를 일으킬 수 있음
원하는 데이터를 찾기위해 여러번의 join이 불가피할 때는 오히려 반정규화를 통해 성능을 개선해야하는데 어떤 측면의 성능을 우선으로 할 것이냐를 선택해야 함




반정규화(De-Nonmalization)

데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑하는 과정

조회 성능은 향상될 수 있으나 입력, 수정, 삭제 성능은 저하될 수 있으며 데이터 정합성 이슈가 발생할 수 있음



테이블 반정규화

구분세부사항
테이블 병합1:1 관계 테이블 병합
1:N 관계 테이블 병합
슈퍼서브 타입 테이블 병합
테이블 분할테이블 수직 분할(속성 분할)
테이블 수평 분할(인스턴스 분할, 파티셔닝)
테이블 추가중복 테이블 추가
통계 테이블 추가
이력 테이블 추가
부분 테이블 추가

테이블 병합

업무 프로세스상 join이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리한 경우 고려
1:N 관계 테이블 병합의 경우 1쪽에 해당하는 엔티티의 속성 개수가 많으면 병합했을 경우 중복 데이터가 많아지므로 테이블 병합에 적절하지 않음


테이블 분할

테이블 수직 분할

엔티티의 일부 속성을 별도의 엔티티로 분할(1:1 관계 성립)

자주 사용해야하는 속성이 아니거나 대부분의 인스턴스가 해당 속성값을 null로 갖고 있을 때 고려

테이블 수평 분할

엔티티의 인스턴스를 특정 기준으로 별도의 엔티티로 분할(파티셔닝)


테이블 추가

중복 테이블 추가

데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔티티를 추가

통계 테이블 추가

예 ) 주문 데이터를 이용해 월매출 테이블에 통계치를 미리 계산하여 저장

이력 테이블 추가

예 ) 상품 가격 이력 테이블에서 과거의 상품 가격에 대한 데이터를 관리

부분 테이블 추가

예 ) 회원 대상 메일 발송건이 다량으로 생기는 경우 메일 발송에 필요한 정보만 부분 테이블로 생성



컬럼 반정규화

중복 컬럼 추가

join이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려

파생 컬럼 추가

부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식

이력 테이블 컬럼 추가

대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가



관계 반정규화(중복 관계 추가)

join이 필요한 경우가 많아 중복관계를 추가하는 것이 성능 측면에서 유리할 경우 고려




트랜잭션(Transaction)

데이터를 조작하기 위한 하나의 논리적인 작업 단위

예 ) 퀴즈 정답을 맞춘 선착순 100명에게 쿠폰을 주기로 했다면 이벤트 응모 이력과 쿠폰 발행이 논리적으로 하나의 단위로 묶여야 함 -> 퀴즈 정답을 맞춰 이벤트 응모 이력은 저장되었지만 그 순간 선착순 쿠폰이 모두 소진된 경우 쿠폰 발행은 실패하게 되고 이벤트 응모 이력 또한 롤백되어야 하기 때문




NULL

NULL이란?

null은 존재하지 않음, 즉 값이 없음을 의미

null은 값이 없기 때문에 0과는 다른 값

가로 연산

null이 포함되어 있으면 결과값은 null

SELECT 수입 - 지출 FROM 테이블

생년월일이름수입지출직업
20000101강산010000대학생
19921231이로운NULL20000프리랜서
19900505김수안100000030000개발자

결과는 아래와 같음

수입 - 지출
-10000
NULL
970000

세로연산

다른 인스턴스의 데이터와 연산할 때는 NULL 값을 제외

SELECT SUM(수입) FROM 테이블

생년월일이름수입지출직업
20000101강산010000대학생
19921231이로운NULL20000프리랜서
19900505김수안100000030000개발자

결과는 아래와 같음

SUM(수입)
1000000

0개의 댓글