# 관계형 데이터베이스(RDBMS)
관계형 데이터베이스 관리 시스템(Relational Database Management System, RDBMS)은 관계형 데이터 모델을 기반으로 데이터를 저장, 관리, 질의하는 소프트웨어 시스템이다. 데이터는 테이블(table) 형식으로 구성되며, 각 테이블은 행(row, 튜플)과 열(column, 속성)로 표현된다. 테이블 간의 관계는 주로 외래 키(foreign key) 제약을 통해 표현되며, SQL(structured query language)을 표준 질의 및 조작 언어로 사용한다.
## 핵심 개념과 데이터 모델
- 관계(Relation): 2차원 표 형태의 데이터 집합으로, 행은 엔트리(instance), 열은 속성(attribute)을 나타낸다.
- 스키마(Schema): 데이터 구조의 설계도. 테이블의 컬럼 정의, 제약 조건, 관계를 포함한다.
- 속성(Attribute)과 도메인(Domain): 컬럼의 이름과 데이터 타입/허용 값의 집합.
- 기본 키(Primary Key): 테이블 내의 각 행을 유일하게 식별하는 최소의 속성 또는 속성 집합.
- 외래 키(Foreign Key): 한 테이블의 속성이 다른 테이블의 기본 키를 참조하여 관계를 형성한다.
- 무결성 제약(Constraints): 데이터의 정확성과 일관성을 보장하기 위한 규칙. 예: NOT NULL, UNIQUE, CHECK, REFERENCES(외래 키) 등.
- 관계 대수(Relational Algebra): 관계형 연산(SELECT, PROJECT, JOIN, UNION, INTERSECT, DIFFERENCE 등)을 통해 질의를 표현하는 이론적 기초.
## 데이터 정의와 조작 언어
- DDL(Data Definition Language): 스키마 정의 및 변경. 예: CREATE, ALTER, DROP.
- DML(Data Manipulation Language): 데이터 조회 및 조작. 예: SELECT, INSERT, UPDATE, DELETE.
- DCL(Data Control Language): 권한 관리. 예: GRANT, REVOKE.
- TCL(Transaction Control Language): 트랜잭션 관리. 예: BEGIN, COMMIT, ROLLBACK.
- 예시
- 데이터 정의
- CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
dept_id INT,
salary DECIMAL(10,2),
FOREIGN KEY (dept_id) REFERENCES departments(id)
);
- 데이터 조작
- INSERT INTO employees (id, name, dept_id, salary) VALUES (1, '홍길동', 10, 50000);
- SELECT 이름, 급여 FROM employees WHERE dept_id = 10;
- 트랜잭션
- BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
## 무결성, 제약, 그리고 참조 무결성
- 기본 키와 고유 제약: 각 행의 식별자 유일성 보장.
- 외래 키와 참조 무결성: 부모-자식 관계의 일관성 유지.
- NOT NULL, CHECK 제약: 데이터 유효성 보장.
- 트랜잭션의 원자성, 일관성, 고립성, 지속성(ACID): RDBMS의 기본 품질 특성.
## 정규화와 데이터 모델링
- 정규화(Normalization): 데이터 중복 최소화 및 업데이트 anomaly 제거를 위한 단계적 절차.
- 1NF: 원자값의 무결성 확보.
- 2NF: 부분적 기능 종속 제거.
- 3NF: 이행적 함수 종속 제거.
- BCNF, 4NF, 5NF: 고차수 의존성 제거.
- 정규화의 이점: 데이터 저장 공간 효율화, 데이터 일관성 강화, 업데이트/삭제/삽입의 안정성 증가.
- 정규화의 단점: 질의가 복잡해질 수 있고, 조인(join) 비용 증가.
## 인덱스와 쿼리 최적화
- 인덱스(Index): 질의 응답 속도 향상을 위한 데이터 구조. 일반적으로 B-tree 기반.
- 커버링 인덱스, 복합 인덱스, 부분 인덱스, 해시 인덱스 등 다양한 형태가 있다.
- 쿼리 최적화(Query Optimizer): SQL 질의를 가장 효율적으로 수행하기 위한 실행 계획을 선택.
- 실행 계획(Execution Plan): 테이블 접근 방식, 조인 순서, 인덱스 사용 여부 등을 포함하는 질의 실행 전략.
## 트랜잭션 관리와 동시성 제어
- 트랜잭션: 일련의 데이터베이스 작업의 실행 단위. 원자성, 일관성, 고립성, 지속성을 보장.
- 격리 수준(Isolation Level): Read Uncommitted, Read Committed, Repeatable Read, Serializable, Snapshot 등. 각 수준은 더 높은 일관성과 더 낮은 동시성 사이의 트레이드오프를 제공.
- 동시성 제어 기법:
- 잠금(Locking): 로킹(lock) 전략으로 일관성 확보. 공유 락(S)와 전용 락(X) 등.
- 다중 버전 동시성 제어(MVCC): 여러 버전의 데이터를 보존하여 읽기 작업이 쓰기 작업과 충돌하지 않도록 처리.
- 로깅(WAL: Write-Ahead Logging): 장애 복구를 위한 지속성 보장.
- 현장 적용 예: PostgreSQL은 MVCC를, InnoDB는 MVCC와 트랜잭션 로그를 활용하는 등 DBMS마다 구현 방식에 차이가 있다.
## 저장 엔진 및 아키텍처
- 저장 엔진(Storage Engine): 데이터 저장 방식과 트랜잭션 처리, 잠금 정책 등이 다름.
- 대표적 예
- InnoDB(MySQL): MVCC 기반의 트랜잭션 지원, 외래 키 제약 strong support.
- PostgreSQL: ACID 준수, MVCC 기반의 고성능 트랜잭션.
- Oracle Database: 고급 트랜잭션 관리, 다중 버전 관리 및 고급 보안 기능.
- SQL Server: Windows 기반 환경에 최적화된 상용 솔루션.
- SQLite: 경량 임베디드 데이터베이스로 디바이스 내장용에 적합.
- 아키텍처적 구성 요소: 시스템 카탈로그(system catalog), 저장 엔진, 버퍼 풀(buffer pool), 쿼리 옵티마이저, 트랜잭션 매니저, 복제/리플리케이션 모듈.
## 확장성, 고가용성, 배포 모델
- 확장성(Scalability): 수직적 확장(vertical scaling)과 수평적 확장(horizontal scaling).
- 파티셔닝(Partitioning)과 샤딩(Sharding): 대용량 데이터를 여러 파티션/노드에 분산 저장.
- 복제(Replication): 마스터-슬레이브, 비동기/동기 복제 등을 활용한 고가용성 및 읽기 부하 분산.
- 클라우드 기반 관리형 DB(MDB): AWS RDS, Google Cloud SQL, Azure SQL Database 등 관리형 서비스의 자동 백업, 패치, 고가용성 옵션.
- 장애 복구: 백업, PITR(Point-In-Time Recovery), 스냅샷, 재해 복구(Disaster Recovery) 전략.
## 표준, 상호 운용성, 및 현대의 동향
- SQL 표준과 확장: ANSI SQL 표준을 기본으로 각 벤더의 확장 기능이 존재.
- NoSQL과의 비교: RDBMS는 강한 스키마, 트랜잭션 일관성에 강점이 있고, NoSQL은 스키마 유연성과 대규모 분산에 강점이 있다.
- Modern 트렌드: NewSQL, 멀티 모델 데이터베이스, 자동화된 인덱스 관리, 머신 러닝 기반 쿼리 최적화, 클라우드 네이티브 아키텍처.
## 사용 사례와 설계 가이드
- RDBMS를 선택할 때의 고려요소:
- 데이터 무결성 필요 여부
- 관계형 데이터의 강한 구조적 제약
- 트랜잭션 일관성과 실패 복구의 중요성
- 질의 복잡성 및 대규모 조인 요구
- 확장성, 배포 환경(온프렘케어 vs 클라우드)
- 일반적인 설계 팁:
- 의미 있는 키와 제약 설계
- 정규화와 필요 시의 역정규화 판단
- 적절한 인덱스 설계와 질의 최적화
- 백업 및 재해 복구 전략 수립
## 역사와 발전
- 관계형 데이터베이스의 기원은 1970년대 초 Codd의 관계 모델에서 출발.
- 이후 다양한 구현체가 등장하며 표준 SQL의 확장과 다양한 저장 엔진의 개발이 이어졌다.
- 현대에는 클라우드 기반 관리형 서비스와 대규모 트랜잭션 처리에 최적화된 고급 기능들이 표준으로 자리 잡았다.
---
관련 문서: [[SQL 표준과 확장]], [[데이터 모델링과 정규화]]