관계형 데이터베이스
1. 개요
1. 개요
관계형 데이터베이스는 데이터를 테이블 형태로 구성하고, 테이블 간의 관계를 통해 데이터를 관리하는 데이터베이스의 한 종류이다. 1970년 에드거 F. 커드가 제안한 관계형 모델에 그 이론적 기초를 두고 있으며, 이후 가장 널리 사용되는 데이터베이스 형태로 자리 잡았다.
이 모델에서는 모든 데이터가 행과 열로 이루어진 테이블에 저장된다. 각 테이블은 특정 엔터티(예: 고객, 주문, 상품)에 대한 정보를 담으며, 테이블 간의 관계는 기본키와 외래키를 통해 정의된다. 이러한 구조는 데이터의 중복을 최소화하고 논리적 일관성을 유지하는 데 도움을 준다.
데이터 접근과 조작은 주로 SQL을 통해 이루어진다. SQL은 데이터를 정의, 조작, 제어하는 포괄적인 언어로, 관계형 데이터베이스 관리 시스템의 핵심 인터페이스 역할을 한다.
특징 | 설명 |
|---|---|
구조 | 테이블(릴레이션), 행(튜플), 열(속성)로 구성 |
관계 | 기본키와 외래키를 통한 테이블 간 논리적 연결 |
운영 | SQL을 사용한 표준화된 데이터 조회 및 관리 |
목표 | 데이터 무결성 유지, 중복 감소, 일관성 보장 |
초기에는 성능 문제에 대한 논란이 있었으나, 기술의 발전으로 금융, 공공 행정, 전자 상거래 등 데이터 일관성이 중요한 거의 모든 분야의 핵심 인프라가 되었다.
2. 핵심 개념
2. 핵심 개념
관계형 데이터베이스는 데이터를 테이블이라는 구조로 조직화한다. 각 테이블은 특정 엔티티(예: 고객, 주문, 제품)에 대한 정보를 담는다. 테이블은 행과 열로 구성되며, 행은 하나의 레코드(예: 한 명의 고객 정보)를, 열은 특정 속성(예: 고객 ID, 이름, 주소)을 나타낸다. 이렇게 표 형태로 데이터를 저장하는 방식은 데이터 간의 관계를 명확히 정의하고 구조적으로 관리하는 데 기반이 된다.
관계형 모델에서 키는 데이터를 식별하고 테이블 간의 관계를 설정하는 데 핵심적인 역할을 한다. 기본키는 테이블 내 각 행을 고유하게 식별하는 하나 이상의 열이다. 외래키는 한 테이블의 열이 다른 테이블의 기본키를 참조하는 것으로, 두 테이블 간의 논리적 연결을 만든다. 예를 들어, '주문' 테이블의 '고객ID' 열이 '고객' 테이블의 기본키를 외래키로 참조하면, 특정 주문을 한 고객 정보를 쉽게 찾을 수 있다.
데이터의 정확성과 신뢰성을 보장하기 위해 무결성 제약조건이 적용된다. 주요 제약조건은 다음과 같다.
제약조건 | 설명 |
|---|---|
각 테이블의 기본키는 고유한 값을 가지며 NULL이 될 수 없다. | |
외래키 값은 참조하는 테이블의 기본키에 존재하는 값이거나 NULL이어야 한다. | |
도메인 무결성 | 테이블의 각 열은 미리 정의된 데이터 타입과 규칙(도메인)을 따라야 한다. |
이러한 개념들은 데이터의 중복을 최소화하고, 일관된 구조를 유지하며, 복잡한 질의를 효율적으로 수행할 수 있는 기반을 제공한다.
2.1. 테이블, 행, 열
2.1. 테이블, 행, 열
관계형 데이터베이스의 기본 구조는 테이블로 구성된다. 테이블은 특정 주제에 대한 데이터를 저장하는 2차원 구조의 기본 단위이다. 각 테이블은 고유한 이름을 가지며, 데이터베이스 스키마를 정의하는 핵심 요소이다.
테이블은 열(Column)과 행(Row)으로 구성된다. 열은 속성(Attribute) 또는 필드(Field)라고도 불리며, 저장할 데이터의 종류를 정의한다. 예를 들어, '고객' 테이블은 '고객ID', '이름', '주소', '전화번호'와 같은 열을 가질 수 있다. 각 열은 정수, 문자열, 날짜 등 특정 데이터 타입을 가진다. 행은 튜플(Tuple) 또는 레코드(Record)라고도 불리며, 테이블에 저장된 개별 데이터 항목을 나타낸다. 하나의 행은 각 열에 해당하는 구체적인 값의 집합이다. '고객' 테이블에서 각 행은 한 명의 고객에 대한 모든 정보를 담는다.
테이블, 행, 열의 관계는 다음과 같은 표로 요약할 수 있다.
개념 | 다른 이름 | 설명 | 역할 |
|---|---|---|---|
테이블 | 릴레이션(Relation), 엔터티(Entity) | 데이터를 저장하는 2차원 구조. | 특정 주제(예: 고객, 주문)에 대한 데이터 집합을 담는다. |
열 | 속성(Attribute), 필드(Field) | 테이블의 세로 단위. 데이터의 종류를 정의한다. | '고객ID', '이름'과 같은 데이터 항목의 유형과 형식을 지정한다. |
행 | 튜플(Tuple), 레코드(Record) | 테이블의 가로 단위. 개별 데이터 항목을 나타낸다. | 한 명의 고객, 한 건의 주문과 같은 실제 데이터 값을 담는다. |
이 구조는 관계형 모델의 수학적 기반인 집합론과 관계대수에 기반을 둔다. 테이블은 튜플의 집합으로, 각 튜플(행)은 속성(열) 값의 순서쌍으로 표현된다. 이 명확한 구조 덕분에 데이터는 체계적으로 저장되고, SQL을 통해 효율적으로 질의하고 조작할 수 있다.
2.2. 키 (기본키, 외래키)
2.2. 키 (기본키, 외래키)
관계형 데이터베이스에서 키는 테이블 내의 행을 고유하게 식별하거나 테이블 간의 관계를 정의하는 데 사용되는 하나 이상의 열 또는 열의 집합이다. 키는 데이터의 무결성을 보장하고 효율적인 데이터 검색을 위한 기초를 제공하는 핵심적인 요소이다.
가장 중요한 키 유형은 기본키와 외래키이다. 기본키는 테이블의 각 행을 고유하게 식별하는 열이다. 기본키는 널 값을 가질 수 없으며, 그 값은 테이블 내에서 중복되어서는 안 된다. 하나의 테이블에는 오직 하나의 기본키만 존재할 수 있다. 기본키는 종종 id, code와 같은 이름의 열이 단독으로 사용되거나, 여러 열이 조합되어 구성되기도 한다[1]. 반면, 외래키는 한 테이블의 열이 다른 테이블의 기본키를 참조하는 관계를 정의한다. 외래키는 두 테이블 간의 참조 무결성을 유지하는 역할을 한다. 예를 들어, 주문 테이블에 있는 고객번호 열이 고객 테이블의 기본키를 참조하는 외래키라면, 주문 테이블에 입력되는 모든 고객번호는 반드시 고객 테이블에 실재하는 번호여야 한다.
이러한 키의 정의와 관계는 데이터베이스 스키마를 설계할 때 명시되며, 구조적 질의 언어의 데이터 정의 언어 명령어를 통해 구현된다. 기본키와 외래키의 적절한 사용은 데이터 중복을 최소화하고 일관된 데이터 구조를 유지하며, 복잡한 조인 연산을 가능하게 하는 관계형 모델의 근간이 된다.
2.3. 무결성 제약조건
2.3. 무결성 제약조건
무결성 제약조건은 관계형 데이터베이스에 저장된 데이터의 정확성과 일관성을 보장하기 위한 규칙의 집합이다. 데이터베이스 스키마를 정의할 때 설정되며, 데이터베이스 관리 시스템(DBMS)이 자동으로 이를 강제하여 잘못된 데이터의 입력이나 수정을 방지한다.
주요 무결성 제약조건에는 다음과 같은 것들이 있다.
제약조건 | 설명 |
|---|---|
기본키(Primary Key) 제약조건 | 테이블의 각 행을 고유하게 식별하는 열(또는 열의 집합)이다. NULL 값을 가질 수 없고 중복될 수 없다. |
외래키(Foreign Key) 제약조건 | 한 테이블의 열이 다른 테이블의 기본키를 참조하는 관계를 정의한다. 참조 무결성을 유지하여 존재하지 않는 값을 참조하지 못하게 한다. |
고유(Unique) 제약조건 | 지정된 열(또는 열의 집합)에 저장된 모든 값이 서로 달라야 한다는 규칙이다. 기본키와 달리 NULL 값을 허용할 수 있다. |
NOT NULL 제약조건 | 지정된 열이 NULL 값을 가질 수 없도록 강제한다. |
검사(Check) 제약조건 | 사용자가 정의한 논리적 조건을 만족하는 데이터만 입력되도록 한다. 예를 들어, 나이 열의 값이 0보다 커야 한다는 조건을 설정할 수 있다. |
이러한 제약조건들은 데이터 간의 논리적 관계와 비즈니스 규칙을 데이터베이스 수준에서 구현한다. 예를 들어, 주문 테이블의 '고객번호' 열에 외래키 제약조건을 설정하면, 반드시 고객 테이블에 존재하는 고객번호만 입력할 수 있다. 이는 '존재하지 않는 고객에 대한 주문'이라는 모순된 데이터 생성을 근본적으로 차단한다. 제약조건은 데이터 정의 언어(DDL)의 CREATE TABLE 또는 ALTER TABLE 문을 사용하여 정의되고 관리된다.
3. 구조적 질의 언어 (SQL)
3. 구조적 질의 언어 (SQL)
구조적 질의 언어(SQL)는 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 정의, 조작, 제어하기 위해 사용되는 표준화된 프로그래밍 언어이다. SQL은 선언형 언어의 특성을 가지며, 사용자가 원하는 데이터가 무엇인지를 기술하는 데 중점을 두고, 데이터를 어떻게 가져올지는 데이터베이스 시스템이 결정한다. 이 언어는 1970년대 IBM 연구소에서 개발된 SEQUEL에서 기원하였으며, 이후 ANSI와 ISO에 의해 국제 표준으로 채택되어 널리 사용된다.
SQL은 그 기능에 따라 크게 세 가지 하위 언어로 구분된다. 첫째, 데이터 정의 언어(DDL)는 데이터베이스의 구조를 정의하고 변경하는 명령어를 포함한다. 주요 명령어로는 CREATE(데이터베이스, 테이블, 인덱스 등의 객체 생성), ALTER(기존 객체 구조 변경), DROP(객체 삭제) 등이 있다. DDL 명령어를 실행하면 데이터베이스의 스키마가 수정된다.
둘째, 데이터 조작 언어(DML)는 테이블에 저장된 실제 데이터를 조회, 추가, 수정, 삭제하는 데 사용된다. 가장 핵심적인 명령어는 다음과 같다.
명령어 | 주요 기능 |
|---|---|
| 하나 이상의 테이블에서 데이터를 조회한다. |
| 테이블에 새로운 행(레코드)을 추가한다. |
| 테이블에 존재하는 기존 행의 데이터를 수정한다. |
| 테이블에서 특정 행을 삭제한다. |
이 중 SELECT 문은 조인(JOIN), 집계 함수(Aggregate Function), 그룹화(GROUP BY), 정렬(ORDER BY) 등 복잡한 데이터 질의를 구성하는 데 사용되는 가장 빈번한 명령어이다.
셋째, 데이터 제어 언어(DCL)는 데이터베이스에 대한 접근 권한과 보안을 관리하는 명령어로 구성된다. GRANT 명령어는 사용자나 역할에 특정 작업(예: SELECT, INSERT)을 수행할 수 있는 권한을 부여한다. 반대로 REVOKE 명령어는 이전에 부여된 권한을 취소한다. 또한, COMMIT과 ROLLBACK 명령어는 트랜잭션의 완전한 적용 또는 취소를 제어하여 데이터의 무결성을 보장하는 데 기여한다.
3.1. 데이터 정의 언어 (DDL)
3.1. 데이터 정의 언어 (DDL)
데이터 정의 언어는 데이터베이스의 구조를 정의하고 수정하며 삭제하는 데 사용되는 SQL 명령어의 집합이다. 이 언어를 통해 데이터베이스의 청사진이라고 할 수 있는 스키마를 생성하고 관리한다. 주요 명령어로는 CREATE, ALTER, DROP이 있으며, 이들은 각각 객체 생성, 구조 변경, 객체 삭제 기능을 담당한다.
주요 DDL 명령어와 그 역할은 다음과 같다.
명령어 | 주요 역할 |
|---|---|
| |
| 기존 객체(예: 테이블)의 구조를 변경한다. 열 추가/삭제, 데이터 타입 변경, 제약조건 추가 등이 가능하다. |
| 데이터베이스 객체를 완전히 삭제한다. 삭제된 객체와 그 내부 데이터는 복구하기 어렵다. |
| 테이블 내의 모든 행을 빠르게 삭제하지만, 테이블 구조는 유지한다. |
| 기존 객체의 이름을 변경한다. |
CREATE TABLE 문을 사용할 때는 열의 이름, 데이터 타입(예: INT, VARCHAR, DATE), 그리고 기본키나 외래키 같은 무결성 제약조건을 함께 정의한다. ALTER TABLE 명령은 이미 운영 중인 데이터베이스의 구조를 유연하게 변경할 수 있게 해주며, DROP 명령은 사용에 주의를 요한다. DDL 명령은 대체로 트랜잭션의 범위 내에서 실행되며, 명령이 성공적으로 완료되면 변경 사항은 자동으로 커밋된다[2].
3.2. 데이터 조작 언어 (DML)
3.2. 데이터 조작 언어 (DML)
데이터 조작 언어는 관계형 데이터베이스 내에 저장된 데이터를 실제로 조회, 추가, 수정, 삭제하는 데 사용되는 SQL 명령어 집합이다. 이는 데이터 정의 언어가 데이터의 구조를 정의하는 것과 대비되어, 구조 내의 데이터 내용을 다루는 역할을 한다. 가장 기본적이고 빈번하게 사용되는 SQL 명령어들이 여기에 속한다.
주요 DML 명령어는 다음과 같다.
명령어 | 설명 |
|---|---|
| 하나 이상의 테이블에서 데이터를 조회한다. |
| 테이블에 새로운 행을 추가한다. |
| 테이블 내 기존 행의 데이터를 수정한다. |
| 테이블에서 특정 행을 삭제한다. |
SELECT 문은 가장 복잡한 구문을 가질 수 있으며, WHERE 절로 조건을 지정하거나, JOIN으로 여러 테이블을 연결하고, GROUP BY와 집계 함수를 사용해 데이터를 그룹화하고 요약할 수 있다. INSERT, UPDATE, DELETE 문은 데이터를 변경하기 때문에 주로 트랜잭션 내에서 실행되어 ACID 속성 중 원자성과 일관성을 보장받는다.
DML 작업은 데이터베이스의 무결성 제약조건을 위반하지 않아야 한다. 예를 들어, INSERT 시 기본키 값이 중복되거나, UPDATE나 DELETE 시 외래키 제약조건에 위배되는 작업을 수행하면 명령은 실패한다. 또한, 적절한 동시성 제어 메커니즘 하에서 여러 사용자의 DML 작업이 충돌 없이 수행될 수 있도록 관리된다.
3.3. 데이터 제어 언어 (DCL)
3.3. 데이터 제어 언어 (DCL)
데이터 제어 언어는 데이터베이스의 보안과 접근 권한을 관리하는 SQL 명령어 집합이다. 주로 데이터베이스 관리자(DBA)가 사용하며, 데이터에 대한 접근을 허가하거나 제한함으로써 시스템의 안전성과 무결성을 유지하는 데 핵심적인 역할을 한다.
주요 명령어는 다음과 같다.
명령어 | 설명 |
|---|---|
| 사용자나 역할에 특정 데이터베이스 객체(테이블, 뷰 등)에 대한 권한(조회, 삽입, 수정, 삭제 등)을 부여한다. |
|
|
| 특정 권한을 명시적으로 거부한다[3]. |
이러한 명령어를 통해 세밀한 접근 제어가 가능하다. 예를 들어, 특정 사용자에게는 특정 테이블의 데이터를 조회(SELECT)할 수 있는 권한만 부여하고, 다른 사용자에게는 데이터를 수정(UPDATE)할 수 있는 권한까지 부여할 수 있다. 권한은 개별 사용자에게 직접 부여할 수도 있고, 권한의 집합인 역할(Role)을 생성하여 역할에 권한을 부여한 후 사용자를 해당 역할에 포함시키는 방식으로 관리하기도 한다.
데이터 제어 언어의 적용은 데이터베이스의 보안 정책을 구현하는 공식적인 수단이다. 이를 통해 불필요한 데이터 노출을 방지하고, 의도치 않은 데이터 변조를 사전에 차단하여 무결성 제약조건과 함께 데이터의 신뢰성을 보장하는 중요한 기반을 마련한다.
4. 정규화
4. 정규화
정규화(Normalization)는 관계형 데이터베이스 설계에서 데이터의 중복을 최소화하고, 삽입/갱신/삭제 시 발생할 수 있는 이상 현상(Anomaly)을 방지하기 위해 테이블을 구조화하는 체계적인 과정이다. 이 과정은 일련의 규칙(정규형)을 적용하여 데이터를 논리적이고 효율적으로 조직화하는 것을 목표로 한다.
정규화의 주요 목적은 데이터 무결성을 유지하고 저장 공간을 효율적으로 사용하며, 데이터 조작의 일관성을 보장하는 데 있다. 이를 통해 데이터베이스의 유지보수성을 높이고, 불필요한 데이터 중복으로 인한 갱신 이상을 방지한다. 정규화는 일반적으로 낮은 정규형에서 높은 정규형으로 단계적으로 진행된다.
정규형 | 약어 | 주요 조건 |
|---|---|---|
제1정규형 | 1NF | 모든 속성의 값이 원자값(Atomic Value)을 가져야 한다. |
제2정규형 | 2NF | 1NF를 만족하며, 부분 함수 종속을 제거해야 한다(모든 비주요 속성이 기본키에 완전 함수 종속적이어야 함). |
제3정규형 | 3NF | 2NF를 만족하며, 이행적 함수 종속을 제거해야 한다(비주요 속성이 기본키에만 종속적이어야 함). |
보이스/코드 정규형 | BCNF | 3NF를 강화하여, 모든 결정자가 후보키(Candidate Key)가 되도록 해야 한다. |
정규화는 일반적으로 제3정규형(3NF) 또는 보이스/코드 정규형(BCNF) 수준까지 수행하는 것이 일반적이다. 그 이상의 정규형(제4정규형, 제5정규형)은 특수한 다중 값 종속이나 조인 종속을 해결하기 위해 존재하지만, 실무에서는 지나친 정규화로 인해 조인 연산이 과도하게 많아져 성능이 저하될 수 있다. 이러한 성능 문제를 해결하기 위해, 의도적으로 정규화 수준을 낮추는 반정규화(Denormalization) 기법이 사용되기도 한다.
4.1. 정규화의 목적
4.1. 정규화의 목적
정규화의 주요 목적은 데이터베이스 설계에서 데이터 중복을 최소화하고, 데이터의 무결성을 보장하며, 이상 현상을 방지하는 것이다. 잘 정규화된 데이터베이스는 저장 공간을 효율적으로 사용하고, 데이터 갱신 시 불일치가 발생할 가능성을 크게 줄인다. 이는 데이터 모델링의 핵심 과정으로, 논리적 설계 단계에서 수행된다.
정규화를 수행하지 않을 경우 발생할 수 있는 주요 문제점은 다음과 같은 이상 현상이다.
이상 현상 | 설명 |
|---|---|
삽입 이상 | 특정 정보를 저장하기 위해 불필요한 데이터도 함께 삽입해야 하는 경우 |
갱신 이상 | 중복된 데이터 중 일부만 수정할 때 데이터 불일치가 발생하는 경우 |
삭제 이상 | 특정 정보를 삭제할 때 의도하지 않은 다른 정보까지 함께 삭제되는 경우 |
예를 들어, 주문 정보와 고객 주소를 하나의 테이블에 저장하면, 같은 고객이 여러 번 주문할 때마다 고객 주소가 반복되어 저장된다[4]. 이 경우 고객이 주소를 변경하면 모든 관련 행을 찾아 일일이 수정해야 하며, 하나라도 누락되면 데이터 불일치가 발생한다[5]. 또한 마지막 주문 기록을 삭제하면 고객의 주소 정보까지 영구히 손실될 수 있다[6].
따라서 정규화는 이러한 이상 현상을 제거하기 위해 테이블을 분해하고, 각 테이블이 하나의 주제만을 표현하도록 재구성하는 과정이다. 이는 궁극적으로 데이터 저장의 효율성을 높이고, 향후 시스템 유지보수와 확장을 용이하게 만든다. 정규화 수준은 일반적으로 제1정규형부터 시작하여 보이스/코드 정규형까지 점진적으로 적용된다.
4.2. 제1정규형 ~ 보이스/코드 정규형
4.2. 제1정규형 ~ 보이스/코드 정규형
정규화는 데이터베이스 설계에서 중복을 최소화하고 이상 현상을 방지하기 위해 관계를 구조화하는 체계적인 과정이다. 이 과정은 제1정규형(1NF)부터 시작하여 일반적으로 제5정규형(5NF)과 보이스/코드 정규형(BCNF)까지 이어진다. 각 정규형은 이전 정규형의 조건을 만족한 상태에서 추가적인 제약 조건을 충족해야 한다.
제1정규형은 모든 도메인이 원자 값만으로 구성되어야 함을 요구한다. 즉, 테이블의 각 셀은 하나의 값만을 포함해야 하며, 반복되는 그룹이나 배열을 가져서는 안 된다. 제2정규형은 부분 함수적 종속을 제거하는 것으로, 기본키가 복합키일 경우 모든 속성이 기본키 전체에 대해 완전 함수적으로 종속되어야 한다. 제3정규형은 이행적 함수적 종속을 제거하여, 기본키에 직접 종속되지 않고 다른 속성을 통해 간접적으로 종속되는 속성을 별도의 테이블로 분리한다.
이후의 고급 정규형은 더 복잡한 종속성을 해결한다. 보이스/코드 정규형은 제3정규형을 강화한 형태로, 모든 결정자가 후보키가 되도록 요구한다. 제4정규형은 다치 종속성을 제거하고, 제5정규형은 조인 종속성을 제거하여 무손실 조인을 보장한다. 정규화의 수준이 높아질수록 데이터 중복은 줄어들지만, 필요한 조인 연산이 증가하여 쿼리 성능에 영향을 줄 수 있다. 따라서 실제 설계에서는 정규화 이점과 성능 요구사항 사이의 균형을 고려한다.
정규형 | 약어 | 주요 요구사항 | 해결하는 문제 |
|---|---|---|---|
제1정규형 | 1NF | 모든 속성의 값이 원자적이어야 함 | 반복 그룹, 중복 |
제2정규형 | 2NF | 제1정규형이며, 부분 함수적 종속 제거 | 부분적 종속에 의한 이상 현상 |
제3정규형 | 3NF | 제2정규형이며, 이행적 함수적 종속 제거 | 이행적 종속에 의한 이상 현상 |
보이스/코드 정규형 | BCNF | 제3정규형이며, 모든 결정자가 후보키여야 함 | 3NF에서 잔류하는 종속성 문제 |
제4정규형 | 4NF | BCNF이며, 다치 종속성 제거 | 다치 종속성에 의한 중복 |
제5정규형 | 5NF | 4NF이며, 조인 종속성 제거 | 조인 연산 시 정보 손실 가능성 |
5. 트랜잭션 관리
5. 트랜잭션 관리
트랜잭션은 데이터베이스의 상태를 변화시키는 하나의 논리적 작업 단위를 말한다. 여러 개의 SQL 명령어(예: INSERT, UPDATE, DELETE)가 모여 하나의 트랜잭션을 구성하며, 이 작업들은 모두 성공하거나 모두 실패하는 '전부 아니면 전무(All or Nothing)' 원칙을 따른다. 트랜잭션 관리는 데이터의 일관성과 신뢰성을 보장하는 핵심 메커니즘이다.
트랜잭션은 ACID 속성을 만족해야 한다. 원자성은 트랜잭션의 연산이 데이터베이스에 모두 반영되거나 전혀 반영되지 않음을 보장한다. 일관성은 트랜잭션이 실행을 성공적으로 완료하면 데이터베이스 상태가 사전 정의된 규칙과 일관성을 유지함을 의미한다. 고립성은 동시에 실행되는 여러 트랜잭션이 서로 간섭하지 못하도록 격리시키는 성질이다. 지속성은 한 번 커밋된 트랜잭션의 결과는 시스템 장애가 발생하더라도 영구적으로 보존됨을 보장한다.
여러 사용자가 동시에 데이터베이스에 접근할 때 발생할 수 있는 문제를 관리하기 위해 동시성 제어 기법이 사용된다. 주요 기법은 다음과 같다.
기법 | 설명 |
|---|---|
데이터 항목에 대한 접근을 제어하는 가장 일반적인 방법이다. 공유 락과 배타 락을 사용한다. | |
타임스탬프 순서 | 트랜잭션에 고유한 타임스탬프를 부여하고, 시간 순서에 따라 작업을 스케줄링한다. |
다중 버전 동시성 제어 | 데이터 항목의 여러 버전을 유지하여 읽기 작업과 쓰기 작업의 충돌을 줄인다. |
이러한 기법들은 데드락 같은 문제를 방지하거나 탐지하고 해결하는 메커니즘과 함께 작동한다. 트랜잭션의 종료는 커밋을 통해 변경 사항을 영구 저장하거나, 롤백을 통해 트랜잭션 시작 전 상태로 되돌리는 방식으로 이루어진다.
5.1. ACID 속성
5.1. ACID 속성
ACID는 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 네 가지 핵심 속성의 약자이다. 이 개념은 데이터베이스 시스템에서 신뢰성 있는 처리를 위한 기본적인 요구사항을 정의한다.
ACID 속성은 다음과 같다.
속성 | 설명 |
|---|---|
원자성 (Atomicity) | 트랜잭션은 모두 수행되거나 모두 수행되지 않아야 한다. 중간에 오류가 발생하면 트랜잭션 시작 전 상태로 롤백된다. |
일관성 (Consistency) | 트랜잭션이 성공적으로 완료되면 데이터베이스 상태는 미리 정의된 모든 무결성 제약조건을 만족해야 한다. |
격리성 (Isolation) | 동시에 실행되는 여러 트랜잭션은 서로에게 영향을 미치지 않고 독립적으로 실행되는 것처럼 동작해야 한다. |
지속성 (Durability) | 한 번 커밋된 트랜잭션의 결과는 시스템 장애가 발생하더라도 영구적으로 보존되어야 한다. |
이 속성들은 상호 연관되어 있다. 예를 들어, 원자성은 트랜잭션의 부분 완료를 방지하고, 일관성은 비즈니스 규칙을 준수하도록 보장한다. 격리성은 동시 실행 시 데이터의 일관성을 유지하며, 지속성은 하드웨어 장애 후에도 데이터 손실을 방지한다. 대부분의 관계형 데이터베이스 관리 시스템 (DBMS)은 로그 기록, 잠금, 다중 버전 동시성 제어 등의 메커니즘을 통해 ACID 속성을 구현한다.
5.2. 동시성 제어
5.2. 동시성 제어
동시성 제어는 여러 트랜잭션이 동시에 실행될 때 데이터베이스의 일관성을 유지하고 문제를 방지하는 메커니즘이다. 주요 목표는 동시 실행되는 트랜잭션들이 서로 간섭하지 않도록 하여 데이터 무결성을 보장하는 것이다. 이를 위해 잠금, 타임스탬프, 낙관적 동시성 제어 등 다양한 기법이 사용된다.
잠금 기반 프로토콜은 가장 일반적인 방법으로, 트랜잭션이 데이터 항목을 읽거나 수정하기 전에 잠금을 획득하도록 한다. 잠금에는 공유 잠금과 배타적 잠금이 있다. 공유 잠금은 여러 트랜잭션이 동시에 데이터를 읽을 수 있게 하지만, 배타적 잠금은 한 트랜잭션만 데이터를 수정할 수 있도록 한다. 잘못된 잠금 사용은 데드락을 유발할 수 있다.
기법 | 설명 | 주요 특징 |
|---|---|---|
[[락 | 잠금 기반 프로토콜]] | 데이터 항목에 대한 접근을 잠금으로 제어 |
각 트랜잭션에 고유 타임스탬프 부여 | 트랜잭션의 시간적 순서에 따라 직렬성을 보장한다. | |
충돌이 드물다고 가정하고 검증 단계에서 확인 | 읽기 단계, 검증 단계, 쓰기 단계로 구성된다. |
동시성 제어의 성공 여부는 직렬 가능성으로 판단한다. 이는 동시에 실행된 트랜잭션들의 결과가 어떤 순서로 차례대로 실행된 결과와 동일해야 함을 의미한다. 대부분의 상용 관계형 데이터베이스 관리 시스템은 이러한 기법들을 조합하여 효율적인 동시성 관리를 구현한다.
6. 주요 데이터베이스 관리 시스템 (DBMS)
6. 주요 데이터베이스 관리 시스템 (DBMS)
관계형 데이터베이스를 관리하는 소프트웨어를 데이터베이스 관리 시스템(DBMS)이라고 한다. 시장에는 여러 상용 및 오픈 소스 관계형 DBMS(RDBMS) 제품들이 존재하며, 각각 특정 기능, 성능, 확장성, 비용 구조를 가지고 있다.
가장 널리 알려진 상용 RDBMS는 오라클 데이터베이스와 마이크로소프트 SQL 서버이다. 오라클 데이터베이스는 대규모 엔터프라이즈 환경에서 고성능, 고가용성, 강력한 보안 기능으로 유명하다. 마이크로소프트 SQL 서버는 주로 윈도우 서버 환경과 깊게 통합되어 있으며, 비즈니스 인텔리전스 도구와의 호환성이 뛰어나다.
오픈 소스 RDBMS로는 MySQL과 PostgreSQL이 대표적이다. MySQL은 웹 애플리케이션 개발에 매우 널리 사용되며, 속도와 사용 편의성이 장점이다. PostgreSQL은 표준 SQL 준수도가 높고, 고급 데이터 타입, 트리거, 저장 프로시저 등의 기능이 풍부하여 기술적으로 진보된 시스템으로 평가받는다.
DBMS | 주요 특징 | 라이선스 |
|---|---|---|
대규모 엔터프라이즈용, 고가용성, 고성능 | 상용 | |
윈도우 환경과 긴밀한 통합, 비즈니스 인텔리전스 | 상용 | |
웹 개발에 최적화, 빠른 속도, 사용 편의 | 오픈 소스 (듀얼 라이선스) | |
표준 SQL 높은 준수, 고급 기능, 확장성 | 오픈 소스 |
이 외에도 IBM Db2, SQLite, 마리아DB 등 다양한 RDBMS가 특정 용도나 시장을 대상으로 존재한다. 선택은 애플리케이션의 규모, 예산, 필요한 기능, 개발 팀의 숙련도 등을 고려하여 이루어진다.
6.1. Oracle, MySQL, PostgreSQL
6.1. Oracle, MySQL, PostgreSQL
Oracle Database는 오라클 사가 개발한 상용 관계형 데이터베이스 관리 시스템이다. 기업용 환경에서 높은 신뢰성, 확장성, 그리고 강력한 기능을 제공하는 것으로 평가받는다. 온라인 트랜잭션 처리, 데이터 웨어하우징 등 다양한 비즈니스 요구사항을 충족시키며, 고급 보안, 백업 및 복구, 클라우드 통합 솔루션을 갖추고 있다.
MySQL은 오픈 소스 라이선스를 기반으로 하는 인기 있는 관계형 데이터베이스 관리 시스템이다. 원래 스웨덴의 MySQL AB사가 개발했으며, 현재는 오라클의 소유이다. 웹 애플리케이션 개발에 널리 사용되며, 특히 LAMP 스택의 핵심 구성 요소로 자리 잡았다. 비교적 가볍고 설정이 쉬우며, 커뮤니티 에디션을 무료로 사용할 수 있어 접근성이 높다.
PostgreSQL은 진보된 오픈 소스 객체-관계형 데이터베이스 시스템이다. 표준 SQL을 엄격히 준수하며, 복잡한 쿼리, 외래 키, 트리거, 뷰, 트랜잭션 무결성 등의 고급 기능을 제공한다. 확장성이 뛰어나 사용자가 새로운 데이터 타입, 함수, 연산자 등을 정의할 수 있다. 학술적 기반이 탄탄하고 표준 준수에 철저하여, 높은 데이터 무결성이 요구되는 복잡한 애플리케이션에 적합하다.
시스템 | 개발사/주체 | 주요 특징 | 주요 사용 사례 |
|---|---|---|---|
고성능, 고가용성, 포괄적인 엔터프라이즈 기능 | 대규모 기업 자원 관리, 금융 시스템 | ||
오라클 (인수) | 빠른 속도, 사용 편의성, 넓은 커뮤니티 | 웹 애플리케이션, 중소규모 시스템 | |
PostgreSQL 글로벌 개발 그룹 | 표준 준수, 확장성, 고급 기능 | 공간 데이터, 복잡한 분석, GIS 시스템 |
6.2. Microsoft SQL Server
6.2. Microsoft SQL Server
Microsoft SQL Server는 마이크로소프트가 개발하고 판매하는 상용 관계형 데이터베이스 관리 시스템(RDBMS)이다. 주로 윈도우 서버 환경에서 실행되도록 설계되었으며, 기업용 애플리케이션, 데이터 웨어하우스, 비즈니스 인텔리전스 솔루션에 널리 사용된다. 초기 버전은 Sybase와의 협력으로 개발되었으나, 이후 마이크로소프트의 독자적인 개발 경로를 걸어왔다.
주요 구성 요소와 기능으로는 데이터베이스 엔진(SQL Server 데이터베이스 엔진), SSIS(SQL Server Integration Services), SSAS(SQL Server Analysis Services), SSRS(SQL Server Reporting Services) 등이 있다. 데이터베이스 엔진은 핵심 저장 및 처리 기능을 담당하며, 나머지 서비스들은 데이터 통합, 다차원 데이터 분석, 보고서 생성 및 배포를 위한 플랫폼을 제공한다. 또한 T-SQL(Transact-SQL)이라는 자체 SQL 방언을 사용한다.
주요 버전 역사는 다음과 같다.
버전 | 출시 연도 | 주요 특징 |
|---|---|---|
SQL Server 2000 | 2000 | 64비트 지원, XML 기능 도입 |
SQL Server 2005 | 2005 | .NET CLR 통합, SSIS 도입 |
SQL Server 2008 | 2008 | 데이터 암호화, 압축 기능 강화 |
SQL Server 2012 | 2012 | 고가용성 솔루션 AlwaysOn 도입 |
SQL Server 2016 | 2016 | R 언어 지원, 실시간 운영 분석 |
SQL Server 2019 | 2019 | 빅 데이터 클러스터, Apache Spark 통합 |
라이선스 모델은 복잡하며, 코어 기반 라이선싱과 서버+CAL(클라이언트 액세스 라이선스) 모델을 병행한다. 개발자 및 학습용으로는 기능 제한이 있는 무료 버전인 SQL Server Express를 제공한다. 마이크로소프트의 클라우드 플랫폼인 Azure에서는 완전 관리형 서비스인 Azure SQL Database로도 이용 가능하다.
7. 장단점
7. 장단점
관계형 데이터베이스는 구조화된 데이터를 관리하는 데 있어 명확한 장점을 제공한다. 가장 큰 장점은 SQL을 통한 강력하고 직관적인 데이터 조회 및 조작 능력이다. 데이터는 명확하게 정의된 스키마에 따라 테이블에 저장되며, 기본키와 외래키를 통한 조인 연산으로 여러 테이블 간의 관계를 쉽게 탐색하고 결합할 수 있다. 또한 ACID 속성을 준수하는 트랜잭션 관리를 통해 데이터의 정확성과 일관성을 보장하며, 무결성 제약조건을 통해 비즈니스 규칙을 데이터베이스 수준에서 강제할 수 있다. 이러한 특성은 금융 거래, 재고 관리, 고객 정보 시스템 등 높은 데이터 정확도가 요구되는 분야에 매우 적합하다.
반면, 관계형 데이터베이스는 몇 가지 한계점도 가지고 있다. 사전에 정의된 고정된 스키마는 유연성을 떨어뜨린다. 데이터 구조를 변경하려면 스키마를 수정해야 하며, 이는 운영 중인 시스템에서 복잡하고 시간이 소요되는 작업이 될 수 있다. 또한 대규모의 분산 환경에서 수평 확장성이 제한적이다. 데이터를 여러 서버에 분산시키는 샤딩은 구현이 복잡하고, 조인 연산 성능을 저하시킬 수 있다. 마지막으로, 문서, 그래프, 키-값 쌍과 같은 비정형 또는 반정형 데이터를 효율적으로 저장하고 처리하는 데는 적합하지 않을 수 있다.
다음 표는 관계형 데이터베이스의 주요 장단점을 요약하여 보여준다.
8. 대안 및 발전
8. 대안 및 발전
관계형 데이터베이스는 수십 년간 데이터 관리의 표준으로 자리 잡았으나, 특정 영역에서 한계를 드러내며 새로운 형태의 데이터베이스 기술이 등장하는 계기가 되었다. 특히 대규모 분산 시스템, 비정형 데이터 처리, 높은 쓰기 처리량 요구사항 등에서 관계형 모델의 엄격한 스키마와 ACID 트랜잭션 보장이 오히려 병목 현상이 될 수 있었다. 이러한 배경에서 NoSQL 데이터베이스와 NewSQL이라는 두 가지 주요 대안 및 발전 방향이 등장했다.
NoSQL 데이터베이스는 "Not Only SQL"을 의미하며, 관계형 모델을 따르지 않는 다양한 데이터 모델을 채택한다. 주요 유형은 다음과 같다.
유형 | 설명 | 대표 예시 |
|---|---|---|
키-값 스토어 | 단순한 키와 값의 쌍으로 데이터를 저장하며, 매우 빠른 조회 성능을 제공한다. | |
문서 지향 데이터베이스 | ||
컬럼 패밀리 스토어 | 행 대신 컬럼 패밀리 단위로 데이터를 저장하여 대용량 분석에 유리하다. | |
그래프 데이터베이스 | 노드와 관계(엣지)로 데이터를 표현하여 복잡한 연결 관계 분석에 특화되었다. |
이들은 일반적으로 스키마 유연성, 수평적 확장성(Scale-out), 높은 가용성을 강점으로 내세우지만, 강력한 일관성보다는 결과적 일관성을 보장하는 경우가 많다.
한편, NewSQL은 관계형 데이터베이스의 강점과 NoSQL의 확장성을 결합하려는 접근 방식이다. NewSQL 시스템은 여전히 SQL을 사용하고 ACID 트랜잭션을 지원하지만, 분산 아키텍처와 인메모리 처리 등의 기술을 도입하여 대규모 온라인 트랜잭션 처리(OLTP) 성능을 극대화하는 것을 목표로 한다. 대표적인 예로는 Google Spanner, CockroachDB, MemSQL(현 SingleStore) 등이 있다. 이들은 클라우드 환경에서의 글로벌 분산 데이터베이스 운영을 가능하게 하는 등 관계형 모델의 진화 형태를 보여준다.
결과적으로 현대의 데이터 환경은 단일 기술로 해결하기보다, 작업의 종류에 따라 관계형 데이터베이스, NoSQL, NewSQL을 혼용하는 폴리글랏 퍼시스턴스 접근 방식이 일반화되고 있다.
8.1. NoSQL 데이터베이스
8.1. NoSQL 데이터베이스
NoSQL 데이터베이스는 관계형 데이터베이스의 한계를 극복하고자 등장한 다양한 유형의 데이터베이스들을 포괄하는 용어이다. 'Not Only SQL'의 약자로, 관계형 모델을 사용하지 않고, 대규모 분산 시스템 환경에서의 확장성, 유연성, 성능에 중점을 둔다. 관계형 데이터베이스가 엄격한 스키마와 SQL을 강조한다면, NoSQL은 데이터 모델에 따라 문서, 키-값, 와이드 컬럼, 그래프 등 다양한 형태로 데이터를 저장한다.
주요 NoSQL 데이터베이스 유형은 다음과 같이 분류된다.
유형 | 설명 | 대표 예시 |
|---|---|---|
문서 지향(Document) | ||
키-값(Key-Value) | 가장 단순한 형태로, 고유한 키에 하나의 값(문자열, 리스트, 객체 등)을 매핑하여 저장한다. | |
와이드 컬럼(Wide-Column) | 행과 열로 구성되지만, 관계형 테이블과 달리 각 행마다 다른 열을 가질 수 있는 유연한 구조이다. | |
그래프(Graph) |
NoSQL 데이터베이스는 빅데이터와 실시간 웹 애플리케이션의 성장과 함께 주목받았다. 수평적 확장(Scale-out)이 용이하여 데이터 양과 트래픽이 급증하는 상황에서 성능을 유지할 수 있다. 또한 스키마가 유동적이거나 사전에 정의되지 않아도 되므로, 빠르게 변화하는 데이터 구조를 처리하는 데 유리하다. 그러나 ACID 트랜잭션을 완전히 보장하지 않는 경우가 많고, 데이터 일관성 모델이 상황에 따라 달라질 수 있다는 점이 관계형 데이터베이스와의 주요 차이점이다.
8.2. NewSQL
8.2. NewSQL
NewSQL은 기존 관계형 데이터베이스 관리 시스템의 강력한 ACID 트랜잭션 보장과 SQL 인터페이스를 유지하면서, NoSQL 데이터베이스 시스템들이 주로 해결하고자 했던 대규모 확장성 문제를 해결하기 위해 등장한 데이터베이스 시스템의 한 부류이다. 이 용어는 2011년 매튜 애즐릿이 처음 사용하였다[7]. NewSQL은 기존 OLTP 워크로드를 위한 관계형 데이터베이스의 한계, 특히 분산 환경에서의 확장성 부족과 성능 문제를 극복하는 것을 목표로 한다.
주요 접근 방식은 크게 세 가지로 나눌 수 있다. 첫째, 완전히 새로운 엔진을 구축하는 방식이다. Google Spanner, VoltDB, NuoDB 등이 이에 해당하며, 메모리 최적화, 분산 아키텍처, 락 제거 등의 기술을 통해 성능을 극대화한다. 둘째, 기존 오픈 소스 DBMS 엔진을 대체하는 스토리지 엔진 방식이다. 예를 들어, MySQL에 클러스터 기능을 제공하는 MySQL Cluster나, PostgreSQL을 기반으로 한 CockroachDB가 있다. 셋째, 클라우드 컴퓨팅 서비스 형태로 제공되는 관리형 데이터베이스 서비스이다. Amazon Aurora, Google Cloud Spanner, Microsoft Azure SQL Database의 하이퍼스케일 계층 등이 이 범주에 속한다.
접근 방식 | 설명 | 대표적인 예시 |
|---|---|---|
신규 엔진 | 기존 시스템과 호환되지 않는 완전히 새로운 아키텍처를 구축. | |
트랜스페어런트 샤딩 미들웨어 | 기존 DBMS 앞단에 샤딩과 라우팅을 관리하는 계층을 추가. | |
클라우드 네이티브 관리형 DB | 클라우드 환경에 최적화된 분산 아키텍처를 서비스 형태로 제공. |
NewSQL 시스템의 공통적인 기술적 특징으로는 대부분의 데이터를 메모리에 상주시켜 디스크 I/O 병목을 줄이는 것, 분산 커밋 프로토콜을 사용하여 확장성과 일관성을 동시에 달성하는 것, 그리고 효율적인 동시성 제어 메커니즘(예: 다중 버전 동시성 제어)을 채택하는 것 등을 들 수 있다. 이들은 전통적인 관계형 데이터베이스가 가지지 못한 수평적 확장성(샤딩)을 제공하면서도 애플리케이션 개발자에게 친숙한 SQL 인터페이스와 강력한 데이터 일관성을 유지한다는 점에서 차별화된다.
