DBMS & SQL

DBMS(Database Management System)

CRUD(create, retrieve, update, delete)의 기능이 있다.
일반적으로 retrieve의 빈도수가 압도적으로 많다고 가정한다.
빠른 검색을 위해서는 정렬되어 있어야 한다.

Binary Search: 최대 log_2_n의 시간이 걸린다.
B-Tree: 최대 log_3_n의 시간이 걸린다. 상용 DBMS에서 가장 일반적으로 사용된다.
B-Tree는 한 번에 비교를 두 번 한다. 작은 값과 큰 값이 있어서 총 세 개로 나눠진다. C,U,D 때마다 작은 값과 큰 값이 수정된다.

C,U,D의 작업 때마다 인덱스/정렬 업데이트가 일어난다.
찾기 위해 미리 저장해 놓는 것이 인덱스이다.


RDBMS: 관계형 데이터베이스 시스템

테이블과 테이블 간의 연관관계를 이용해 필요한 정보를 구한다.
여러 테이블을 조인해서 필요한 정보를 찾아낸다.
Table: 정보들의 묶음 단위이다.
Column: 테이블을 구성하는 정보이다. 학생 테이블에 이름 컬럼, 주소 컬럼 등등. 이름 필드에 대한 정보는 row에 쭉 저장된다.
Schema: 테이블의 정의 내역이다. DB
SQL Query: RDBMS를 사용하는 질의 언어이다.. 대소문자 가리지 않는다. Interpreter 언어이다.
Primary Key(PK): 테이블에서 하나의 레코드를 지정할 수 있는 하나 이상의 컬럼 집합이다.
Foreign Key(FK): 어떤 테이블의 기본키가 다른 테이블의 컬럼에 들어있는 경우이다.
Record: 테이블에 있는 여러 인스턴스 하나 하나를 지정한다. PK로 구별 가능하다.
Domain Value: 각 컬럼에서 나올 수 있는 후보값이다.

중복을 피하기 위한 테이블 정의 규칙
제1 정규형: 나눌 수 있을 만큼 쪼갠다.
제2 정규형: 테이블의 컬럼들이 기본키와 직접 연관되는 컬럼만으로 구성한다.
제3 정규형: 컬럼들 간의 종속관계가 있으면 안된다. 있으면 따로 테이블을 만든다.

VLDB(Very Large DB)
write의 성능을 높이기 위해 별도의 partition/shard 나눌 수 있다. Sharding으로 DBMS의 내용을 분할한다.
read의 성능을 높이기 위해 replication을 사용할 수 있다.동일한 DBMS를 여러 개 유지해서 마스터와 슬레이브로 나눈다.
Scale-up은 cpu 클럭 속도 증가, 코어 수 증가, 메모리 증가 등이고 비용 부담이 크다.
Scale-out은 동일한 서버를 병렬로 구축하여 분산컴퓨팅을 하는 것이고 상대적으로 저렴하지만 효율은 상대적으로 떨어진다.

MySQL: 오라클이 만든 오픈소스 RDBMS이다.
show databases: DB 리스트를 나타낸다.
use world: world라는 DB를 사용한다.
show tables: 선택된 DB에 있는 테이블을 보여준다.
desc city: city라는 테이블 구조를 보여준다.
select * from city: city테이블의 내용을 보여준다.


SQL(Structured Query Language)

RDB에서 사용되는 기본 언어이다. 모든 RDBMS에서 사용 가능하다.
대소문자는 구별하지 않고 인터프리터이다.
DML(Data Manipulation Language): 테이블의 데이터(레코드)를 조작한다(CRUD 작업). insert, delete, update, select.
DDL(Data Definition Language): DB를 정의, 수정한다. create, drop, alter.
DCL(Data Control Language): DB나 테이블의 CRUD 권한을 정의한다. grant, revoke.

