데이터베이스

김준영·2023년 3월 28일
1

Code States

목록 보기
13/33

데이터베이스의 필요성


1. In-Memory

변수 등에 저장한 데이터가 프로그램의 실행에 의존한다는 말입니다. 예기치 못한 상황으로부터 데이터를 보호할 수 없고, 프로그램이 종료된 상태라면 데이터를 원하는 시간에 받아올 수 없으며, 데이터의 수명이 프로그램의 수명에 의존하게 됩니다.

2. File I/O

파일을 읽는 방식으로 작동하는 형태를 말합니다. 엑셀 시트나 CSV 같은 파일의 형태는 In-Memory에 비해 데이터를 저장하는 방식으로 적절해 보입니다.

  • 데이터가 필요할 때마다 전체 파일을 매번 읽어야 합니다. 파일의 크기가 커질수록 이 작업은 버겁고, 비효율적이어서 File I/O 방식의 큰 단점입니다.
  • 파일이 손상되거나 여러 개의 파일들을 동시에 다뤄야 하거나 하는 등 복잡하고 데이터량이 많아질수록 데이터를 불러들이는 작업이 점점 힘들어 집니다.

반면에 관계형 데이터베이스에서는 하나의 CSV 파일이나 엑셀 시트를 한 개의 테이블로 저장할 수 있습니다. 한번에 여러 개의 테이블을 가질 수 있기 때문에 SQL 을 활용해 데이터를 불러오기 수월합니다. 또한, 엑셀 시트와 CSV 파일 등 처럼 특정 형태의 파일은 대용량의 데이터를 저장하기 위한 목적이 아닙니다.

SQL


SQL(Structured Query Language)은 구조화된 쿼리 언어입니다.

쿼리란?

쿼리란 질의문이라는 뜻으로 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있습니다.

데이터베이스 관련 명령어


데이터베이스 생성

CREATE DATABASE 'database_name';

데이터베이스 사용

USE 'database_name';

테이블 생성

CREATE TABLE user (
  id int PRIMARY KEY AUTO_INCREMENT,
  name varchar(255),
  email varchar(255)
);

테이블 정보 확인

DESCRIBE user;
mysql> describe user;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| email | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

SQL 명령어

SELECT

  • SELECT는 데이터셋에 포함될 특성을 특정합니다.

FROM

  • 테이블과 관련한 작업을 할 경우 반드시 입력해야 합니다. FROM 뒤에는 결과를 도출해낼 데이터베이스 테이블을 명시합니다.
SELECT 특성_1
FROM 테이블_이름

WHERE

  • 필터 역할을 하는 쿼리문입니다. WHERE은 선택적으로 사용할 수 있습니다.
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 = "특정 값"

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 > "특정 값"

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 LIKE "%특정 문자열%"

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 IN ("특정값_1", "특정값_2")

ORDER BY

  • 돌려받는 데이터 결과를 어떤 기준으로 정렬하여 출력할지 결정합니다. ORDER BY는 선택적으로 사용할 수 있습니다.
SELECT *
FROM 테이블_이름
ORDER BY 특성_1

SELECT *
FROM 테이블_이름
ORDER BY 특성_1 DESC

LIMIT

  • 결과로 출력할 데이터의 갯수를 정할 수 있습니다. LIMIT은 선택적으로 사용할 수 있습니다. 그리고 쿼리문에서 사용할 때에는 가장 마지막에 추가합니다.
SELECT *
FROM 테이블_이름
LIMIT 200

DISTINCT

  • 유니크한 값을 받고 싶을 때에는 SELECT DISTINCT 를 사용할 수 있습니다.
SELECT DISTINCT 특성_1
FROM 테이블_이름

INNER JOIN

  • INNER JOIN 이나 JOIN 으로 실행할 수 있습니다.
SELECT *
FROM 테이블_1
JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

둘 이상의 테이블을 서로 공통된 부분을 기준으로 연결합니다.

OUTER JOIN

  • Outer JOIN 은 다양한 선택지가 있습니다.
SELECT *
FROM 테이블_1
LEFT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

