Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

RUBY

[220531] SQLD _ 06. 정규화(Normalization), 반정규화(De-Normalization), 트랜잭션(Transaction), NULL 본문

자격증/SQL 개발자

[220531] SQLD _ 06. 정규화(Normalization), 반정규화(De-Normalization), 트랜잭션(Transaction), NULL

ruby-jieun 2022. 5. 31. 11:50

정규화

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

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

 

(1) 제 1 정규형

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

(2) 제 2 정규형

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

(3) 제 3 정규형

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

(4) 주의사항

  과유불급이란 말이 있듯이 적절한 정규화는 성능상 이롭지만 지나친 정규화는 오히려 성능 저하를 일으킬 수 있다.

 

반정규화

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

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

 반 정규화 과정은 정규화가 끝난 후 거치게 되며 정규화와 마찬가지로 룰이 존재한다.

 

1. 테이블 반정규화

  1) 테이블 병합 

     * 업무 프로세스상 JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려

     * 1 : M 관계 테이블 병합의 경우 1쪽에 해당하는 엔터티의 속성 개수가 많으면 병합했을 경우 중복 데이터가 많아지므로 테이블 병합에 적절하지 못함

     (1) 1 : 1 관계 테이블 병합

     (2) 1 : M 관계 테이블 병합

     (3) 슈퍼 서브 타입 테이블 병합

  2) 테이블 분할

     (1) 테이블 수직 분할(속성 분할)

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

     (2) 테이블 수평 분할(인스턴스 분할, 파티셔닝)

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

  3) 테이블 추가

     (1) 중복 테이블 추가

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

     (2) 통계 테이블 추가

     (3) 이력 테이블 추가

     (4) 부분 테이블 추가

 

2. 컬럼 반정규화

  1) 중복 컬럼 추가

     * 업무 프로세스상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려

  2) 파생 컬럼 추가

     * 프로세스 수행 시 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식

  3)이력 테이블 컬럼 추가

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

 

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

  * 업무 프로세스상 JOIN이 필요한 경우가 많아 중복 관계를 추가하는 것이 성능 측면에서 유리할 경우 고려

 

트랜잭션

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

 

NULL

 NULL은 존재하기 않음, 즉 값이 없음을 의미함

Comments