Search

Database

SQL, NoSQL

SQL은 관계형비관계형(NoSQL) 데이터베이스를 처리하는데 사용된다.
"관계형"이라는 용어는 대수학에서 유래했다. 데이터베이스에서 이것은 관계형 데이터베이스 데이터가 테이블과 행의 형태로 저장됨을 의미한다.
비관계형 데이터베이스는 정보를 JSON 문서 모음에 저장한다.
관계형 데이터베이스는 SQL을 사용한다. 이러한 데이터베이스의 구조를 통해 각 테이블의 원자 데이터를 고유하게 식별하는 데 사용되는 외부 키(또는 인덱스)를 사용하여 서로 다른 테이블의 정보를 연결할 수 있다. 다른 테이블은 이 외부 키를 참조하여 데이터 부분과 이 외부 키로 가리킨 부분 사이의 관계를 만들 수 있다.
비관계형 데이터베이스가 필요한 이유
주요 장점은 높은 수준의 보안과 하드웨어 제한을 무시할 수 있다는 것이다.

SQL, NoSQL 차이점

예시 모든 사람들이 같은 언어를 사용하는 도시를 상상해 보세요. 이 언어는 모든 형태의 커뮤니케이션에 사용되며 모든 비즈니스 프로세스가 이 언어를 기반으로 합니다. 이 도시의 주민들은 이 언어를 통해서만 서로를 이해하고 주변 세계를 탐험합니다. 만약 언어가 갑자기 한 곳에서 바뀌면, 다른 사람들은 모두 혼란스러워 할 것이다. 이제 모든 사람들이 집에서 다른 언어를 사용하는 또 다른 도시를 상상해 보세요. 모든 사람은 다른 방식으로 세상과 상호작용하며, "보편적인" 이해 방법과 지속 가능한 의사소통 조직도 없다. 한 사람이 어떤 것을 바꾸더라도 다른 사람에게 영향을 미치지 않을 것이다.
Plain Text
복사
이 예제는 SQL(관계형) 데이터베이스NoSQL(비관계형) 데이터베이스 간의 주요 차이점 중 하나를 설명하는 데 도움이 된다.

SQL, NoSQL 장단점

관계형 데이터베이스는 데이터를 처리하고 조작하기 위해 구조화된 쿼리 언어를 사용한다.
SQL 장점
SQL은 가장 다재다능하고 일반적으로 사용되는 언어 옵션 중 하나이기 때문에 안전한 선택이다.
명확하게 정의된 스키마, 데이터 무결성을 보장한다.
관계는 각 데이터를 중복없이 한번만 저장한다.
복잡한 질의에도 적합하다.
SQL 단점
SQL 작업을 시작하기 전에 데이터 스키마를 미리 정의해야하고 미리 정의된 스키마를 사용하여 데이터 구조를 정의해야 한다. 유연하지 못해서 나중에 수정하기 어렵다.
모든 데이터의 구조가 동일해야 합니다. 위의 예시와 같이 구조의 변화는 문제를 초래하고 전체 시스템을 파괴할 수 있습니다.
관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있다.
비관계형 데이터베이스구조화되지 않은 데이터에 대한 유연한 스키마를 가지고 있다. , 문서, 그래프 또는 키-값 저장소와 같은 다양한 방법으로 저장할 수 있다.
NoSQL 장점
스키마가 없어서 유연하다. 구조를 미리 정의하지 않고 문서를 작성할 수 있다.
각 문서는 고유한 구조를 가질 수 있다.
데이터는 애플리케이션이 필요로 하는 형식으로 저장된다. 그로 인해 데이터 읽어오는 속도 빨라진다.
언제든지 작업 과정에서 저장된 데이터를 조정하고 새 필드를 추가할 수 있다.
NoSQL 단점
유연성으로 인해 데이터 구조 결정을 미루게 될 수 있다.
데이터 중복을 계속 업데이트 해야 한다.
데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 한다. (SQL에서는 중복 데이터가 없으므로 한번만 수행이 가능)

