[ #5 ] MySQL - 관계형 DB의 필요성

mysql> SELECT * from topic;
+----+------------+-------------------+---------------------+----------+---------------------------+
| id | title      | description       | created             | author   | profile                   |
+----+------------+-------------------+---------------------+----------+---------------------------+
|  1 | MySQL      | MySQL is ...      | 2021-07-03 23:11:45 | sanghyuk | developer                 |
|  2 | ORACLE     | ORACLE is ...     | 2021-07-04 00:24:59 | sanghyuk | developer                 |
|  3 | SQL server | SQL server is ... | 2021-07-04 00:25:29 | john doe | database administrator    |
|  4 | PostgreSQL | postgreSQL is ... | 2021-07-04 00:26:27 | Joe      | data scientist, developer |
|  5 | MongoDB    | MongoDB is ...    | 2021-07-04 09:57:25 | sanghyuk | developer                 |
+----+------------+-------------------+---------------------+----------+---------------------------+

위 테이블을 보면 저자들에 대한 정보가 중복되는것을 확인할 수 있는데요,

테이블에 데이터가 중복해서 들어가 있는경우

  • 중요한 신호
  • 개선할 것이 있다라는 증거 입니다.

행이 1억개라고 생각하고 천만개 데이터가 중복된다면 여러가지 문제가 생깁니다. 그리고 그데이터가 엄청난 크기의 데이터라면 더 큰 문제가 되겠죠.

또한 위 테이블 같은 경우에는 이름과 프로필이 같을경우에 그 사람이 같은사람인지 다른사람인지 판별할 방법이 없기도 하죠

이를 해결하기위해 저자에 관련된 부분과 토픽을 테이블에서 아래와 같이 분리시켜 줍니다.

topic 테이블

mysql> SELECT * FROM topic;
+----+------------+-------------------+---------------------+-----------+
| id | title      | description       | created             | author\_id |
+----+------------+-------------------+---------------------+-----------+
|  1 | MySQL      | MySQL is...       | 2018-01-01 12:10:11 |         1 |
|  2 | Oracle     | Oracle is ...     | 2018-01-03 13:01:10 |         1 |
|  3 | SQL Server | SQL Server is ... | 2018-01-20 11:01:10 |         2 |
|  4 | PostgreSQL | PostgreSQL is ... | 2018-01-23 01:03:03 |         3 |
|  5 | MongoDB    | MongoDB is ...    | 2018-01-30 12:31:03 |         1 |
+----+------------+-------------------+---------------------+-----------+

author 테이블

mysql> SELECT * FROM author;
+----+--------+---------------------------+
| id | name   | profile                   |
+----+--------+---------------------------+
|  1 | egoing | developer                 |
|  2 | duru   | database administrator    |
|  3 | taeho  | data scientist, developer |
+----+--------+---------------------------+

중복을 없애주고, 동일명, 동일 프로필의 경우도 알아낼 수 있어 좋긴한데, 첫번재 테이블 처럼 모든 정보를 볼 수가 없습니다.

하지만 이는 데이터를 조회할때 관계형 데이터베이스의 꽃인 JOIN 쿼리를 활용하여 이전에 보이던 것처럼 바꿀 수 있습니다.

문법

SELECT * FROM <table1> LEFT JOIN <table2> ON <table1데이터> = <table2데이터>;

여기서 ON 절에는 어떻게 두 테이블을 조인할 것인가에 대한 조건을 담아주는 절인데, topic 의 author_id와 author 테이블의 id를 맵핑하면 되겠죠.

실습

mysql> SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id;
+----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+
| id | title      | description       | created             | author\_id | id   | name   | profile                   |
+----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+
|  1 | MySQL      | MySQL is...       | 2018-01-01 12:10:11 |         1 |    1 | egoing | developer                 |
|  2 | Oracle     | Oracle is ...     | 2018-01-03 13:01:10 |         1 |    1 | egoing | developer                 |
|  3 | SQL Server | SQL Server is ... | 2018-01-20 11:01:10 |         2 |    2 | duru   | database administrator    |
|  4 | PostgreSQL | PostgreSQL is ... | 2018-01-23 01:03:03 |         3 |    3 | taeho  | data scientist, developer |
|  5 | MongoDB    | MongoDB is ...    | 2018-01-30 12:31:03 |         1 |    1 | egoing | developer                 |
+----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+

제일 처음 다 합쳐져 있던 테이블과 얼추 비슷한데, author_id와 id부분이 거슬리네요. 원하는 컬럼만 보고싶을때는 SELECT절에 원하는 컬럼을 적어주면되겠죠?

mysql> SELECT t.id, t.title, t.description, t.created, a.name, a.profile 
FROM topic t LEFT JOIN author a 
ON t.author_id = a.id;
+----+------------+-------------------+---------------------+--------+---------------------------+
| id | title      | description       | created             | name   | profile                   |
+----+------------+-------------------+---------------------+--------+---------------------------+
|  1 | MySQL      | MySQL is...       | 2018-01-01 12:10:11 | egoing | developer                 |
|  2 | Oracle     | Oracle is ...     | 2018-01-03 13:01:10 | egoing | developer                 |
|  3 | SQL Server | SQL Server is ... | 2018-01-20 11:01:10 | duru   | database administrator    |
|  4 | PostgreSQL | PostgreSQL is ... | 2018-01-23 01:03:03 | taeho  | data scientist, developer |
|  5 | MongoDB    | MongoDB is ...    | 2018-01-30 12:31:03 | egoing | developer                 |
+----+------------+-------------------+---------------------+--------+---------------------------+

유의할 점은 선택한 컬럼이 어떤테이블에서 올건지에 대한점을 정해줘야 한다는 점입니다. 이때 조금더 간결하기 위해서 FROM절에서 ALIAS설정을 해주면 조금더 편하죠 topic AS t 라고 해줘도되고 한칸띄우고 t를 적어줘도 무방합니다.