본문 바로가기

DATABASE

관계형 데이터 모델링(3) - 물리적 데이터 모델링

관계형 데이터 모델링의 마지막 순서인 물리적 데이터 모델링에 대해 알아보자.

 

논리적 데이터 모델링이 관계형 데이터베이스에 맞는 이상적인 표를 만드는 것이라면,

물리적 데이터 모델링에서는 이상적인 표를 구체적인 제품에 맞는 현실적인 표로 만드는 것으로,

여기서는 성능을 향상시키는 방법이 중요한 요소이다.

 

Denormalization(역정규화, 반정규화)

정규화를 통해 이상적인 표를 만들었지만,

성능과 개발의 편의성을 위해 정규화 이전으로 표의 구조를 바꾸는 것을 역정규화, 또는 반정규화라고 한다.

성능을 위해 역정규화가 필요할 때도 있으나, 일단 정규화를 먼저 하고 난 다음에 필요하다면
역정규화를 하는 것이 이상적인 순서이며 정규화가 무조건 성능을 저하시키는 것은 아니다.

-유튜브 '생활코딩' 中

정규화를 하게 되면 표들이 여러 개로 쪼개지게 되는데

정규화는 쓰기에 편리함을 위해 읽기(성능)을 희생하는 것이라고 볼 수 있다.

따라서 성능을 위해 역정규화가 필요할 때도 있으나, 일단 정규화를 먼저 하고 난 다음에 필요하다면

역정규화를 하는 것이 이상적인 순서이며 정규화가 무조건 성능을 저하시키는 것은 아니다.

 

역정규화의 대상

  • 하나의 표 안에서 컬럼을 바꾼다
  • 하나의 표를 여러 개의 표로 쪼갠다
  • 테이블과 테이블 사이의 관계성을 조작해서 일종의 지름길을 만든다

 

역정규화 1. 컬럼중복 : JOIN을 줄이기

JOIN은 비싼 작업이다.

성능을 위하여 JOIN을 줄여야 하는 상황이다.

출처 http://bit.ly/2WLMCko

topic_tag_relation은 tag의 name을 알고싶은 상태로, JOIN이 필요한 상황이다.

출처 http://bit.ly/2WLMCko

중복을 허용하여 topic_tag_relation 테이블에 tag의 name을 넣는다면 JOIN을 하지 않고 표를 다룰 수 있게 된다.

쿼리를 이용하여 이렇게 테이블의 구조를 바꾸고 JOIN 없이 WHERE로 데이터를 가져오면 훨씬 빠르게 가져올 수 있다.

출처 http://bit.ly/2WLMCko

 

 

역정규화 2. 파생 컬럼의 형성 : 계산 작업을 줄이기

출처 http://bit.ly/2WLMCko

위의 표에서 각각의 저자가 몇 개의 글(topic)을 작성했는지 목록으로 표현하고 싶은 상황이다.

topic 테이블의 author_id 값들이 각각의 author_id 별로 같은 행동이 몇 개 있는지 카운트하면 되는데,

이런 경우 GROUP BY를 사용해야 하는데 GROUP BY가 빈번하면 상당히 비싼 작업이 될 수 있다.

 

author 테이블에 topic_count 컬럼을 추가해서 역정규화 하면 GROUP BY 없이 표현이 가능하다.

출처 http://bit.ly/2WLMCko

 

역정규화 3. 하나의 표를 성능 향상을 위해 여러 개로 분리

만약 topic 테이블의 컬럼 중 description 컬럼의 용량이 매우 커서 해당 컬럼을 포함하여 데이터를 조회하면

성능이 저하되는 경우,

1)description을 제외한 테이블을 만들고 2)description와 title(primary key)만 가지고 있는 테이블 topic_description을 새로 만들어서 표를 분리하면 성능저하를 방지할 수 있다.

출처 http://bit.ly/2WLMCko

 

행을 기준으로 테이블을 분리하는 경우도 있다.

예를 들어 topic 테이블의 author_id가 1번부터 2000번까지 있다면

1~1000번까지는 topic_1000

1001~2000번까지는 topic_2000

이런 식으로 분리하는 것이다.

사용자에 따라 데이터를 저장하는 표를 구분하면 무한히 많은 처리량을 소화할 수 있게 된다.

출처 http://bit.ly/2WLMCko

 

 

역정규화 4 : 지름길을 만든다

Foreign 키를 추가하여 JOIN을 줄여서 지름길을 만드는 방법이다.

만약 특정한 저자의 태그 아이디와 태그 명을 조회하고 싶어 topic_tag_relation, tag, topic 테이블을

JOIN해야 한다면 여러번 JOIN하게 되어 성능이 저하될 수 있다.

topic_tag_relation 테이블에 author_id 컬럼을 추가해서 조회할수 있도록 하면 JOIN을 줄일 수 있다.

출처 http://bit.ly/2WLMCko
2번 JOIN -> 1번 JOIN, 출처 http://bit.ly/2WLMCko

 

 

 

 

 

 

해당 게시글은 '생활코딩' 님의 관계형 데이터 모델링 강의를 참고하였습니다.

출처 https://www.opentutorials.org/course/3883/25352