데이터베이스 개념 정리
목차
1. 데이터베이스 개념 및 특징
2. RDBMS 테이블 구조
3. 테이블 관계
4. 키(KEY)
5. 조인(JOIN)
6. 쿼리(Query)
1. 데이터베이스 개념 및 특징
개념
서비스를 하게 되면 필연적으로 데이터가 생성되며(고객 데이터, 재고 등), 서버는 이러한 데이터를 효율적으로 저장하고 관리하기 위해 DBMS라는 것을 사용한다.
데이터베이스란 일정한 규칙을 통해 구조화되어 저장된 데이터의 모음이다. 이러한 데이터베이스를 제어하기 위한 시스템을 DBMS(Database Management System)라고 한다. 대표적인 DBMS에는 MySQL, ORACLE 등이 존재한다.
데이터베이스(DB, Database) - 일정한 규칙으로 구조화되어 저장된 데이터 모음
DBMS(Database Management System) - DB를 제어하기 위한 시스템
특징
1. 실시간 접근성(Real-Time Accessibility)
>> 비정형적인 질의(조회)에 대해 실시간 처리에 의한 응답이 가능해야 한다.
2. 지속적인 변화(Continous Evloution)
>> 새로운 데이터의 삽입, 삭제, 갱신으로 항상 최신 데이터를 유지해야 한다.
3. 동시 공유(Concurrent Sharing)
>> 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야한다.
4. 내용 참조(Content Reference)
>> 데이터를 참조할 때, 레코드의 주소나 위치가 아닌, 사용자가 요구하는 데이터 내용으로 찾는다.
종류
데이터베이스 공부를 하다보면 주로 테이블로 구성되는 RDBMS에 대해 공부를 하게 되는데, NoSQL 구조의 DB도 존재한다. 여기서 짧게 RDBMS 와 NoSQL 에 대해 설명하고, 다음 목차에서부터는 RDBMS 관련 내용을 다루도록 하겠다.
RDBMS(Relational DBMS) | NoSQL(Not Only SQL) | |
개념 | 모든 데이터를 2차원 테이블 형태로 표현하여 관리 | 데이터간의 관계를 정의하지 않고 '컬렉션'과 '문서'라는 형태로 자유롭게 데이터를 관리 |
장점 | - 스키마에 맞춰 데이터를 관리하기 때문에 데이터 정합성 보장 - 데이터 중복 없이 한 번만 저장 |
- 스키마 없이 key-value 형태로 자유롭게 관리 - Scale-Out 가능 |
단점 | - 시스템이 커질수록 쿼리가 복잡해짐 - Scale-Out 이 어려움 |
- 데이터의 중복이 발생할 수 있으며, 수정이 필요할 때 모든 컬렉션의 중복 데이터를 수정해야함 - 스키마가 존재하지 않기에 데이터 구조 결정에 어려움 존재 |
적합한 상황 | - 관계를 맺고 있는 데이터가 자주 변경되는 상황 - 명확한 스키마가 사용자와 데이터에 중요한 경우 |
- 정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우 - 데이터 수정이 자주 없는 경우(읽기 위주인 경우) - 데이터 베이스를 수평으로 확장해야하는 경우(데이터 양이 많음) |
2. RDBMS 테이블 구조
앞서 RDBMS와 NoSQL 을 정리하면서 RDBMS란 무엇이며 어떤 특징을 가지는지 정리했다. 데이터베이스의 기본이 되는 RDBMS가 어떻게 테이블을 통해 데이터를 관리하는지 알아보자.
엔티티
여러 개의 속성을 지닌 객체를 의미한다. 위와 같은 테이블에서 학번, 이름, 학년 등의 속성을 가진 객체인 학생이 엔티티에 해당한다. 테이블에 들어가는 객체라고 생각하는 것이 좀 더 이해하기 쉽다.
릴레이션
- 정보를 구분해서 저장하는 기본 단위
- RDBMS 에서는 테이블, NoSQL에서는 컬렉션이 릴레이션에 해당한다.
속성
구체적이며 고유한 이름을 갖는 정보로서, 테이블에서 열 이름에 해당한다. 위의 예시에서 학번, 이름, 학년 등이 속성에 해당한다.
도메인
각 속성이 가질 수 있는 값의 집합을 의미한다. 예를 들어 위의 학생 예시에서 4학년까지 존재한다고 가정했을 때, 학년의 도메인은 { 1, 2, 3, 4} 가 된다.
튜플(또는 레코드)
테이블에 쌓이는 행 단위의 데이터를 의미한다.
필드
테이블에서의 한 칸을 의미한다.
3. 테이블 관계
RDBMS에서의 테이블이 어떻게 생겼는지 알게 되었다. 실제로 이러한 테이블은 1개만 존재하는 것이 아닌, 아래 이미지와 같이 다수의 테이블로 존재하며 각 테이블은 서로 관계를 맺으며 DB에 저장된다.
1:1 관계(일대일 관계)
두 개의 테이블이 존재할 때, 하나의 레코드가 다른 테이블의 레코드 1개와 연결되는 경우이다.
1: N 관계(일대다 관계)
하나의 레코드가 서로 다른 여러 개의 레코드와 연결되는 경우이며, 가장 많이 사용하게 되는 구조이다. 이후 키에 대해 설명할텐데, 주로 '다' 부분에 외래키를 넣어 조인을 하게된다.
N:M 관계(다대다 관계)
여러개의 레코드가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우이다. 개발을 하다보면 구조를 사용해야하는 경우가 있는데, N:M으로 바로 사용하지 않고 중간에 테이블을 추가하여 N:1, 1:M 관계를 만들어서 사용한다.
4. 키(KEY)
DB에는 실제로 여러개의 테이블이 존재하며 각 테이블 마다 많은 튜플이 존재한다. 각 튜플에 빠르게 접근하기 위해 식별자가 필요하며, 이러한 식별자 역할을 하는 속성을 key 라고 한다. key 에 대한 아래와 같은 여러 가지 개념이 존재한다.
# 실무에서 사용하는 키
1. 기본키(PK, Primary Key)
- 튜플을 구분할 수 있는 메인 키
- 특징 - Null 값을 가질 수 없고, 동일 값 중복 X
2. 외래키(FK, Foreign Key)
- 다른 테이블의 기본키를 그대로 참조하는 속성
- 주로 외래키를 통해 다른 테이블과 조인을 수행
---
# 이론에서 사용하는 키
3. 후보키(Candidate Key)
- 기본키로 사용할 수 있는 키들의 집합
- 조건 : 유일성(키 하나로 튜플을 식별), 최소성(꼭 필요한 속성으로만 구성)
4. 대체키(Alternative Key)
- 후보키 중 기본키를 제외한 키
5. 슈퍼키(Super Key)
- 유일성은 만족하지만, 최소성은 만족하지 못하는 키
5. 조인(JOIN)
여러개의 테이블이 관계를 맺고 있으며, 겹치는 속성을 통해 서로 연결이 가능하다. 이제 테이블의 연결하는 검색하는 조인에 대해 알아보자.
조인(JOIN) = 두 개 이상의 테이블이나 DB를 연결하여 데이터를 검색하는 방법
JOIN 종류
검색의 상황에 따라 다른 종류의 조인을 사용하게 된다. 각 조인이 어떤 특징을 가지는지 살펴보자.
INNER JOIN
두 테이블의 교집합을 구하는 조인으로, 기준 테이블(A)과 JOIN 테이블(B)의 겹치는 값을 보여준다.
SELECT
A.NAME, B.AGE
FROM A
INNER JOIN B ON A.NO=B.NO
LEFT JOIN(LEFT OUTER JOIN)
기준 테이블을 기준으로 조인을 하며, 아래 다이어그램처럼 A 에 해당하는 값만 존재하며, A에는 존재하는데 B에 존재하지 않는 경우 오른쪽 사진처럼 null 이 입려된다.
SELECT
A.NAME, B.AGE
FROM A
LEFT OUTER JOIN B ON A.NO=B.NO
RIGHT JOIN (RIGHT OUTER JOIN)
LEFT OUTER JOIN 과 반대로, 오른쪽 테이블을 기준으로 JOIN 한다.
SELECT
A.NAME, B.AGE
FROM A
RIGHT OUTER JOIN B ON A.NO=B.NO
FULL OUTER JOIN
A 테이블과 B 테이블의 모든 데이터가 검색된다. A에는 존재하는데 B에는 존재하지 않거나, B에는 존재하는데 A에는 존재하지 않는다면 없는 부분에 NULL로 채워진다.
SELECT
A.NAME, B.AGE
FROM A
FULL OUTER JOIN B ON A.NO=B.NO
INNER JOIN 과 OUTEER JOIN 차이
INNER JOIN = 서로 존재하는 내용만 출력하는 조인 방법
OUTER JOIN = 조인 기준이 되는 테이블의 존재하는 데이터를 모두 출력하는 방법
CROSS JOIN
A 테이블과 B 테이블의 모든 경우의 수를 전부 표현한다. 실제 사용해본적은 없지만 테스트 데이터 생성, 비즈니스 관련 조합 처리가 필요할 때에 사용된다고 한다. CROSS JOIN 사용시 튜플 수가 크게 증가하여 성능에 영향을 미칠 수 있다.
SELECT
A.NAME, B.AGE
FROM A
CROSS JOIN B
SELF JOIN
하나의 테이블을 기준으로 자기자신을 조인하는 방식이다. 테이블을 복사해서 조인한다고 생각하면 쉽다.
SELECT
A.NAME, B.NAME
FROM EMPLOYEE as A
JOIN EMPLOYEE as B on A.MANAGER_ID=B.EMPLOYEE_ID
6. 쿼리
백엔드 개발을 하게 되면 DB에 데이터를 저장하고 수정하고, 조회하는 등의 처리를 수행하게 된다. 이러한 데이터베이스 조작을 위해서는 '쿼리'라는 것을 알아야한다. 주로 우리가 알고 있는 select, where 절과 같은 쿼리는 데이터베이스의 DML(Data Manipulation Language)에 속한다. DML 뿐 아니라 DDL, DCL 등의 데이터베이스 언어가 존재한다. 짧게 정리하고 DML 부분으로 넘어가겠다.
데이터베이스 언어 구분
1. DML(Data Manipulation Language)
>> 데이터베이스 내의 삽입,조회,갱신,삭제를 위한 언어(SELECT, INSERT, UPDATE, DELETE)
2. DDL(Data Definition Langauge)
>> 데이터베이스 구조를 정의, 수정, 삭제하는 언어(CREATE, ALTER, DROP)
3. DCL(Data Control Langauge)
>> 데이터베이스의 보호과 권한, 병행수행 제어 등를 위한 언어(GRANT, COMMIT, ROLLBACK, REVOKE)
쿼리 문법
요즘 백엔드의 경우 기본적으로 ORM을 사용하여 직접적으로 SQL 문법을 다룰일은 없으나, ORM에서 사용하는 문법이 쿼리와 비슷한 부분이 많기 때문에 알아둘 필요가 있다. DB에 데이터를 삽입, 조회, 갱신, 삭제 하기 위한 쿼리를 알아보자.
조회(SELECT)
기본 문법
SELECT 열_이름
FROM 테이블_이름
WHERE 조건식
GROUP BY 열_이름
HAVING 조건식
ORDER BY 열_이름
LIMIT 숫자
예시
SELECT name
FROM customers
WHERE country='한국'
GROUP BY male
HAVING COUNT(*) > 10
ORDER BY name
LIMIT 3;
쿼리 진행 순서
1. 쿼리에 존재하는 테이블을 연결한다(FROM, ON, JOIN)
2. Where 절 조건에 해당하는 튜플을 선택한다(Where)
3. GROUP BY 를 통해 그룹화 하며, HAVING 이 존재한다면 그룹화된 행에 조건을 적용한다(GROUP BY,HAVING)
4. SELECT가 적용되어 연관 데이터만 선택한다.
5. DISTINCT > ORDER BY > LIMIT 순으로 적용
부가 설명
1. GROUP BY 란?
- 특정 컬럼을 기준으로 그룹화하는 역할을 함
- 관련 연산자로는 COUNT, SUM, AVG, MAX, MIN 등이 존재
2. 조건문 WHERE vs HAVING
- WHERE : [그룹화 전] 개별 행을 필터링 하는데 사용
- HAVING : [그룹화 후] 필터링하는데 사용
3. ON vs WHERE
- ON : [JOIN 전] 필터링을 진행
- WHERE : [JOIN 후] 후 필터링을 진행
삽입(INSERT)
기본 문법
INSERT INTO 테이블_이름 (컬럼1, 컬럼2, ...)
VALUES (값1,값2, ...);
예시
INSERT INTO customers (name, email)
VALUES ('김민수','ms@naver.com');
갱신(UPDATE)
기본 문법
UPDATE 테이블_이름
SET 컬럼1 = 값1, 컬럼2= 값2, ...
WHERE 조건식
예시
UPDATE customers
SET age = 24
WHERE customer_id = 1;
삭제(DELETE)
기본 문법
DELETE FROM 테이블_이름
WHERE 조건식
예시
DELETE FROM customers
WHERE customer_id = 3;
정리
1. 데이터베이스(DB) - 규칙을 통해 구조화되어 저장된 데이터 모음
DBMS - DB 제어를 위한 시스템
2. DB 종류
- RDBMS - 스키마를 통해 2차원 테이블로 관리
- NoSQL - 스키마가 존재하지 않으며, Collection, Document로 자유롭게 관리
3. 테이블 관계 - 1:1, 1:N, N:M
4. 키(Key)
기본키, 후보키, 후보키, 대체키, 슈퍼키
5. 조인(JOIN)
- inner, left, right, full outer join
- cross, self join
6. 쿼리(Query)
- 언어 : DML(조작), DDL(구조 정의), DCL(권한 등 제어)
- SELECT, INSERT, UPDATE, DELETE
[참고 링크]
주홍철, 『면접을 위한 CS 전공지식 노트』, 길벗
https://dev-coco.tistory.com/158
https://github.com/gyoogle/tech-interview-for-developer
https://www.erdcloud.com/d/TzHsgqxPRGzWGzytR
https://ittrue.tistory.com/201
https://chanhuiseok.github.io/posts/db-7/