# 소개
- 데이터: 그 자체로는 의미 없는 기록 조각이다.
- 구조화된 데이터: 수집 단계에서 최소한의 구조를 가지고 정리된 데이터
- 각 데이터 조각에 레이블을 붙여주는 단계
- 데이터에 의미는 있지만 통찰은 없는 상태
- 정보: 구조화된 데이터를 기반으로 특정 질문이나 목적을 가지고 분석 및 가공하여 얻어낸 유의미한 결과물
- 특정 날짜에 가장 많이 팔린 상품은 무엇이며, 총 몇개나 팔렸는가?
- 위 질문에 대해 필터링, 그룹화 및 집계가 이루어진다.
- 데이터베이스는 위와 같이 데이터를 체계적으로 저장하고 원하는 조건에 맞춰 쉽고 빠르게 찾아내 정보로 만들 수 있게 해주는 도구이다.
# 데이터의 보관
- 컴퓨터 파일 시스템을 이용한 데이터 관리
- txt: 데이터의 구조가 명확하지 않고, 특정 데이터 조회 및 수정이 어렵다.
- excel: 행렬 기반으로 구조화된 데이터, 조회 및 간단한 연산이 쉽다.
- 규모가 커지고 데이터 복잡성이 커지기 시작하면 관리가 어려워진다.
- 파일에 직접 저장 및 관리하는 경우 아래와 같은 문제들이 발생한다.
- 데이터 중복 / 불일치
- 각자 관리하는 파일에서의 중복된 데이터 발생
- 어떤 데이터가 실제 데이터인지 불일치하는 상황 발생
- 데이터 접근성 저하
- 파편화된 파일들을 뒤져가며 의미있는 정보 추출을 해내야 함
- 데이터 무결성 제약조건 적용의 어려움
- 데이터 오기입 문제를 강제로 막을 수가 없다.
- 동시성 제어 문제
- 여러 고객이 동시에 특정 데이터 접근을 하는 경우 예상하지 못한 결과가 나타날 수 있다.
- 보안 문제
- 파일 시스템 권한 설정만으로는 세밀한 데이터 접근 제어가 어렵다.
- 데이터 복구 및 백업의 어려움
- 파일을 백업해두지 않은 경우 데이터 복구가 어렵다.
- 데이터 중복 / 불일치
데이터 무결성 제약조건
- 데이터에 잘못된 데이터가 저장되지 않도록 하는 규칙을 말한다.
- 회원의 아이디는 중복되면 안된다, 주문 수량은 1개 이상이어야 한다 등
# DBMS
- 위와 같은 파일 시스템 기반의 관리 시스템 한계들을 해결하기 위해 데이터베이스 관리 시스템이 등장하게 되었다.
- 이를 DBMS라고 한다.
- DBMS란 데이터베이스를 생성, 정의, 공유, 사용, 관리하는 기능을 수행하는 소프트웨어 시스템을 말한다.
- 데이터베이스는 데이터를 체계적으로 모아놓은 창고이다.
- DBMS는 창고를 효율적으로 관리하는 소프트웨어이다.
- DBMS 특징
- DBMS는 데이터를 효율적으로 저장, 검색, 수정, 삭제할 수 있도록 하는 소프트웨어
- 데이터 저장: 운영체제 파일 시스템 위에 있는 특정 형식의 파일들에 저장한다.
- 추상화: DBMS 내부적으로 어떤 파일에 어떻게 저장하는지 알 필요가 없다.
- SQL기반으로 동작이 수행된다. 선언형 기반으로 동작한다.
- 직접 접근 금지: 내부 데이터 파일들은 사용자가 직접 열어보거나 수정하려 하면 안된다.
- DBMS 역할 및 기능
- 데이터 정의 기능 (Data Definition Language - DDL)
- DBMS는 데이터베이스 구조를 정의할 수 있는 기능을 제공한다.
- 각 데이터는 어떤 형태가 될지, 데이터 간의 관계, 제약조건 등
- 데이터 조작 기능 (Data Manipulation Language - DML)
- 데이터베이스 구조 정의가 되면 구조에 맞춰 데이터 등록 / 조회 / 수정 / 삭제를 할 수 있어야 한다.
- DBMS는 데이터 조작을 위한 효율적인 방법을 제공한다.
- SQL이라는 표준화된 언어를 사용한다.
- 보안, 동시성 제어, 트랜잭션 관리 기능
- DBMS는 보안을 유지하고 여러 사용자가 동시에 데이터에 접근할 때 발생할 수 있는 문제를 제어하는 기능을 수행한다.
- 보안: 허가된 사용자만이 데이터에 접근할 수 있게 한다. 사용자별로 접근 가능한 데이터 범위 제어가 가능
- 동시성 제어: 여러 사용자가 동시에 같은 데이터를 수정하려 할때 락 메커니즘을 사용
- 트랜잭션 관리
- 데이터 중복 최소화 및 일관성 유지
- DBMS는 정규화 과정을 통해 데이터를 여러 테이블로 분리하여 저장하여, 불필요한 데이터 중복을 줄인다.
- 정규화란, 데이터 중복을 제거하고, 이상현상(삽입/수정/삭제 오류)이 생기지 않도록 테이블을 올바르게 분리하는 과정을 말한다.
- 데이터 백업 및 복구
- 시스템 장애나 실수로 인한 데이터 손상 및 유실에 대비하여 데이터를 주기적으로 백업하고, 문제 발생 시 안전하게 복구할 수 있는 기능을 제공한다.
- 데이터 정의 기능 (Data Definition Language - DDL)
트랜잭션
- 여러 작업을 하나의 단위로 묶어, 전부 성공하거나 전부 실패하게 만드는 것을 의미한다.
- 전부 성공적으로 완료되거나 (Commit)
- 하나라도 실패하면 전부 이전 상태로 돌아감 (Rollback)
- 위 두 동작이 잘 수행되어야만 데이터 일관성이 보장된다.
- 이를 원자성이라고 한다.
# 관계형 DB vs NoSQL
- 관계형 데이터베이스 관리 시스템 (RDBMS)
- 가장 널리 사용되는 데이터베이스 시스템
- 테이블 간의 관계를 기반으로 데이터 구조화
- NoSQL(Not Only SQL) 데이터베이스 관리 시스템
- 빅데이터와 특정 요구사항에 맞춰 최근 등장한 시스템
# RDBMS(Relational Database Management System)
- 데이터를 테이블이라는 정형화된 구조에 저장한다.
- RDBMS가 기본인 이유는 다음과 같다.
- 정형화된 데이터 관리
- 데이터 구조가 명확
- 데이터 타입 / 제약조건을 통한 데이터 무결성 보장
- ACID 트랜잭션 보장
- ACID(원자성, 일관성, 고립성, 지속성) 특성을 잘 지원
- 데이터 신뢰성
- SQL 기반 표준 질의어
- 성숙한 기술 / 풍부한 생태계
- 압도적인 사용 빈도
- 정형화된 데이터 관리
# RDBMS 종류
- Oracle
- 장점
- 강력하고, 기능이 많다.
- 안정성이 좋다.
- 단점
- 라이선스 비용이 비싸다
- 전문성이 요구된다
- 장점
- MySQL
- 장점
- 가장 널리 사용되는 오픈소스 RDBMS
- 빠른 속도, 사용 편의성
- 운영체제 호환성, 커뮤니티 지원 등
- 단점
- 복잡한 분석 쿼리 / 대규모 트랜잭션 처리 성능은 RDBMS나 PostgreSQL에 비해 다소 부족하다는 평가
- 격차는 줄여가고 있음
- 장점
- PostgreSQL
- 장점
- 오픈소스 RDBMS
- 복잡한 쿼리 처리, 표준 SQL, 확장 기능 등 기능적으로 뛰어남
- 단점
- MySQL에 비해서는 사용자가 적다
- 장점
- H2 Database(SQLite)
- 내장형 임베디드 DB로 사용됨
- 애플리케이션 자체에 포함되어 실행되는 가벼운 데이터베이스
# NoSQL
- 관계형 모델을 사용하지 않거나 SQL을 주된 데이터 접근 언어로 사용하지 않는 DBMS를 통칭
- 매우 빠른 읽기 및 쓰기속도, 대량의 비정형 데이터, 유연한 데이터 모델 등에 대응하기 위한 목적
- NoSQL 4대 분류
- 키값 저장소
- 초고속 단건 읽기 및 쓰기
- 세션, 캐시에 사용
- Redis, Memcached
- 문서 DB
- JSON/BSON 문서
- 유연한 스키마
- MongoDB
- 컬럼 패밀리 저장소
- 열 그룹
- 대용량 분산 및 분석
- 로그 및 시계열
- Cassandra, HBase
- 그래프 DB
- 노드, 엣지
- 복잡한 관계 분석
- 키값 저장소
# RDBMS 핵심 개념
- 테이블
- 관계형 데이터베이스에서 데이터를 저장하는 가장 기본적인 구조
- 특정 주제와 관련된 데이터들의 집합
- 행
- 테이블 각 가로줄
- 하나의 행은 개별적인 데이터 항목
- 레코드, 튜플이라고도 불림
- 열
- 어떤 종류의 데이터가 저장될지를 정의
- 속성, 필드라고도 불림
- Primary Key, 기본 키
- 유일한 데이터 하나만을 식별하기 위해 PK, Primary Key라는 개념을 도입했다.
- PK는 고유성, NOT NULL 규칙을 지켜야 한다.
- 고유성: 같은 테이블 내에서 PK 열의 값은 중복되어서는 안된다.
- NOT NULL: PK로 지정된 열에는 반드시 값이 있어야 한다.
- Foreign Key, 외래 키
- 외래 키란 한 테이블의 열이 다른 테이블의 PK 값을 참조하는 것을 말한다.
- orders 테이블에서 customers 테이블의 customer_id 컬럼을 가져와 참조하는 구조를 예시로 들 수 있다.
- 두 테이블이 FK값을 통해 한쪽을 부모, 한쪽을 자식이라 한다.
- 자식 테이블은 FK를 통해 부모 테이블을 참조한다. FK값을 갖는 테이블이 자식이다.
- FK는 반드시 참조 무결성(Referential Integrity) 규칙을 지켜야 한다.
- 반드시 부모 테이블의 PK값 중 하나이거나 NULL이어야 한다.
- 부모 테이블의 PK에 존재하지 않는 값을 억지로 넣게 되면 오류를 발생시킨다.