관계형 데이터베이스 part1
-DB(Database)가 필요한 이유
1)In-memory는 프로그램 종료될 때 사용하던 데이터가 없어짐(=변수 등에 저장한 데이터가 프로그램의 실행에 의존)
2)File I/O는 원하는 데이터만 가져올 수 없고 항상 모든 데이터를 가져온 뒤 서버에서 필터링하기에 비효율적
*Database는 필터링 외에도 여러 기능을 가지고 있는 데이터에 특화된 서버
1.SQL(Structured Query Language) : 구조화된 쿼리 언어
-주로 관계형 데이터베이스(DB)에서 사용하는 데이터베이스 언어
-DB에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있음
+쿼리(Query)란 "질의문"이란 뜻으로, 저장되어있는 데이터를 필터하기 위한 질의문
-SQL을 사용하기 위해서는 데이터의 구조가 고정되어 있어야 함.
-데이터의 구조가 고정되어 있지 않은 DB를 NoSQL이라고 하고 관계형DB와 달리 데이터를 테이블이 아닌 다른 형태로 저장함.
1-1.DB관련 명령어
(1)CREATE DATABASE DB_이름; = DB 생성
(2)USE DB_이름; = DB 사용
(3)CREATE TABLE 테이블_이름 () = 테이블 생성
(4)DESCRIBE 테이블_이름; = 테이블 정보 확인
1-2.SQL 기초 명령어
(1)SELECT : 데이터셋에 포함될 특성을 특정(문자열, 숫자, 연산 등)
(2)FROM : 결과를 도출해낼 DB 테이블을 명시(테이블 관련 작업시 반드시 입력)
(3)WHERE : 필터 역할을 하는 쿼리문
(4)ORDER BY : 돌려받는 데이터 결과를 어떤 기준으로 정렬하여 출력할지 결정(기본 오름차순, DESC입력시 내림차순)
(5)LIMIT : 결과로 출력할 데이터의 갯수를 지정(쿼리문에서 사용할 때에는 가장 마지막에 추가)
(6)DELETE : 테이블 안에 존재하는 행을 제거
(7)MAX, MIN : 열(column) 이름을 받아 해당 열의 가장 큰 값, 가장 작은 값을 반환
(8)COUNT, AVG, SUM : 열 이름을 받아 해당 열의 갯수, 평균 값, 합계를 반환
(9)LIKE : 열에서 지정된 패턴을 검색(%기호는 0, 1, 또는 여러 문자를 나타내고 _기호는 하나의 단일 문자를 나타냄)
(10)BETWEEN : 주어진 범위 내에서 숫자, 텍스, 날짜 등의 값을 선택
(11)DISTINCT : 유니크한 값(중복이 제거된 값)을 받고 싶을 때 SELECT DISTINCT를 사용
(12)INNER JOIN : 둘 이상 테이블의 서로 공통된 부분을 기준으로 연결(JOIN으로도 실행 가능)
1-3.SQL vs NoSQL
-먼저 DB는 만들어진 방식, 저장 정보 종류, 저장 방법 등에 따라 크게 관계형 DB와 비관계형 DB로 구분하고 관계형 DB는 SQL을, 비관계형 DB는 NoSQL을 기반으로 데이터를 다룸
(1)SQL 기반 관계형 DB
-관계형 DB에서는 행(row,records), 열(column)로 구성된 테이블에 데이터를 저장한다는 형식을 지킴
-형식을 지키기 때문에 데이터를 정확히 입력했다면 데이터를 사용하기 매우 수월함
-SQL을 활용해 원하는 정보를 쿼리하고, 스키마(Schema)가 뚜렷하게 보이며, 테이블 간의 관계를 직관적으로 파악 가능
-대표적인 관계형 DB는 MySQL, Oracle, SQLite, PostgresSQL, MariaDB 등
(2)NoSQL 기반 비관계형 DB(문서 저장 방법에 따라 다음과 같이 분류)
-Key-Value 타입 : Key(속성 이름)-Value(속성에 연결된 데이터 값)의 쌍으로 나타내는 데이터를 배열의 형태로 저장 (Redis, Dynamo등이 대표적)
-문서형 DB : 데이터를 문서화하여 저장하며 각각의 문서는 하나의 속성에 대한 데이터를 가지고 있고, 컬렉션이라고 하는 그룹으로 묶어서 관리 (MongoDB가 대표적)
-Wide-Column DB : 데이터베이스의 열(column)에 대한 데이터를 집중적으로 관리 (Cassandra, HBase가 대표적)
-Graph DB : 자료구조의 그래프와 비슷한 형식으로 데이터 간의 관계를 구성 (Neo4J, InfiniteGraph가 대표적)
(3)두 DB의 차이점
-데이터 저장(Storage) 방식
-스키마(Schema) : SQL을 사용하려면 처리하려는 데이터 속성별로 열(column)에 대한 정보를 미리 정해두어야 함(고정된 형식의 스키마가 필요), NoSQL은 보다 동적으로 스키마의 형태를 관리할 수 있음
-쿼리(Querying) : 관계형 DB는 정보를 요청할 때 구조화된 쿼리 언어를 사용, 비관계형 DB의 쿼리는 데이터 그룹 자체를 조회하는 것에 초점
-확장성(Scalability)
*일반적으로 SQL기반은 수직적으로 확장함. 데이터베이스가 구축된 하드웨어의 성능을 많이 이용하기 때문에 비용이 많이 듦.
**NoSQL기반은 수평적으로 확장함. 보다 값싼 서버 증설, 많은 트래픽 처리 등 수직적 확장보다 상대적으로 비용이 저렴함.
+여러 사용 사례를 살펴보고 적절한 데이터베이스를 선택하는 것이 중요하며, 많은 개발자들은 유저의 요구를 충족하기 위해 관계형, 비관계형 데이터베이스를 모두 사용하여 서비스에 맞고 설계하고 있음
2.트랜잭션(Transaction) : 데이터베이스의 상태를 변환시키는 논리적 기능을 수행하기 위해 행해지는 하나 이상의 쿼리(query)를 모아 놓은 하나의 작업 단위
2-1.트랜잭션의 특성, ACID
(1)Atomicity(원자성) : 하나의 트랜잭션에 속해있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야 함
(2)Consistency(일관성) : 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 함
(3)Isolation(격리성, 고립성) : 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 함
(4)Durability(지속성) : 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야 하고 해당 기록은 영구적이어야 함
-내용 출처 : code states
-이미지 출처 : w3school