데이터베이스란 데이터 저장소로, DBMS를 이용하여 DB에 접근하고 SQL or NoSQL 언어로 데이터를 CRUD합니다. 엣지 케이스가 발생하든 트래픽이 많든 안전하고 빠르게 데이터를 CRUD 하는것이 목표입니다. CRUD란 데이터 생성, 읽기, 업데이트, 삭제를 의미합니다.
DB와 대화하기 위해 특별히 디자인된 언어로 테이블 기반으로 동작합니다.이들은 크게 엄격한 스키마 구조와 관계의 특징을 보유합니다.
※ 스키마란 DB의 전체구조(메타데이터)와 제약 조건 명세를 말합니다.
SQL은 데이터를 엄격히 다뤄 부정확한 데이터를 다룰 위험을 줄입니다. 하지만 이 과정에서 Join의 비용이 높아져 속도가 비효율적일 수 있습니다.
DB의 스키마 구조를 조작합니다. DB 객체는 테이블, 뷰, 인덱스, 파티션 테이블 등을 포함합니다.
CREATE / DROP / ALTER
데이터베이스 내의 데이터를 조작합니다.
SELECT / INSERT / UPDATE / DELETE
사용자에게 권한을 주거나 회수합니다.
GRANT / REVOKE / COMMIT / ROLLBACK
일관성있는 데이터를 제공하기 위해 아래의 방법을 제공합니다.
제목 | 내용 |
---|---|
Integrity Constraint | 컬럼에 Referentional Integrity, Domain Integrity, Not NULL 등의 제약 조건을 명시합니다. |
중복 컬럼 | 특정 테이블이 가진 컬럼을 다른 테이블에서도 제공하는 중복 컬럼을 지양합니다. 만약 중복 컬럼의 어떤 데이터를 업데이트할 때 하나의 테이블만 업데이트한다면 데이터의 일관성이 깨질 수 있습니다. |
Isolation Level | 여러 트랜잭션이 공유 데이터에 동시 접근하여 발생하는 이상 현상들을 방지합니다. 어떤 트랜잭션이 공유 데이터를 변경하던 도중 다른 트랜잭션이 접근하여 이상 데이터를 읽을 수도 있어 Isolation Level을 설정합니다. |
Transaction | DB에서 논리적 작업 단위로 쿼리의 집합을 의미합니다. 트랜잭션으로 묶인 쿼리들을 모두 수행하거나 모두 수행하지 않는 atomic한 쿼리 집합을 지원합니다. |
Nomalization | 테이블을 잘못 설계하면 하나의 테이블에서 이상현상이 발생합니다. 메모리 낭비 및 업데이트 문제가 발생합니다. 이러한 문제를 해결하기 위해 테이블을 분해하여 저장합니다. |
Index
SQL 기반의 DBMS는 테이블을 조합하여 쿼리를 수행합니다. 이때, join 연산은 굉장히 비용이 큰 동시에 RDB에서 필수적으로 수행하는 기능입니다. 따라서 연산의 비용을 줄이고자 Join에 자주 걸리는 컬럼에 Index를 설정하여 보다 빠르게 Join 연산을 수행합니다.
무결성이란 DB에 저장된 값과 현실의 값이 일치하는 정확성을 말합니다. 무결성을 위해 아래의 기능을 제공합니다.
※ 예를 들어, '학번', '과목', '교수', '나이'의 컬럼을 보유하고, '과목'과, '교수'가 1대1 대응인 테이블이 있다고 가정해봅니다.
테이블에 존재하는 필드들의 부분집합으로서 유일성을 만족합니다. 즉 레코드를 유일하게 구별할 수 있는 식별자를 말합니다.
Ex) {학번, 과목, 교수, 나이}, {학번, 과목}, {학번, 교수}, {학번, 과목, 나이}
기본키가 될 수 있는 후보를 말합니다. 테이블에 존재하는 필드들의 부분집합으로써, 유일성과, 최소성을 만족합니다. 유일성은 레코드들을 구별할 수 있음을 나타내고, 최소성은 이러한 필드들의 갯수가 최소임을 말합니다.
Ex) {학번, 교수}, {학번, 과목}
다른 테이블의 PK를 참조하는 컬럼을 보통 외래키라고 합니다. 이때 참조하는 키와 동일한 데이터 타입, Unique한 키를 참조하는 제약조건이 필요합니다.
필요에 따른 설정 값
SELECT문과 같이 PARSE 과정까지는 동일합니다. 이후 원하는 데이터가 들어있는 블록을 메모리로 가져 온 후 트랜잭션을 위해 변경 전 데이터를 Undo Log에, 변경되는 데이터를 Redo Log에 기록합니다. 이후 변경 데이터를 디스크에 반영합니다.
테이블에 레코드를 삽입하는 방식이 아니라 거대한 Map의 Key & Value 형태로 데이터를 저장합니다. 이때 Value는 domuent, json 등 다양한 값이 들어갑니다.
아래 사진을 보면 Order 컬렉션은 관련 정보를 모두 포함합니다. 따라서 다른 컬렉션과 Join할 필요가 없습니다. 당연히 Join의 비용이 없어 빠르게 데이터 탐색할 수 있습니다.
하지만 컬렉션에 데이터가 중복되기 때문에 불안정합니다. 예를 들어 A, B 컬렉션이 공유 컬럼을 갖고 있을 때 실수로 A 컬렉션만 수정하고 B 컬렉션을 수정하지 않았다면 문제가 생깁니다.
SQL을 사용하면 좋은 경우
NoSQL을 사용하면 좋은 경우
SQL vs NoSQL
SQL | NoSQL | |
---|---|---|
장점 | 스키마가 명확하고 중복 데이터를 지양하여 데이터 무결성을 보장합니다. | 스키마 변경이 용이해 뛰어난 확장성을 보유합니다. 데이터를 빠르게 읽을 수 있어 빅데이터에서 자주 사용합니다. |
단점 | 기존 스키마를 수정하기 어렵습니다. Join을 필연적으로 하여 속도가 느려집니다. 하지만 제약 조건을 두어 Join을 빠르게 합니다. | 중복된 데이터를 가질 확률이 높아 업데이트 성능이 떨어집니다. 업데이트가 잘 안될 경우 데이터의 일관성을 보장 못합니다. |