티스토리 뷰

Database

역정규화(denormalization)

Seogineer 2022. 6. 27. 23:00

역정규화

  • 성능이나 개발의 편의성을 위해서 테이블의 구조를 바꾸는 것
  • 여러 대의 서버로 데이터를 분산할 때 사용할 수 있다.

 

조인 줄이기

많은 조인은 시스템에 부하를 줄 수 있기 때문에 조인을 줄여서 부하를 줄일 수 있다.

 

조인을 하지 않고 테이블을 조회할 수 있도록 컬럼을 추가했다.

하지만, topic_tag_relation 테이블은 중복이 발생하고 tag 테이블이 존재하면서 동시에 tag_name 컬럼이 존재하는 중복도 같이 발생해버렸다.

 

 

계산 작업을 줄이기

 

GROUP BY와 같은 명령어는 데이터가 많은 경우 많은 비용이 발생할 수 있다.

SELECT author_id, COUNT(author_id)
FROM topic
GROUP BY author_id

 

topic_count 컬럼을 추가해서 쿼리를 대체할 수 있다. 하지만 항상 topic_count의 값을 계속 갱신해야 하는 부담이 생긴다.

 

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

 

용량이 큰 description 컬럼을 분리함으로서 성능을 향상시킬 수 있다. 그리고 두 테이블 모두 사용량이 많다면 각각의 테이블을 다른 시스템에 저장해서 쓰기/읽기를 수행함으로서 분산을 통해 성능 향상을 시킬 수 있다.(샤딩)

 

행을 기준으로 테이블을 분리

author_id 1~1000, 1000~2000 같은 식으로 따로 분리하고 1~1000 사이의 사용자는 topic_1000에 요청을 보내도록 설계할 수 있다.

 

관계의 역정규화

 

author_id 1의 tag name을 조회하고 싶은 경우 너무 많은 조인이 발생할 수 있다.

SELECT tag.id, tag.name
FROM topic_tag_relation AS TTR
LEFT JOIN tag ON TTR.tag_id = tag.id
LEFT JOIN topic ON TTR.topic_title = topic.title
WHERE author_id = 1

 

아래와 같이 테이블을 변경하면 조인 한번으로 조회할 수 있다.

SELECT tag.id, tag.name
FROM topic_tag_relation AS TTR
LEFT JOIN tag ON TTR.tag_id = tag.id
WHERE TTR.author_id = '1'

 

 

참고

https://opentutorials.org/course/3883/25352

댓글
Total
Today
Yesterday
링크
Apple 2023 맥북 프로 14 M3, 스페이스 그레이, M3 8코어, 10코어 GPU, 512GB, 8GB, 한글