데이터 베이스의 필요성
- 데이터를 저장하고 활용하기 위해서 데이터 베이스가 필요하다
1. In-Memory
특정 프로그램이 실행될 때에만 존재하는 데이터
2. File I
엑셀 시트나 CSV 파일처럼 특정 형태의 파일들은 대용량의 데이터를 저장하기 위한 목적으로 존재 X
반면 데이터베이스 시스템의 주 목적은 데이터의 크기에 상관없이 안정적으로 저장하고 빠르게 데이터를 검색하는 것
관계형 데이터베이서는 하나의 CSV 파일이나 엑셀 시트를 한 개의 테이블로 저장할 수 있으며 한번에 여러 개의 테이블을 가질 수 있기 때문에 SQL을 활용해 복잡하거나 큰 용량의 데이터를 가져오기가 수월
SQL 이란?
SQL(Structured Query Language) 데이터베이스 언어의 기준으로 주로 관계형 데이터베이스에서 사용 된다.
ex) MySQL, Oracle, SQLite, PostgresQL 등
SQL = “구조화된 쿼리 언어”
쿼리(query)란?
쿼리는 질의문입니다. 검색을 할 때 입력하는 검색어도 일종의 쿼리라고 볼 수 있습니다. 기존에 존재하는 데이터를 검색어로 필터하듯이 쿼리는 저장되어 있는 정보를 필터하기 위한 질문으로 볼 수 있습니다.
따라서 SQL이란 한 마디로 데이터베이스에 쿼리를 보내 원하는 데이터만을 가져올 수 있게 해주는 데이터베이스 용 프로그래밍 언어입니다.
SQL 종류
Data Definition Language (DDL)
DDL은 데이터베이스의 테이블과 같은 오브젝트를 정의할 때 사용되는 언어를 가리킵니다. 예를 들어 테이블을 만들 때 사용하는 CREATE 이나 테이블을 제거할 때 사용되는 DROP등이 있습니다.
Data Manipulation Language (DML)
DML은 데이터베이스에 데이터를 변경할 때 사용되는 언어를 가리킵니다. INSERT처럼 새로운 레코드를 추가하거나, 데이터를 삭제하는 DELETE, 변경하는 UPDATE 등의 문법이 여기에 포함됩니다.
Data Control Language (DCL)
DCL은 데이터베이스에 대한 접근 권한과 관련된 문법입니다. 어느 유저가 데이터베이스에 접근할 수 있는지에 대한 권한을 설정하거나 없애는 역할이죠. 권한을 주는 GRANT나 권한을 가져가는 REVOKE등이 포함됩니다.
Data Query Language (DQL)
DQL은 정해진 스키마 내에서 쿼리를 할 수 있는 언어입니다. 여기에 포함된 문법은 SELECT 등이 있습니다. 물론 이렇게 따로 언어가 분류되지만 DQL을 DML의 일부분으로 말하곤 합니다.
Transaction Control Language (TCL)
TCL은 DML을 거친 데이터의 변경사항을 수정할 수 있습니다. 예를 들어 COMMIT처럼 DML이 작업한 내용을 데이터베이스에 기록하거나 ROLLBACK처럼 커밋했던 내용을 다시 취소하는 문법들이 있습니다.
관계형 데이터베이스
관계형 데이터베이스는 영어로 Relational Database 라고 불립니다. 그 이유는 구조화된 데이터가 하나의 테이블로 표현이 되고, 테이블 간의 상호작용을 관계(Relation) 라고 하기 때문입니다.
다시 말해 테이블을 사용하는 데이터베이스를 뜻합니다.
- 데이터 : 각 항목에 저장되는 값입니다.
- 테이블 : 사전에 정의된 행과 열로 구성되어 있는 구조화된 데이터입니다.
- 필드 (혹은 column) : 테이블의 열을 가리킵니다.
- 레코드 (혹은 tuple) : 테이블의 한 행의 저장된 정보입니다.
- 키 : 테이블의 각 레코드를 구분할 수 있는 값. 각 레코드마다 고유값이어야 하며 기본키 (primary key) 와 외래키 (foreign key) 등이 있을 수 있습니다.
관계 종류
테이블 간 관계는 다음과 같이 나눌 수 있습니다:
- 1:1 관계
- 1:N 관계
- N:N 관계
1:1 관계
테이블의 레코드 하나당 다른 테이블의 한 레코드와 연결되어 있는 경우입니다.
예를 들어 다음과 같은 'User' 테이블과 'Phonebook' 테이블이 있다고 하겠습니다.
유저 테이블에서는 유저의 이름과 'phone_id' 라는 외래키를 가지고 있습니다.
'Phonebook' 테이블에서는 전화번호를 보관하고 있습니다.
한 개의 전화번호당 한 명의 유저를 가지고 그 반대도 동일하다면 이것은 1:1 관계 (One-to-one relationship) 이라고 볼 수 있습니다.
하지만 이러한 관계는 흔치 않습니다. 그 이유는 1대1 관계라면 두 개의 테이블을 하나로 합쳐서 표현하는 방식이 더 보편적이기 때문입니다.
유저 테이블에 있는 'phone_id' 가 기재되어 있지만 사실 한 유저당 하나의 전화번호만 있는 것이라면 따로 관리하지 않고 유저 테이블에 추가할 수도 있는 부분이죠.
1:N 관계
테이블의 레코드 하나당 여러 개의 레코드와 연결되어 있는 경우입니다.
예를 들어 유저와 전화번호의 테이블의 관계가 다음과 같다고 하겠습니다.
이번에는 한 유저가 한 전화번호를 가질 수 있는 것이 아니라 여러 개의 전화번호를 가질 수 있습니다. 하지만 그 반대는 성립할 수가 없습니다.
즉, 한 전화번호는 한 명의 유저만 가질 수 있습니다. '일대다' 관계는 관계형 데이터베이스에서 제일 많이 사용됩니다.
가장 흔하게 사용되는 관계입니다.
N:N 관계
여러 개의 레코드가 여러 개의 레코드를 가지는 관계입니다. 해당 관계의 경우에는 따로 '조인 테이블'을 만들어 관리를 하게 됩니다.
일대다 관계와 비슷하지만 이번에는 양방향에서 다수를 가질 수 있는 경우에 해당합니다.
예를 들어 여행 상품이 있다고 하겠습니다. 여러 개의 여행 상품이 있고 여러 명의 고객들이 있을 때 한 고객은 여러 개의 여행 상품을 사용할 수 있습니다. 마찬가지로 한 여행 상품은 여러 명의 고객을 가질 수 있죠.
위와 같은 테이블들이 존재하면 어떻게 '다대다' 관계를 표현할 수 있을까요?
생각해보면 다대다 관계는 두 개의 일대다 관계라고 볼 수 있습니다. 그렇다면 양 테이블에서 일대다 관계를 형성할 수 있는 새로운 테이블을 만들어서 관리를 해줄 수 있습니다.
이러한 테이블은 조인 테이블이라고 부릅니다. 즉, 다음과 같이 테이블 관계가 정리됩니다.
만약에 외래키를 리스트 형식으로 관리하는 필드를 추가하게 된다면 어떤 문제가 발생할 수 있을까요?
위 테이블에서는 한 고객은 여러 개의 여행 상품을 가질 수 있고 한 여행 상품 또한 여러 개의 고객을 가질 수 있습니다.
보시면 'customer_package' 테이블의 역할은 그저 customer_id 와 package_id 를 묶어주는 역할을 합니다. 이 테이블을 통해서 어떤 고객이 어떤 여행 상품들을 가지고 있는지 혹은 어떤 여행 상품이 어떤 고객들을 가지고 있는지 등을 확인할 수 있습니다. 중요한 것은 이를 따로 테이블로 생성했을 때에도 동일하게 기본키가 있어야 하는 겁니다.
자기참조 관계 (Self Referencing Relationship)
때로는 테이블 내에서도 관계가 필요할 때가 있습니다. 예를 들어 추천인이 누구인지 파악하기 위한 목적, 혹은 조직 내에 상하 관계 등을 표현하기 위한 것일 수도 있죠.
다음과 같이 유저 테이블이 있고 'recommend_id' 는 추천인 아이디입니다.
관계를 보겠습니다. 일단 한 유저당 한 명의 추천인을 입력할 수 있습니다. 즉, 한 유저당 하나의 추천인을 가질 수 있습니다. 하지만 추천인 입장에서는 여러 개의 유저를 가질 수 있습니다. 복수로 추천될 수 있다는 뜻입니다.
정리하자면 각 유저당 한 명만 추천할 수 있지만 추천 받은 사람은 여러 명에서부터 추천을 받게 되는 셈이죠.
1:N 관계와 비슷하다고 보실 수 있습니다.
📚 Reference
SQL 조인 시각 사이트
SQL 연습 사이트
데이터베이스 정규화
'Data Engineer' 카테고리의 다른 글
Status code 정리 (100 ~ 500) (0) | 2023.05.08 |
---|---|
SQL Deeper (ACID) (0) | 2023.05.08 |
Data Models이란? (0) | 2023.05.08 |
DBMS vs RDBMS의 차이 (0) | 2023.05.08 |
Docker 란? (0) | 2023.04.30 |