6. 관계형 데이터베이스(relational database) / table명 변경(백업-RENAME TABLE)한 뒤, 기존 테이블 2개로 분리시키기
관계형 데이터베이스
위의 table에서 데이터가 중복되는 부분이 있다. -> 개선의 여지가 있다.
만약, 중복된 데이터의 수정이 필요한 상황이라면 현재의 상태에서는 모든 데이터를 수정해야할 것이다.
- 중복되는 데이터를 가진 author와 profile을 새로운 author라는 table을 새로 만들어보자.
- 기존의 table에서 author와 profile을 빼고, author_id라는 칼럼으로 대체 + author table의 id값을 대체하자.
- 이제 author테이블 값만 바꾸면 -> topic 테이블의 모든 author_id는 자동으로 변경된 내용이 관계될 것이다.
유지보수가 훨씬 편해진다.
중복을 제거하여 별도의 테이블을 만들고 참조값만 적어주면, 유지/보수의 장점이 생긴다.
하지만, 직관적이지 못한, 별도의 테이블도 열어봐야하는 단점도 생긴다.
그래서 필요한 것이 별도의 테이블로 중복을 방지하여, 유지보수를 편하게 + 볼때는, 하나의 table로 합쳐진 형태의 직관적으로 만들어야하는데, 이것을 관계형 데이터베이스이고 저장할때는 별도로 + 보여줄때는 합쳐서를 실현해보자.
기존 테이블 2개로 분리하기
- 기존의 테이블의 이름 바꿔서 백업하기
RENAME TABLE topic TO topic_backup; - author+profile을 author_id로 참조하는 형태의 새로운 테이블 만들기
mysql> CREATE TABLE topic(
-> id INT(11) NOT NULL AUTO_INCREMENT,
-> title VARCHAR(30) NOT NULL,
-> description TEXT NULL,
-> created DATETIME NOT NULL,
-> author_id INT(11) NULL,
-> PRIMARY KEY(id)
-> ); - author 테이블 새로 만들기
mysql> CREATE TABLE author(
-> id INT(11) NOT NULL AUTO_INCREMENT,
-> name VARCHAR(20) NOT NULL,
-> profile VARCHAR(200) NULL,
-> PRIMARY KEY (id)
-> ); - author 테이블을 기존 백업한 테이블을 보며 데이터 입력하기
INSERT INTO author ( ) VALUES( );
- *id값은 칼럼괄호에 안넣으면 자동으로 1씩 증가하지만, 여기에선 직접 증가한다.
mysql> INSERT INTO author (id, name, profile) VALUES(1, 'egoing', 'developer'); - 새로운 topic 테이블에 author_id값을 입력하면서 새로 작성하자.
mysql> INSERT INTO topic (id, title, description, created, author_id)
-> VALUES(1, 'My SQL', 'MySQL is ...', '2018-02-09 17:49:59', 1); - 나머지 데이터도 이런식으로 입력하다가, 새로운 author가 등장하면
1) author 테이블에서 추가 -> 2) topic테이블에서 author_id 입력을 해주자.
mysql> INSERT INTO topic (id, title, description, created, author_id)
-> VALUES(2, 'Oracle', 'Oracle is ...', '2019-01-04 10:48:24', 1);
mysql> INSERT INTO author (id, name, profile) VALUES(2, 'duru', 'data administrator');
mysql> INSERT INTO topic (id, title, description, created, author_id)
-> VALUES(3, 'SQL server', 'SQL server is ...', '2019-01-04 10:49:23', 2);
mysql> INSERT INTO author (id, name, profile) VALUES(3, 'taeho', 'data scientist, developer');
mysql> INSERT INTO topic (id, title, description, created, author_id)
-> VALUES(5, 'MongoDB', 'MongoDB is ...', '2019-01-04 10:52:30', 1);