1. 데이터 중복 최소화 (목적)
데이터베이스 관리에 있어서 데이터가 중복된다는것은 명백하게 '개선할 부분'이 있다는 것을 의미한다.
데이터 양이 적을 경우, 중복이 크게 영향을 미치지 않지만
대량의 데이터를 관리하게 될 경우 '데이터 중복'은 엄청나게 큰 비용이기 때문이다.
단순히 데이터를 보관하는 비용이 커질 뿐만 아니라 데이터를 수정할 때도 시간적, 경제적 비용이 어마어마하다.
예시로, 다음의 topic 테이블을 보자.
위의 테이블을 보면 author 컬럼과 profile 컬럼 데이터가 중복되는 것을 확인할 수 있다.
이 경우 데이터 보관도 보관이지만.. 만약 author = 'Hee'인 데이터를 수정하려면 하나하나 수정해주어야 한다.
지금은 2개의 데이터만 수정하면 된다고 생각하겠지만, 중복데이터가 만약 수천 개 수억 개라면?
유지 보수 측면에서 매우 큰 비용이 발생한다 (=>매우 번거롭다🤦♀️)
이 때문에 데이터 중복을 최소화 하기 위해 테이블을 따로 분리한다.
2. 테이블 분리 (방법)
중복을 최소화 하기 위해 테이블을 따로 분리하지만,
두 테이블은 특정 관계를 맺으며 이 관계를 통해 데이터를 연결지어 조회할 수 있다.
이 때, 관계를 맺고 있는 두 테이블 중 반드시 하나는 부모 테이블이고 하나는 자식 테이블이다.
💡 부모 테이블의 기본키(Primary key)는 자식 테이블에 외래키(Foreign Key)로 전이 되어진다.
기본키(Primary key; PK) - 하나의 행을 다른 행과 유일하게 구별할 수 있도록 해 주는 열
외래키(Foreign key; FK) - 다른 개체(테이블)을 참조할 때 사용하는 필드
두 테이블의 관계를 살펴보자.
topic 테이블에 author 정보를 연결해야 하는데 이 때 author 정보가 있어야지만 해당 데이터를 연결 할 수 있다.
※ 즉, author 테이블이 부모테이블 topic 테이블이 자식테이블이 된다.
따라서, '부모 테이블의 기본키(Primary key)는 자식 테이블에 외래키(Foreign Key)로 전이 되어진다.' 는 공식에 따라
author 테이블의 기본키 id 는 topic 테이블의 외래키 author_id 가 된다.
이처럼 중복되는 데이터를 별개의 테이블로 나누어 데이터 중복을 최소화, 유지보수를 쉽게하고 DB 관리 효율을 높일 수 있다.
🔍 중복은 최소화했는데.. 두 테이블의 정보가 모두 보고싶을 땐 ?
분리된 테이블을 연결해서 기존의 정보처럼 topic 정보와 author 정보를 모두 조회하고 싶다면, 두 테이블이 author_id = id로 관계를 맺고 있기 때문에 해당 (공통) 컬럼을 이용해서 연결하여 조회 할 수 있다.
이 때 사용하는 것이 바로 JOIN !
3. JOIN
- 각각의 테이블에 분리되어 있는 연관성 있는 데이터들을 연결하거나 조합하는 일련의 작업들
- 여러 테이블에 흩어져 있는 정보 중에서 사용자가 필요한 정보만 가져와서 가상의 테이블 간 '공통된 열'을 기준으로 검색
select (조회 할 컬럼) from 테이블 A join 테이블 B on A.공통컬럼 = B.공통컬럼
만약, 위 테이블 조회 결과에서 autho_id, id1부분을 제외한 결과를 조회하고 싶다면
전체컬럼 (*) 이 아닌 개별 컬럼들의 목록을 적어주면 된다.
select id, title, description, created, name, profile
from topic join author on topic.author_id = author.id;
하지만, 이 경우 id컬럼이 2개 이상이기 때문에 DB에서 어떤 id를 조회해야할 지 모른다는 (id 필드가 명확하지않다.)는 오류가 발생한다.
이 경우에 어떤 테이블의 id를 사용할 지만 명확하게 표시해주면 해결된다. (topic.id)
select topic.id, title, description, created, name, profile
from topic join author on topic.author_id = author.id;
🔍 조인의 종류
1) 내부 조인(inner join)
inner join : 양쪽 테이블에 데이터가 있는 경우에만 출력됨
2) 외부 조인(outer join)
inner join과는 반대로 한쪽 테이블에는 데이터가 있고, 한쪽 테이블에 없는 경우에 데이터가 있는 쪽 테이블의 내용을 전부 출력하게 하는 방법
3) self join
원하는 데이터가 하나의 테이블에 다 들어 있을 경우, 하나의 테이블을 메모리상에서 별명을 두 개로 사용해서 가상으로 2개의 테이블로 만든 후 조인 작업을 수행
4) cross join(카티션 곱)
조인조건이 없는 경우, 두 테이블의 데이터를 곱한 개수만큼의 데이터가 출력됨
참고 : 유튜브 생활코딩 www.youtube.com/playlist?list=PLuHgQVnccGMCgrP_9HL3dAcvdt8qOZxjW
테이블 분리 : opentutorials.org/module/3300/19521
'DataBase > MySQL' 카테고리의 다른 글
[MySQL] 내장 함수 정리 (2) | 2021.03.07 |
---|---|
[MySQL] 데이터 한번에 입력하기 (Data import) (0) | 2021.03.07 |
[MySQL] CRUD - Create, Select, Insert, Update, Delete (2) | 2021.03.04 |
[MySQL] 사용자 추가/권한부여/삭제 - Toad 연결 (2) | 2021.03.04 |
[MySQL Client] 토드 Mysql 다운로드 : Toad for MySQL (0) | 2021.03.03 |