본문 바로가기
공부/MySQL

관계형 데이터 모델링 (3)

by 드인 2020. 3. 2.

7. 물리적 데이터 모델링

- 논리적 데이터 모델링이 관계형 데이터베이스 패러다임에 잘 맞는 이상적인 표를 만드는 것이었다면, 물리적 데이터 모델링은 선택한 데이터베이스 제품에 맞는 현실적인 고려는 하는 방법론

- 이 단계에서 가장 중요한 것은 성능입니다. 특히 역정규화(반정규화, denormalization)의 사례를 집중적으로 다룸

1) 물리적 데이터 모델링

- find slow query => 느려지는 지점 찾을 수 있음 -> 성능 향상 위한 방법 적용

- denormalization(역정규화, 반정규화)

- index : 읽기 편하나 쓰기 어려움(연산 과정 -> 시간, 저장 공간 많이 듦)

- application : 캐시 사용(입력에 따른 실행결과 저장 -> 데이터베이스 부하 감소)

- 다양한 방법 시도해본 후에 마지막으로 역정규화를 통해 표의 구조를 바꿈

 

2) 역정규화 소개

- denormalization(역정규화, 반정규화) : 정규화를 통해서 만든 이상적인 표를 성능이나 개발 편의성을 위해서 구조를 바꾸는 것

- 정규화 : 쓰기의 편리함을 위해서 읽기의 성능을 희생

- 정규화로 인해 속도가 느려지는 경우 발생 -> 최후의 수단 - 역정규화

 

http://bit.ly/2WLMCko

 

denormalization - http://bit.ly/2WLMCko

final Origin author,topic,topic_tag_relation,tag,topic_type id,name,profile,title,description,created,author_id,topic_title,tag_id,id,name,title,type,price,실험용 데이터 1,kim,developer,MySQL,MySQL is ...,2011,1,MySQL,1,1,rdb,MySQL,paper,10000 2,lee,dba,ORACLE,O

docs.google.com

- 역정규화

(1) 하나의 표 안에서 column을 바꿈

(2) 하나의 표를 여러개의 표로 쪼개는 것

(3) 테이블과 테이블 사이의 관계성을 조작해서 일종의 지름길을 만듦

 

3) 역정규화 : 컬럼을 조작해서 join을 줄이기

- Join을 하지 않기 때문에 더 빠르게 데이터 가져올 수 있음

- 목표 : 각각의 저자가 몇개의 글을 작성했는지를 목록으로 표현한다.

ALTER TABLE `topic_tag_relation` ADD COLUMN `tag_name` VARCHAR(45) NULL AFTER `tag_id`;
UPDATE `topic_tag_relation` SET `tag_name` = 'rdb' WHERE (`topic_title` = 'MySQL') and (`tag_id` = '1');
UPDATE `topic_tag_relation` SET `tag_name` = 'free' WHERE (`topic_title` = 'MySQL') and (`tag_id` = '2');
UPDATE `topic_tag_relation` SET `tag_name` = 'rdb' WHERE (`topic_title` = 'ORACLE') and (`tag_id` = '1');
UPDATE `topic_tag_relation` SET `tag_name` = 'commercial' WHERE (`topic_title` = 'ORACLE') and (`tag_id` = '3');

 

SELECT tag_name FROM topic_tag_relation WHERE topic_title = 'MySQL';

 

4) 역정규화 : 컬럼을 조작해서 계산을 줄이기

- 목표 : 각각의 저자가 몇개의 글을 작성했는지를 목록으로 표현한다.

- 역정규화 이전 쿼리

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

 

- 테이블 변경 쿼리

ALTER TABLE `author` ADD COLUMN `topic_count` INT NULL AFTER `profile`;
UPDATE `author` SET `topic_count` = '2' WHERE (`id` = '1');
UPDATE `author` SET `topic_count` = '1' WHERE (`id` = '2');

 

SELECT id, topic_count FROM author;

 

5) 역정규화 : 표를 쪼개기

(1) 테이블의 역정규화 - 컬럼을 기준으로 테이블을 분리

topic_description

title description
MySQL MySQL is ...
ORACLE ORACLE is ...
SQL SERVER

SQL SERVER is ...

-> 최후의 수단으로 사용

 

(2) 테이블의 역정규화 - 행을 기준으로 분리

topic_1000

title description created author_id
MySQL MySQL is ... 2011 1
ORACLE ORACLE is ... 2012 1

-> 이론적으로는 문제가 없으나 관리하기 힘듬

 

- 테이블의 역정규화는 여러대의 서버로 분산할 수 있을 때 사용

 

6) 역정규화 : 관계의 역정규화

- 지름길을 만든다

- 목표 : 저자의 태그 아이디와 태그명을 조회한다.

- 역정규화 이전 쿼리

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;

 

- 역정규화 이후 쿼리

ALTER TABLE `topic_tag_relation` ADD COLUMN `author_id` INT NULL AFTER `tag_name`;
UPDATE `topic_tag_relation` SET `author_id` = '1' WHERE (`topic_title` = 'MySQL') and (`tag_id` = '1');
UPDATE `topic_tag_relation` SET `author_id` = '1' WHERE (`topic_title` = 'MySQL') and (`tag_id` = '2');
UPDATE `topic_tag_relation` SET `author_id` = '1' WHERE (`topic_title` = 'ORACLE') and (`tag_id` = '1');
UPDATE `topic_tag_relation` SET `author_id` = '1' WHERE (`topic_title` = 'ORACLE') and (`tag_id` = '3');

 

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;

 

'공부 > MySQL' 카테고리의 다른 글

관계형 데이터 모델링 (2)  (0) 2020.03.02
관계형 데이터 모델링 (1)  (0) 2020.02.27
SQL join  (0) 2020.02.26
DATABASE2-MySQL(4)  (0) 2019.07.31
DATABASE2-MySQL(3)  (0) 2019.07.31