SELECT *
FROM 테이블_1
RIGHT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

'LEFT OUTER JOIN'으로 LEFT INCLUSIVE을 실행합니다.
'RIGHT OUTER JOIN'으로 RIGHT INCLUSIVE을 실행합니다.

ACID


ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을 보장하기 위해 필요한 성질입니다.

트랜잭션

데이터베이스의 상태를 변환시키는 논리적 기능을 수행하기 위해 행해지는 하나 이상의 쿼리를 모아 놓은 하나의 작업 단위

Atomicity(원자성)

원자성은 하나의 트랜잭션에 속해있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야 합니다.

Consistency(일관성)

하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 합니다. 다시 말해, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다는 뜻입니다.

Isolation(격리성, 고립성)

Isolation(격리성) 은 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다 는 뜻입니다.
실제로 동시에 여러 개의 트랜잭션들이 수행될 때, 각 트랜젝션은 고립(격리)되어 있어 연속으로 실행된 것과 동일한 결과를 나타냅니다.

Durability(지속성)

하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야 합니다. 만약 런타임 오류나 시스템 오류가 발생하더라도, 해당 기록은 영구적이어야 한다는 뜻입니다.

SQL과 NoSQL의 차이

데이터 저장(Storage)

  • NoSQL은 key-value, document, wide-column, graph 등의 방식으로 데이터를 저장합니다.
  • 관계형 데이터베이스는 SQL을 이용해서 데이터를 테이블에 저장합니다. 미리 작성된 스키마를 기반으로 정해진 형식에 맞게 데이터를 저장해야 합니다.

스키마(Schema)

  • SQL을 사용하려면, 고정된 형식의 스키마가 필요합니다. 다시 말해, 처리하려는 데이터 속성별로 열(column)에 대한 정보를 미리 정해두어야 합니다. 스키마는 나중에 변경할 수 있지만, 이 경우 데이터베이스 전체를 수정하거나 오프라인(down-time)으로 전환할 필요가 있습니다.
  • NoSQL은 관계형 데이터베이스보다 동적으로 스키마의 형태를 관리할 수 있습니다. 행을 추가할 때 즉시 새로운 열을 추가할 수 있고, 개별 속성에 대해서 모든 열에 대한 데이터를 반드시 입력하지 않아도 됩니다.

쿼리(Querying)

  • 쿼리는 데이터베이스에 대해서 정보를 요청하는 질의문입니다. 관계형 데이터베이스는 테이블의 형식과 테이블간의 관계에 맞춰 데이터를 요청해야 합니다. 그래서 정보를 요청할 때, SQL과 같이 구조화된 쿼리 언어를 사용합니다.
  • 비관계형 데이터베이스의 쿼리는 데이터 그룹 자체를 조회하는 것에 초점을 두고 있습니다. 그래서 구조화 되지 않은 쿼리 언어로도 데이터 요청이 가능합니다. UnQL(UnStructured Query Language)이라고 말하기도 합니다.

확장성(Scalability)

  • 일반적으로 SQL 기반의 관계형 데이터베이스는 수직적으로 확장합니다. 높은 메모리, CPU를 사용하는 확장이라고도 합니다. 데이터베이스가 구축된 하드웨어의 성능을 많이 이용하기 때문에 비용이 많이 듭니다. 여러 서버에 걸쳐서 데이터베이스의 관계를 정의할 수 있지만, 매우 복잡하고 시간이 많이 소모됩니다.
  • NoSQL로 구성된 데이터베이스는 수평적으로 확장합니다. 보다 값싼 서버 증설, 또는 클라우드 서비스 이용하는 확장이라고도 합니다. NoSQL 데이터베이스를 위한 서버를 추가적으로 구축하면, 많은 트래픽을 보다 편리하게 처리할 수 있습니다. 그리고 저렴한 범용 하드웨어나 클라우드 기반의 인스턴스에 NoSQL 데이터베이스를 호스팅할 수 있어서, 수직적 확장보다 상대적으로 비용이 저렴합니다.
profile
ㅎㅎ

0개의 댓글