# 관계형 데이터베이스(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 표준과 확장]], [[데이터 모델링과 정규화]]