[반정규화] 논리적 설계에서의 정규화가 오히려 독일 때

2020. 6. 17. 17:53컴퓨터언어/Database

728x90
반응형

 

 

현실 속의 추상적 개념을 이해하기 쉽게 도식화한 것이 ER 다이어그램이고,

ER 다이어그램의 환상에 효율성을 끼얹은 것이 정규화였다.

2020/06/16 - [컴퓨터언어/Database] - [정규화] 효율적인 데이터베이스 스키마 구축

 

그런데 간혹 정규화가 오히려 성능을 방해하는 경우가 있다.

정규화란 결국 테이블을 여러 개로 쪼개는 것인데, 실제 데이터베이스를 구현해서 사용할 때 조인 연산이 엄청 무겁다면 무결성을 얻는 대신 성능은 바닥을 기고 통장텅장은 텅텅 비게 될 것이다.

 

그래서 이런 현상에 미리 대비하고자, 논리적 설계 이후의 물리적 설계 단계에서는 DB에 대한 쿼리 빈도와 그에 따른 트랜잭션(연산)을 예측하고 분석하여, 정규화가 오히려 독이 될 경우에는 반정규화를 하도록 제시한다.

 

👍 상관모델링

이 예측을 하기 위해서는 정규화를 통해 쪼개진 많은 릴레이션들 중, 어느 릴레이션끼리 조인할 때 연산이 많이 필요한지를 따져보아야 하며, 이를 도와주는 것이 <상관 모델링>이다.

상관 모델링이란, 어떤 업무가 진행됨에 따라 무슨 데이터가 어떻게 변형되는지의 상관성을 분석할 수 있도록 모델링하는 것을 말한다.

여기서 "업무"란 "단위 프로세스(ex 회원가입, 로그인, 주문 등)"를 의미하며, 각 업무별로 CRUD를 분석하여 CRUD MATRIX를 작성해보면 된다.

단위프로세스 \ 엔티티타입(릴레이션) 고객 주문목록 주문 제품
신규고객 회원가입 고객정보 Create      
고객의 제품 주문 누가주문했는지 Read 새로운 주문목록 Create 새로운 주문 데이터 Create 무엇을 주문했는지 Read
고객의 제품 주문량 변경   기존 주문목록 Read 기존 주문 데이터 Update  
고객의 주문 취소   기존 주문목록 Delete 기존 주문목록 Delete  

이렇게 표를 그려보면 "제품 주문" 단위 프로세스에서 트랜잭션이 가장 많이 일어남을 알게 된다.

 

그럼 우리는 이 트랜잭션량을 조절하여 DB의 성능을 끌어올릴 수 있을 것이다.


🙌 반정규화

 

상관모델링을 통해 반정규화할 타겟을 정했다면, 반정규화를 하면 된다.

반정규화는 여러가지 방법이 있다.

 

1) TABLE 병합

정규화 과정에 의해 분리되었던 두 테이블 사이에 트랜잭션이 많이 발생하여, JOIN연산 때문에 DBMS에 과부하를 일으킬 경우 사용

 

2) TABLE 분할(Partitioning)

http://www.dbguide.net/db.db?cmd=view&boardUid=12861&boardConfigUid=9&categoryUid=216&boardIdx=42&boardStep=1

 

수직적 분할(Vertical Partitioning) : 속성(세로)을 기준으로 테이블을 분할

트랜잭션이 테이블 내 모든 속성에 골고루 접근하지 않고 특정 속성들에만 집중적으로 접근할 때, 그 인기많은 속성들을 분할하는 방법

  • 조회 위주의 칼럼과 갱신 위주의 칼럼으로 나뉘는 경우
  • 특별히 자주 조회되는 칼럼이 있는 경우
  • 특정 칼럼 크기가 아주 큰 경우
  • 특정 칼럼에 보안을 적용해야 하는 경우

 

수평적 분할(Horizontal Partitioning) : 레코드(가로)를 기준으로 테이블을 분할

데이터가 그냥 엄청 많아서 정신 없거나, 레코드별 사용빈도의 차이가 큰 경우, 튜플로 쪼개 스캔범위를 축소시켜 한 테이블에서 접근하는 양을 확 감소시킴

  • 하나의 테이블에 데이터가 너무 많이 있고, 레코드 중에서 특정한 덩어리의 범위만을 주로 액세스 하는 경우에 사용한다.
  • 분할된 각 테이블은 서로 다른 디스크에 위치시켜 물리적인 디스크의 효용성을 극대화할 수 있다.
  • 현재는 이러한 수평 테이블의 분할은 DBMS 차원에서 제공하고 있다. 특히 분할의 방법 다양하게 제공하고 있는 추세이다. 분할의 대표적인 방법으로는 범위 분할, 해쉬 분할, 복합 분할 등의 기법이 사용된다. 이러한 DBMS 차원의 분할은 데이터베이스 디자인에서 자세하게 다루어질 것이다.

 

3) 중복컬럼

조인이 자주 일어난다면, 좀 생뚱맞는 컬럼일지라도 합치는 것이 나음

 

4) 파생컬럼 추가

총판매금액처럼 계산이 필요한 경우 필요에 따라 파생컬럼 추가 가능

728x90
반응형