DML 예제
select Name from city where Population > 500000;
insert into city (ID, Name, Population) values (10000, 'Sample', 100000); 두 번째 괄호문에 모든 값이 다 입력된다면 첫 번째 괄호문을 생략할 수 있다.
update city set name='SampleRevised' where id = 10000; id가 10000인 레코드의 name을 수정한다.
delete from city where ID = 10000;  where에 매칭되는 레코드가 다수일 때는 그 모든 레코드에 수정이나 삭제 작업이 일어난다.
select distinct CountryCode from city where CountryCode = 'KOR'; distinct를 하면 중복된 값이 제거되어 나온다.
select * from city where CountryCode='KOR' and Population>500000;
select * from city where CountryCode!='KOR' and Population>500000;
select * from city where CountryCode in ('KOR', 'CHN', 'JPN');  or를 사용하는 것과 동일하다.
select * from city where (Population between 100000 and 500000);  and를 사용해서도 표현할 수 있다.
select * from city where CountryCode='KOR' order by Population, Name desc; asc(default)/desc중 옵션을 고를 수 있고 Population 순서로 먼저 한 뒤 같은 Population이라면 Name순서로 정렬해서 보여준다.
select * from city where CountryCode='KOR' limit 10; 상위 10개만 표현한다.
select count(*) from city where ~;  aggregation function이라고 한다.
select sum(Population) from city where~; 이외에도 avg, min, max등이 사용될 수 있다.
select length(Name) from country; 글자 수를 표시한다.
select upper(mid(name, 1, 3)) from country; name컬럼의 첫 세글자만 대문자로 표시한다.
select round(LifeExpectancy, 0) from country; 기대수명을 소수 첫째자리에서 반올림한다.
select * from city join country on city.CountryCode = country.Code; 테이블 간의 공통 컬럼이 존재해야 한다. city 테이블의 CountryCode와 country라는 테이블의 code가 동일한 정보일 때 가능하다.
create view VIEWNAME as select ~; 쿼리 결과값을 임시테이블로 저장하고 select * from VIEWNAME으로 볼 수 있다. 끝나면 DROP VIEW를 한다.

Transaction: 복수의 SQL문을 수행하는 도중에 장애가 발생했을 때 장애에 대응할 수 있도록 하는 기능이다.
전체 수행(commit)과 전체 취소(rollback) 두 가지의 결과값만 가져야 한다.
기본 수행모드는 AutoCommit(줄 단위 커밋)인데 transaction을 지원하기 위해서는 AutoCommit 모드를 꺼야한다.
ACID
Atomicity: All-or-Nothing. Commit/Rollback
Consistency: 트랜잭션 전후에 데이터가 손상을 받으면 안된다.
Isolation: 여러 개의 트랜잭션이 수행될 때 성능과 데이터 안정성 사이의 trade-off가 있다.
Durability: 트랜잭션이 종료된 이후에도 데이터에 문제가 없어야한다.

Consistency와 Integrity를 지키기 위해 lock을 쓴다.
테이블 단위의 Table lock과 줄 단위의 Row lock이 있다.
Isolation level: 트랜잭션 중에 데이터의 안정성 레벨을 지정한다. 안정성을 높일수록 성능은 떨어진다.


NoSQL(Not Only SQL)

특정 기술이 아니라 일련의 제품군을 말하며 MongoDB가 시초이고 Apache Cassandra, Apache HBASE 등이 있다.
쓰기 성능이 중요한 응용의 경우 좋은 성능을 보이기에 로그 머신, SNS 메신저 등에 쓰인다.
CAP 이론
Consistency: 어떤 노드를 접근하더라도 데이터값이 동일해야한다.
Availability: 노드 일부가 fail되더라도 서비스가 중단되면 안된다.
Partition Tolerance: 노드 간 통신에 장애가 생겨도 문제가 없어야 한다.
어떤 시스템도 3가지 모두를 만족시킬 수 있고 2가지만 가능하다.
Schemaless: 스키마(DDL) 기반이 아니라 필요하면 새로운 컬럼을 추가하면 된다. 전체적으로 동일한 구조가 아닐 수 있다. 그렇다고 웹데이터처럼 비정규형(plain text)가 아니라 semi 정규형 데이터이다.







---------------------------------------------------------------
Reference
https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=72

댓글

이 블로그의 인기 게시물

논문 정리 - MapReduce: Simplified Data Processing on Large Clusters

논문 정리 - The Google File System

kazoo: Using zookeeper api with python