본문 바로가기
CS(Computer Science)/데이터베이스

[데이터베이스] 역정규화란 무엇인가?

by whdgus928 2023. 5. 25.

학습 목표: 역정규화는 무엇인가?

성능이나 개발의 편의성을 위해 구조를 바꾸는 것. 정규화를 하고 역정규화를 한다

 

 

먼저 두개의 테이블이 있다 topic_title별로 tag_name을 알기위해서는 테이블 join을 해야한다.

topic_title tag_id
mysql 1
mysql 2
oracle 3
oracle 4
tag_id tag_name
1 rdb
2 free
3 commercial

위 두 테이블을 아래 테이블로 바꾼다면 join을 하지 않기때문에 더 빠르게 데이터를 불러올수있다. 이런 작업을 역정규화라고 한다.

topic_title tag_id tag_name
mysql 1 rdb
mysql 2 free
oracle 3 commercial
oracle 1 rdb

역정규화를 하게 되면 정규화를 하기 이전에 문제점을 고스란히 갖게된다. 중복이 있어서 다 수정해야하는 등등...

 

다른 사례를 살펴보자

 

저자

id name profile
1 kim developer
2 lee dba

토픽

title description created author_id
mysql mysql is 2011 1
oracle oracle is 2012 1
sql server sql server is 2013 2

두 개의 테이블에서 저자별로 몇개의 토픽을 생성했는가를 알고 싶다. 그럼 아래의 쿼리문을 통해 확인할 수 있다.

select author_id, count(author_id)
from topic
group by author_id;

데이터 개수가 점점 많아질수록 연산이 느려지게 된다. 그래서 토픽 테이블에 행을 추가할때마다 저자아이디를 카운트해서 저자 테이블에 최신화를 하는 방법을 생각해볼수있다.

id name profile topic_count
1 kim developer 2
2 lee dba 1

이런 식으로 테이블을 만드면 기존보다 쉽게 조회할 수 있는 장점이 있지만 항상 값을 유지해야하는 어려움이 생긴다.

 

결국 역정규화란 얻는게 있으면 잃는것도 있는 작업이여서 상황에 맞는 선택이 필요하다.

 

컬럼을 기준으로 테이블을 분리

title description created author_id
mysql mysql is 2011 1
oracle oracle is 2012 1
sql server sql server is 2013 2

위에 테이블을 컬럼을 기준으로 아래의 두 테이블로 분리하는 방법이다. 샤딩이라고도 하고 성능한계에 부딪혔을 때 여러대의 컴퓨터로 스케일 아웃하는 방법이다

title created author_id
mysql 2011 1
oracle 2012 1
sql server 2013 2
title description
mysql mysql is...
oracle oracle is...
sql server sql server is...

 

행 기준으로 테이블 분리

토픽_1000

title description created author_id
mysql mysql is 2011 1
sql server sql server is 2013 2

토픽_1500

title description created author_id
mysql mysql is 2011 1500

author_id에 따라 테이블을 구분하는 방법이다

 

 

 

반응형

댓글