SQL 데이터베이스 사용이 더 좋을 때

관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우
NoSQL에서는 여러 컬렉션을 모두 수정해야 하기 때문에 비효율적
변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우

NoSQL 데이터베이스 사용이 더 좋을 때

정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우
읽기를 자주 하지만, 데이터 변경은 자주 없는 경우
데이터베이스를 수평으로 확장해야 하는 경우 (막대한 양의 데이터를 다뤄야 하는 경우)

확장성

대부분의 경우 SQL 데이터베이스를 수직으로 확장할 수 있으므로 각 개별 서버의 로드를 증가시켜 CPU, RAM 및 디스크의 성능을 높일 수 있다.
NoSQL 데이터베이스는 수평으로 확장할 수 있다. 데이터를 분할하거나 서버를 추가해 부하를 분산한다는 의미다.
SQL건물에 더 많은 층을 추가하는 것과 같고, NoSQL주변에 더 많은 건물을 추가하는 것과 같다.
NoSQL시스템이 더 커지고 더 강력해질 수 있도록 한다. 그렇기 때문에 NoSQL일반적으로 크기가 크거나 자주 변경되는 데이터베이스에 대해 선택된다.
수직적 확장은 SQL, NoSQL 둘 다 가능하지만, 수평적 확장은 NoSQL만 가능하다.

구조 및 데이터 유형

관계형 데이터베이스
관계형 데이터베이스는 구조화된 데이터를 저장하는데, 이는 일반적으로 실제 세계의 객체를 나타낸다.
예를 들어, 사람에 대한 정보이거나 쇼핑 카트의 내용에 대한 정보일 수 있다. 이 데이터는 테이블로 그룹화되며, 테이블 형식은 저장소의 설계 단계에서 설정된다.
비관계형 데이터베이스
문서 기반 데이터베이스는 계층적 데이터 구조의 형태로 정보를 저장한다. 여기서 임의의 속성 집합을 가진 객체를 가질 수 있다.
관계형 데이터베이스에서 여러 개의 상호 연결된 테이블로 분할되는 것은 비관계형 데이터베이스단일 통합 엔티티(single integral entity)로 저장될 수 있다.

요청

라이선스에 관계없이 RDBMS는 SQL 표준을 사용하므로 SQL 언어를 사용하여 데이터를 얻을 수 있다.
NoSQL 데이터베이스는 공통 쿼리 형식을 사용하지 않으므로 각 NoSQL 솔루션은 고유한 쿼리 시스템을 사용한다.

SQL, NoSQL 비교 표

 
SQL
NoSQL
Query language
구조적
비선언적
Type
테이블 기반
문서 기반, 키-값, 그래프
Schema
사전에 정의
동적
Scalability
수직
수평
Examples
MySQL, PostgreSQL, SQLite
MongoDB, Redis, Apache Cassandra
Data storage
계측정 모델에 가장 적합
키-값 형태의 계층적 모델에 적합
Open-source
상업 및 오픈 소스 혼합
오픈 소스
Hardware
특수(전문적인) 하드웨어
상용 하드웨어
Storage type
SAN, RAID, etc.
Standard HDDs, JBOD

SQL이란?

SQL은 Structured Query Language (구조적 질의 언어)의 줄임말로, 관계형 데이터베이스 시스템(RDBMS)에서 자료를 관리 및 처리하기 위해 설계된 언어이다.
SQL은 1970년대에 IBM에서 최초 개발되었으며 관계형 모델이라는 이론에서 파생된 특징을 가지고 있는데, 현재 SQL의 표준으로 ANSI SQL이 정립되었다.
각 DBMS 프로그램에서 ANSI SQL을 기반으로 개발된 개별 SQL을 사용하며 서로 근소한 차이를 보인다.

SQL 문법의 종류

