관계형 데이터베이스 (Relational Database)
MySQL 은 관계형 데이터베이스 중의 하나라고 할 수 있습니다.
관계형 데이터베이스의 특징은 정보를 하나의 테이블에 담는 것이 아니라
목적에 따라 여러개의 테이블에 나누어 담는 것인데요.
예를 들어 보겠습니다.

출처: Opentutorials - DATABASE2 MySQL - 15.관계형 데이터베이스의 필요성
{: .text-right}
정보를 이처럼 한 테이블에 담는다면, 일단 사용자가 보기에는 편할 것입니다.
모든 정보를 이 한 테이블에서 얻어낼 수 있을테니까요.
하지만 데이터를 관리하는 관리자 입장에서는 이런 테이블은 유지/보수 하기가 어려울 뿐더러,
중복되는 정보들에 의미 부여를 하기가 어렵습니다.
만약 위의 테이블에서 ‘egoing’ 이라는 글쓴이 정보를 ‘EGOING’ 이라고 바꿔야한다면
id가 1,2,5인 테이블을 하나하나 바꿔야 합니다.
만약 이 테이블에 더 많은 정보가 들어있었다면 더 많은 수정 작업이 필요했을 것입니다.
또한 ‘egoing’ 이라는 또다른 동명이인 글쓴이가 존재한다면, 이 테이블을 통해서는 동일한 글쓴이인지 판별하기가 어렵습니다.

출처: Opentutorials - DATABASE2 MySQL - 15.관계형 데이터베이스의 필요성
{: .text-right}
하지만 위와같이 테이블을 author 테이블과 topic 테이블로 나눈다면 문제를 해결할 수 있습니다.
topic 테이블의 author 필드는 author_id 필드로 대체되었고, 본래 topic 테이블에 담겨있던 author 필드와 profile 필드의 정보들은 author 테이블로 옮겨졌습니다.
그리고 author 테이블에 id 필드를 만들어 topic 의 author_id 와 대응되게 하였습니다.
이제 관리자는 ‘egoing’ 이라는 글쓴이 정보를 ‘EGOING’ 으로 수정하려 할때
여러번의 수정없이 author 테이블의 id=1 에 해당하는 ‘egoing’ 만 수정하면 topic 테이블 전체에 수정하는 효과를 가져올 수 있습니다.
또한 만약 ‘egoing’ 이라는 이름을 가진 동명이인이 글을 쓴다고 하면, author 테이블에 id=4이고 ‘egoing’ 이름을 가진 새로운 레코드를 추가함으로써 의미적으로 ‘id=1 egoing’ 과 ‘id=4 egoing’ 을 구분할 수 있을 것입니다.
이러한 관계형 데이터베이스의 특징을 살펴보면서 이전에 JavaScript 공부를 하며 느꼈던 ‘함수의 필요성’과 많이 유사함을 느낄 수 있었습니다. 유지/보수와 의미부여 측면에 있어서요.
전부 똑같다고 볼 순 없겠지만, 지금은 이런식으로 이해하면 도움이 될 것 같습니다.
> JOIN 사용해보기
이제 테이블을 나누었으니, 데이터 관리자 입장에서는 한결 수월해졌습니다.
하지만 사용자 입장에서는 오히려 불편해졌지요. 하나였던 테이블을 두개에 걸쳐 번갈아가며 정보를 확인해야 하니까요.
이를 해소할 방법이 있습니다. ‘JOIN’ 입니다.
JOIN 은 두 개의 테이블 사이에 공통되는 정보를 바탕으로 합성하는것입니다.
일단 사용법은 ‘SELECT’ 문에 JOIN문을 추가하는 형식인데,
SELECT * FROM [테이블명] JOIN [조인할 테이블명] ON [조건절]
이렇습니다. 예를 들어보겠습니다.
1 2 3 4 5 6 7 8 9 10
| mysql> SELECT * FROM topic JOIN author ON topic.author_id = author.id; +----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+ | id | title | description | created | author_id | id | name | profile | +----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+ | 1 | MySQL | MySQL is ... | 2019-01-30 08:00:00 | 1 | 1 | egoing | developer | | 2 | Oracle | Oracle is ... | 2019-01-30 08:01:00 | 1 | 1 | egoing | developer | | 5 | MongoDB | MongoDB is ... | 2019-01-30 08:02:00 | 1 | 1 | egoing | developer | | 3 | SQL Server | SQL Server is ... | 2019-01-30 08:03:00 | 2 | 2 | duru | data administrator | | 4 | PostgreSQL | PostgreSQL is ... | 2019-01-30 08:04:00 | 3 | 3 | taeho | data scientist, developer | +----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+
|
위와같이 topic.author_id 와 author.id 가 같은 레코드끼리 합성해 보여주고 있음을 알 수 있습니다.
SELECT 문의 조건을 이용해서 더 깔끔하게 표현할 수 있습니다.
1 2 3 4 5 6 7 8 9 10
| mysql> SELECT topic.id, title, description, created, name, profile FROM topic JOIN author ON topic.author_id = author.id ORDER BY id ASC; +----+------------+-------------------+---------------------+--------+---------------------------+ | id | title | description | created | name | profile | +----+------------+-------------------+---------------------+--------+---------------------------+ | 1 | MySQL | MySQL is ... | 2019-01-30 08:00:00 | egoing | developer | | 2 | Oracle | Oracle is ... | 2019-01-30 08:01:00 | egoing | developer | | 3 | SQL Server | SQL Server is ... | 2019-01-30 08:02:00 | duru | data administrator | | 4 | PostgreSQL | PostgreSQL is ... | 2019-01-30 08:03:00 | taeho | data scientist, developer | | 5 | MongoDB | MongoDB is ... | 2019-01-30 08:04:00 | egoing | developer | +----+------------+-------------------+---------------------+--------+---------------------------+
|
또한 필드명을 원하는 이름으로 바꿔서 보여주고 싶을때는 'AS' 키워드를 사용하면 됩니다.
1 2 3 4 5 6 7 8 9 10
| mysql> SELECT topic.id, title, description, created, name AS author, profile FROM topic JOIN author ON topic.author_id = author.id ORDER BY id ASC; +----+------------+-------------------+---------------------+--------+---------------------------+ | id | title | description | created | author | profile | +----+------------+-------------------+---------------------+--------+---------------------------+ | 1 | MySQL | MySQL is ... | 2019-01-30 08:00:00 | egoing | developer | | 2 | Oracle | Oracle is ... | 2019-01-30 08:01:00 | egoing | developer | | 3 | SQL Server | SQL Server is ... | 2019-01-30 08:02:00 | duru | data administrator | | 4 | PostgreSQL | PostgreSQL is ... | 2019-01-30 08:03:00 | taeho | data scientist, developer | | 5 | MongoDB | MongoDB is ... | 2019-01-30 08:04:00 | egoing | developer | +----+------------+-------------------+---------------------+--------+---------------------------+
|
이제 관계형 데이터베이스의 특징을 이용해서
데이터 관리자에게 편리한 테이블 구조를 만듦과 동시에
사용자에게도 동일한 정보에 동일한 가독성을 주는 데이터베이스를 만들어보았습니다.