학습 목표: 역정규화는 무엇인가?
성능이나 개발의 편의성을 위해 구조를 바꾸는 것. 정규화를 하고 역정규화를 한다
먼저 두개의 테이블이 있다 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에 따라 테이블을 구분하는 방법이다
반응형
'CS(Computer Science) > 데이터베이스' 카테고리의 다른 글
[ORACLE] ORANGE 글자 크기 및 언어 변경 (3) | 2023.07.31 |
---|---|
데이터베이스 면접 준비 (2) | 2023.05.30 |
[데이터베이스] MySQL(관계형 데이터베이스) (0) | 2023.05.10 |
[데이터베이스] 정보관리도구의 발전 (0) | 2023.05.09 |
데이터베이스(relational database)개념과 relation, primary key(기본키), foreign key(외래키), constraints (1) | 2023.04.04 |
댓글