관계형 데이터베이스의 필요성

 

기존의 테이블에는 데이터의 중복이 존재한다. (author의 egoing, profile의 developer)

데이터가 중복되면 여러 가지 문제가 발생한다. 예를 들어 데이터의 수정이 필요한데 그 데이터가 천만 개라면?

 

이를 해결하기 위해 관계형 데이터베이스가 필요하다.

중복된 데이터들이 사라졌다! author 테이블의 식별값인 id값은 해당되는 데이터에 넣어준다.

 

새로운 topic 테이블에서 egoing을 john으로 수정해야 하면

author 테이블에서 id = 1에 해당하는 데이터의 이름만을 수정해주면 된다. → 유지보수 용이

 


테이블 분리하기

author 테이블과 topic 테이블 각각 만들기

mysql> select * from author;
+----+--------+---------------------------+
| id | name   | profile                   |
+----+--------+---------------------------+
|  1 | egoing | developer                 |
|  2 | duru   | database administrator    |
|  3 | taeho  | data scientist, developer |
+----+--------+---------------------------+
3 rows in set (0.00 sec)

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 |
+----+------------+-------------------+---------------------+-----------+
5 rows in set (0.00 sec)

 

 


JOIN

하나의 테이블에 원하는 데이터가 모두 있다면 참 좋겠지만, 두 개의 테이블을 엮어야 원하는 결과가 나오는 경우가 많다. 조인을 쓰면 두 개의 테이블을 엮어서 원하는 데이터를 추출할 수 있다.

SELECT *
FROM <첫 번째 테이블>
        LEFT JOIN <두 번째 테이블>
        ON <조인 조건> // a.key = b.key
[WHERE 검색 조건]
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                 |
+----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+
5 rows in set (0.00 sec)

 

author_id와 id가 보기 싫으면 보고 싶은 컬럼만 선별해 LEFT JOIN을 하면 된다.

SELECT column1, column2, ⋯
FROM <첫 번째 테이블>
        LEFT JOIN <두 번째 테이블>
        ON <조인 조건> // a.key = b.key
[WHERE 검색 조건]

 

이때 topic 테이블과 author 테이블 둘 다 id 컬럼이 존재하므로 그냥 id라고 쓰면 에러가 난다.

mysql> SELECT id, title, description, created, name, profile FROM topic LEFT JOIN author ON topic.author_id = author.id;
ERROR 1052 (23000): Column 'id' in field list is ambiguous

 

topic 테이블의 id를 의미하고 싶을 때에는 topic.id라고 명시해야 한다.

mysql> SELECT topic.id, title, description, created, name, profile FROM topic LEFT JOIN author ON topic.author_id = author.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                 |
+----+------------+-------------------+---------------------+--------+---------------------------+
5 rows in set (0.00 sec)

 

이렇게 했는데도 뭔가 아쉽다. 저 id가 topic의 id인지 author의 id인지 명시해주고 싶다면 AS를 활용하여 명시하고 싶은 컬럼명을 적어준다.

mysql> SELECT topic.id AS topic_id, title, description, created, name, profile FROM topic LEFT JOIN author ON topic.author_id = author.id;
+----------+------------+-------------------+---------------------+--------+---------------------------+
| topic_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                 |
+----------+------------+-------------------+---------------------+--------+---------------------------+
5 rows in set (0.00 sec)

 

 


인터넷과 데이터베이스

 

인터넷이 동작하기 위해서는 컴퓨터가 최소 두 대 필요하다.

 

  • 클라이언트(client): 사용자의 입력을 처리하여 서버에 요청
  • 서버(server): 클라이언트의 요청을 받아 처리하고, 이를 다시 클라이언트에게 응답으로 보냄

MySQL에서도 마찬가지이다. database client는 서버에 접속할 수 있고, database server에서 실제로 데이터가 저장된다.

그동안 실습을 하면서 우리는 database server를 직접 다루는 것처럼 보였지만 사실은 database client를 통해 서버를 사용하고 있는 것이었다.

지금까지 사용했던 데이터베이스 클라이언트는 MySQL Monitor였고, 또 다른 클라이언트로는 MySQL Workbench가 존재한다. MySQL Workbench는 비주얼 데이터베이스 설계 도구로, 이것을 사용하면 데이터베이스에 있는 정보를 코드가 아닌, 엑셀처럼 마우스로 컨트롤할 수 있다.

 

→ 이 세상에는 어마어마한 MySQL client가 있다고 해도 과언이 아니다.

+ Recent posts