SQL 문법은 크게는 3가지의 종류로 나누어지며, 종류마다 정의는 아래와 같다.
DDL(Data Definition Language, 데이터 정의 언어)
각 릴레이션을 정의하기 위해 사용하는 언어이다.
(CREATE, ALTER, DROP...)
DML(Data Manipulation Language, 데이터 조작 언어)
데이터를 추가/수정/삭제하기 위한, 즉 데이터 관리를 위한 언어입니다.
(SELECT, INSERT, UPDATE...)
DCL(Data Control Language, 데이터 제어 언어)
사용자 관리 및 사용자별로 릴레이션 또는 데이터를 관리하고 접근하는 권한을 다루기 위한 언어입니다.
(GRANT, REVOKE...)

SQL의 언어적 특성

각 프로그래밍 언어가 가진 고유한 특성은 꼭 구별 지어 알아두어야 사용할 때 오류를 줄일 수 있다.
SQL은 다음과 같은 언어적 특성을 갖는다.
SQL은 대소문자를 가리지 않는다.
(단, 서버 환경이나 DBMS 종류에 따라 데이터베이스 또는 필드명에 대해 대소문자를 구분하기도 한다.)
SQL 명령은 반드시 세미콜론(;)으로 끝나야 한다.
고유의 값은 따옴표('')로 감싸준다.
ex) SELECT * FROM EMP WHERE NAME = 'James';
SQL에서 객체를 나타낼 때는 백틱(``)으로 감싸준다.
ex) SELECT `COST`, `TYPE` FROM `INVOICE`;
주석은 일종의 도움말로, 주석 처리된 문장은 프로그램에서 동작하지 않는다. 한 줄 주석은 문장 앞에 -- 를 붙여서 사용한다.
ex) - SELECT * FROM EMP; 이 쿼리는 실행되지 않습니다.
여러 줄 주석은 /* */ 로 감싸준다.
ex)/* SELECT * FROM EMP WHERE EMPID=(SELECT * FROM EMP WHERE NAME='홍길동')/

SQL 명령어

가장 많이 쓰이는 명령어 모음.
SELECT - extracts data from a database
UPDATE - updates data in a database
DELETE - deletes data from a database
INSERT INTO - inserts new data into a database
CREATE DATABASE - creates a new database
ALTER DATABASE - modifies a database
CREATE TABLE - creates a new table
ALTER TABLE - modifies a table
DROP TABLE - deletes a table
CREATE INDEX - creates an index (search key)
DROP INDEX - deletes an index
자세한 내용

SQL을 학습하기 좋은 사이트

ref

트랜잭션 (Transaction)

트랜잭션 특징 ACID

원자성 (Atomicity)

원자성은 하나의 트랜잭션이 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위이다.
트랜잭션이 데이터베이스에 모두 반영되던지, 아니면 전혀 반영되지 않아야 한다.
작업이 부분적으로 실행되거나 중단되지 않는 것을 보장한다.
즉, All or Nothing의 개념으로서 작업 단위를 일부분만 실행하지 않는다는 것을 의미한다.

일관성 (Consistency)

일관성은 트랜잭션이 완료된 결괏값이 일관적인 DB 상태를 유지하는 것을 말한다.
시스템이 가지고 있는 고정요소는 수행 전과 후의 상태가 같아야 하며 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것으로 트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행된다.
이렇게 함으로써 각 사용자가 일관성 있는 데이터를 볼 수 있는 것이다.
트랜잭션 수행 전후의 데이터베이스 상태는 각각 일관성이 보장되는 서로 다른 상태가 된다.
즉, 데이터 타입이 반환 후와 전이 항상 동일해야 한다.

고립성 (Isolation)

고립성이란 하나의 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것이다.
트랜잭션이 실행하는 도중에 변경한 데이터는 이 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못하게 하는 특성이다.
둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 점을 가리킨다.
즉, 각각의 트랜잭션은 독립적이라 서로 간섭이 불가능하다.

지속성 (Durability)

지속성은 트랜잭션의 성공 결과 값은 장애 발생 후에도 변함없이 보관되어야 한다는 것이다.
트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.
보통 commit 이 된다면 지속성은 만족할 수 있다.

트랜잭션의 필요성

트랜잭션은 거래의 안전성을 확보하는 방법이다.
A 은행에서 B 은행으로 송금을 하다가 송금 도중 알 수 없는 오류가 발생하여 A 은행 계좌에서 돈이 빠져 나갔는데 B 은행 계좌에 입금되지 않았다. 이때, A 은행 계좌의 출금을 취소하거나 출금된 금액만큼 B 은행 계좌로 다시 송금하면 된다. 하지만 이러한 방법은 번거롭고 더 심한 오류를 발생시킬 수 있다. 이때 거래가 성공적으로 모두 끝난 후에야 이를 완전한 거래로 승인하고, 거래 도중 오류가 발생했을 때는 이 거래를 아예 처음부터 없었던 거래로 되돌려 이러한 문제를 예방할 수 있다.
Markdown
복사
이렇게 거래의 안전성을 확보하는 방법이 바로 트랜잭션이다.
데이터베이스에서는 테이블에서 데이터를 읽어온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는 데 처리 도중 오류가 발생하면 모든 작업을 원상태로 되돌린다.
데이터베이스에서는 처리 과정이 모두 성공했을 때만 최종적으로 데이터베이스에 반영한다.
1, 2번까지 잘 실행되다가 3번 작업 시 소프트웨어가 중단되거나 하드웨어 고장이 발생해 작업에 오류가 생기게 된다면 2번까지의 모든 작업을 취소하고 트랜잭션 작업 전인 데이터베이스 초기 상태로 돌아가게 된다.

트랜잭션의 상태

트랜잭션에는 사용자가 적은 쿼리문과 데이터를 최종적으로 데이터베이스에 반영하는 커밋실패했을 때 시점으로 다시 되돌아가는 롤백이 있다.
활동(Active)
트랜잭션이 실행 중인 상태이다.
실패(Failed)
트랜잭션 실행에 오류가 발생하여 중단된 상태이다.
철회(Aborted)
트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태이다.
부분 완료(Partially Committed)
트랜잭션의 마지막 연산까지 실행했지만, 커밋 연산이 실행되기 직전의 상태이다.
완료(Committed)
트랜잭션이 성공적으로 종료되어 커밋 연산을 실행한 후의 상태이다.

Commit과 Rollback

Commit

커밋(commit) 연산은 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로서, 처리과정을 데이터베이스에 영구적으로 저장하는 것이다.
커밋을 수행하면 하나의 트랜잭션 과정을 종료하는 것이다.
커밋을 수행하면 이전 데이터가 완전히 업데이트된다.
위 그림에서 첫 번째 커밋 후 그 뒤에 Update 문으로 데이터를 갱신하고 Delete 문으로 데이터를 삭제한 후 Insert 문을 사용해 데이터를 삽입한다.
만약 이 모든 과정이 오류 없이 수행되었다면 지금까지 실행한 모든 작업을 데이터베이스에 영구 저장하라는 명령으로 커밋을 수행한다.

Rollback

롤백(rollback) 연산은 작업 중 문제가 발생하여 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어이다.
이 트랜잭션의 일부가 정상적으로 처리되더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소한다는 특징이 있다.
트랜잭션이 시작되기 이전의 상태로 되돌린다.
즉, 마지막 커밋을 완료한 시점으로 다시 돌아간다. 커밋하여 저장한 것만 복구한다. 롤백 시에는 해당 트랜잭션을 재시작하거나 폐기한다.
위 그림에서 롤백 명령은 마지막으로 수행한 커밋 명령까지만 정상 처리된 상태로 유지한다.
그 이후에 수행했던 모든 DML 명령어 작업들을 취소시켜 이전 상태로 원상 복귀 시킨다.
트랜잭션은 이렇듯 all or nothing(모든 것을 수행하던지 아무것도 하지 말던지) 방식으로 DML 명령어들을 처리한다.