관계형 DB 앞에 붙은 말은 Relation
이다.
표라고 하는 형태로 데이터를 다룬다.
표를 사용하다보면 표가 커지게 된다. 이때, 관계형 DB를 사용하면
표를 필요에 따라 쪼개고 합칠 수 있다.
만약 topic테이블에 각각의 게시글을 누가 썼는지, 그리고 그 사람에 대한 소개글을 추가한다고 해보자.
이렇게 되면, hyejin
이라는 사람에 대한 소개를 바꾸고 싶다고 하면, 만약 1억개라면 1억번을 바꿔야한다. 이것을 바꾸는데 3년이 걸린다고 한다...
그리고 만약 게시글을 쓰지 않은 사람에 대한 소개는 나타낼 수 없다.
그러므로 표를 쪼개보자.
토픽
에 대한 내용과 저자
에 대한 내용으로 나눠보자.
그리고, 저자에도 id
값을 줘서 식별자로 주자.
그리고 토픽
테이블에 author
테이블의 id를 적으면 된다.
만약 dang의 프로필을 변경하고싶다면 하나만 변경하면 다 바뀌는 폭발적인 효과를 가져올 수 있다.
그리고 저자이지만 한번도 글을 작성하지 않은 사람도 author테이블에 있을 수 있다.
표를 분해하면 쓰기는 좋아지만 읽기가 불편해진다.
그러므로 JOIN
을 이용해서 필요에 따라 조립해서 마치 원래 조립된 상태인 것 처럼 보여줄 수 있다.
SELECT *
FROM topic LEFT JOIN author ON topic.author_id=author.id;
그러면 우리눈에 보이는 결과는 위처럼 된다.
이것이 JOIN
의 환상적인 기능이다!
이제 SQL Developer를 통해 테이블을 분해해보자!
먼저, author
라는 테이블을 추가해야한다.
접속한 DB의 테이블에 우클릭을 해서 테이블을 생성하자.
PK
도 설정해주자! 그 다음 DDL
이라는 것을 클릭해보면 위 처럼 나온다.
그다음 실행을 눌러주면
테이블에 author가 추가됐다.
그리고 topic 테이블에 author id 값을 추가해줘야 한다.
topic
테이블에서 열을 클릭하고 해당 버튼을 누르면 테이블을 편집할 수 있다.
적어주고 확인을 누르면 AUTHOR_ID
컬럼이 추가된 것을 확인할 수 있다.
Author
테이블의 id
값도 1씩 증가하게 만들어줄 시퀀스를 만들어보자.
우클릭 해서 새 시퀀스
를 누르자.
이렇게 적고 확인을 누르면 새 시퀀스가 생성된다.
이제 sql로 author에 값을 넣어보자
insert into author(id, name, profile)
values ( seq_author.nextval, 'hyejin', 'DBA');
저 버튼을 누르면 실행이 된다. 아니면 Ctrl+Enter
를 치면 된다!
성공~
Author테이블을 보면 행이 추가된 것을 볼 수 있다.
이제 topic 테이블에 가서 author_id를 1로 바꾸자!
(사실 외래키를 사용하면 더 편할테지만 아직은 때가 아니다!)
커밋 버튼을 꼭 눌러줘야 반영된다.
insert into author(id, name, profile)
values ( seq_author.nextval, 'dang', 'developer');
insert into author(id, name, profile)
values ( seq_author.nextval, 'dangdang', 'data scientist');
둘다 추가해주자~
sql developer은 한행 한행씩 실행한다! (Ctrl+enter)
잘 추가됐다!
insert into topic
values ( seq_topic.nextval, 'MongoDB', 'Mongo DB is ...',SYSDATE,3);
토픽 테이블에 데이터를 하나만 더 추가하자!
(author_id가 3인 사람이 작성한 게시글)
이제 다음에는 JOIN을 해보자!
여기서, AUTHOR_ID
와 같은 속성을 외래키(Foreign Key)
라고 한다.
select *
from topic left join author on topic.author_id=author.id;
아까 엑셀에서 예상했던 대로 똑같이 나왔다!! 신기!
select topic.id as topic_id, title, name
from topic left join author on topic.author_id=author.id;
출력되는 id가 누구의 id인지 모를 때, 위 처럼 별명(allias)를 주면 된다.
as
는 생략 가능하다.
select T.id as topic_id, title, name
from topic T left join author on T.author_id=author.id;
select
T.id as topic_id, title, name
from topic T
left join author A
on T.author_id=A.id;
테이블에도 별명을 지어줄 수 있다!
만약 토픽테이블 id가 1인 행만 갖고오고 싶다면,
select
T.id as topic_id, title, name
from topic T
left join author A
on T.author_id=A.id
where
T.id=1;
where절을 이용해서 하면 가능하다!
실제로, 데이터베이스를 이렇게 직접적으로 데이터베이스만을 사용하는 경우는 없다. 사용자가 사용하는 UI와 데이터베이스 사이에 존재하는 중간 다리 역할이 middleware
이다. jsp, spring, servlet, php, python, node.js, ruby와 같은 것이 미들웨어다.
오라클 여행이 끝났는데, 이 다음은 관계형 데이터 모델링 방법
에 대해 배우고,
그 다음은 SQL Join
을 배울 것이다! 그다음 Docker
다음은 MySQL
, SQLite
로..!! SQL Server
도 배우고싶다!