관계형 데이터베이스 관리 시스템
관계형 데이터베이스 관리 시스템(Relational Database Management System, RDBMS)은 관계형 데이터 모델을 기반으로 한 데이터베이스 관리 시스템을 말한다. 대부분의 데이터베이스 시스템은 RDBMS를 기반으로 설계되어 있으며, 대표적인 RDBMS로는 Oracle, MySQL, PostgreSQL, SQL Server 등이 있다.
관계형 데이터 모델
관계형 데이터 모델은 데이터를 테이블 형태로 구조화하여 저장하는 데이터 모델이다. 하나의 개체에 대한 데이터를 릴레이션에 저장하고, 릴레이션 간의 관계를 통해 데이터를 관리한다. 그럼 릴레이션이란 무엇일까? 관계형 데이터 모델을 이해하기 위해서는 릴레이션에 대한 이해가 필요하다. 릴레이션에 대해 알아보자.
릴레이션
릴레이션은 행과 열로 구성된 테이블을 말한다. 관계형 데이터베이스에서 정보를 구분하여 저장하는 기본 단위이기도 하다. 여기서 행은 레코드(Record)라고도 하며, 열은 속성(Attribute)이라고 한다.
릴레이션 스키마와 릴레이션 인스턴스
릴레이션은 스키마와 인스턴스로 구분된다. 릴레이션 스키마(Relation Schema)는 릴레이션의 구조를 정의한 것으로, 속성의 이름과 도메인을 정의한다. 릴레이션 인스턴스(Relation Instance)는 릴레이션 스키마에 따라 실제 저장된 데이터를 말한다.
릴레이션 스키마
릴레이션 스키마는 릴레이션의 구조를 정의한 것으로, 속성의 이름과 도메인을 정의한다. 속성의 이름은 속성을 식별하기 위한 이름인 건 알겠는데, 도메인은 무엇일까? 도메인은 속성이 가질 수 있는 값의 범위를 정의한 것으로, 속성의 타입을 정의한다. 컴퓨터는 속성만으로 어떤 타입의 값인지 알 수 없기 때문에, 속성의 도메인을 정의하여 속성의 타입을 명시한다. 참고로 이런 속성 집합의 개수를 차수(Degree)라고 한다.
예를 들어 만약 상품 릴레이션은 상품명, 가격, 수량의 속성을 가진다면, 상품명은 문자열, 가격은 숫자, 수량은 정수와 같이 속성의 도메인을 정의할 수 있다.
릴레이션 인스턴스
릴레이션 인스턴스는 릴레이션 스키마에 따라 어느 한 시점에 실제 저장된 데이터의 집합을 의미한다. 즉, 릴레이션 스키마에 따라 정의된 속성에 실제 데이터가 저장된 것이 릴레이션 인스턴스이다.
예를 들어 상품 릴레이션의 릴레이션 스키마가 상품명, 가격, 수량의 속성을 가지고 있다면, 상품 릴레이션의 릴레이션 인스턴스는 상품명이 ‘사과’, 가격이 1000원, 수량이 10개인 데이터가 저장된 것이다.
이러한 릴레이션 인스턴스에서 각각의 행을 튜플이라고 하는데, 같은 릴레이션에서의 모든 튜플은 릴레이션 스키마에 따라 같은 속성을 가진다. 여기서 튜플은 릴레이션 안에서 서로 중복되지 않아야 하는 특성을 가진다. 릴레이션에서는 이러한 튜플의 개수를 카디널리티(Cardinality)라고 하며, 카디널리티는 투플의 연산 과정에서 수시로 변한다.
릴레이션 특징
위에 설명한 릴레이션의 특성은 다음과 같다.
- 튜플의 유실성: 릴레이션에서는 튜플의 중복이 없어야 한다.
- 튜플의 무순서: 릴레이션에서는 튜플의 순서가 중요하지 않다.
- 속성의 무순서: 릴레이션에서는 속성의 순서가 중요하지 않다.
- 속성의 원자성: 속성 값은 원자 값이어야 한다.
키
키는 릴레이션에서 튜플들을 식별하는 역할을 하는 속성 또는 속성들의 집합이라고 할 수 있다. 튜플을 식별하기 위해서 키는 릴레이션에서 유일한 값을 가져야하는 유일성을 가져야하고, 최소한의 속성으로 구성되어야 하는 최소성을 가져야 한다. 키의 종류에는 슈퍼키, 후보키, 기본키, 대체키, 대리키, 외래키 등이 있다.
슈퍼키
슈퍼키는 튜플을 고유하게 식별할 수 있는 속성 또는 속성의 집합을 말한다. 대상관계의 모든 속성이 함수 종속하는 속성의 집합으로도 정의된다.
후보키와의 차이는, 슈퍼 키는 ‘고유하게 식별하는 모든 조합’을 뜻하는 점이다. 즉, 후보 키에 불필요한 속성을 덧붙여 장황하게 한 것은 후보 키는 아니지만 여전히 슈퍼 키이다. 더 줄일 수 없는 슈퍼 키, 즉 속성의 중복이 없는 슈퍼 키는 후보 키이기도 하다.
후보키
후보키는 슈퍼키 중 더 이상 줄일 수 없는 최소성의 형태을 가진 키를 말한다. 더 이상 줄일 수 없다는 것은 수퍼 키를 구성하는 속성 중 어느 하나라도 제외될 경우 유일성을 확보할 수 없게 되는 것을 말한다. 이를 최소성을 만족한다라고도 한다. 즉, 튜플의 식별을 위해 필요한 특성 또는 그 집합이 후보 키이다. 후보 키는 튜플의 식별자라고 할 수도 있다. 후보 키라는 이름은 그것이 기본 키로 선정될 수 있는 후보이기 때문에 유래했다.
하나의 릴레이션에서 관계를 정의할 때, 적어도 하나의 후보 키가 존재한다. 물론 하나의 릴레이션에 후보 키가 두 개 이상 존재할 수 있다.
기본키
기본 키(primary key)는
튜플의 식별자로 이용하기에 가장 적합한 것을 릴레이션마다 단 한 설계자에 의해 선택, 정의된 후보 키를 말한다.
유일 키는 0~1개 이상의 속성의 집합으로 볼 수 있다.
즉, 릴레이션에 저장된 튜플를 고유하게 식별하는 후보 키의 집합 중, 설계자가 일반적으로 이용되어야한다고 정해 놓은 것을 가리킨다.
반드시 기본 키를 사용해야만 하는 경우가 아니면, 다른 후보 키로 대체되어도 기능 수행에는 문제가 없다.
따라서 기본 키의 이론적 의의는 크지 않지만 실무에서 널리 사용되고 있는 개념이다.
그러나 기본 키는 NULL의 존재가 허용되지 않지만, 후보 키에 허용이 되는 차이가 있다.
릴레이션에 있는 후보 키가 하나인 때에는 그 후보 키가 당연히 기본 키가 된다.
대체키
대체키(Surrogate key)란 자연키에 대한 대체용으로 인공적이거나 합성적인 키를 말하며, 주로 주민등록번호 같은 중요한 자료를 숨기기 위해 대체키로 사용하거나, 여러 개의 컬럼을 합성하여 검색 시 속도 향상을 위해 사용한다.
대리키
대리키는 식별자가 너무 길거나 여러 개의 속성으로 구성되어 있는 경우 인위적으로 추가하는 식별자로, 인공키라고도 부른다. 한 실체에서 식별자가 여러 속성으로 구성된 경우는 데이터를 수정하거나 검색을 하는데 수행 속도가 떨어질 수 있다. 실체간에 관계가 생길 때 부모의 기본키가 자식의 외부키로 공유 되는데, 외부키가 단일해지기 때문에 조인의 속도를 향상시키기 위해 많이 사용한다.
외래키
외래 키는 참조하는 테이블에서 1개의 키(속성 또는 속성의 집합)에 해당하고, 참조하는 측의 관계 변수는 참조되는 측의 테이블의 키를 가리킨다. 참조하는 테이블의 속성의 행 1개의 값은, 참조되는 측 테이블의 행 값에 대응된다. 이 때문에 참조하는 테이블의 행에는, 참조되는 테이블에 나타나지 않는 값을 포함할 수 없다. 이러한 참조 관계는 2개의 테이블을 연관시키기 위한 관계 정규화의 본질적인 부분이다. 참조하는 테이블의 행 여러 개가, 참조되는 테이블의 동일한 행을 참조할 수 있다. 참조하는 테이블과 참조되는 테이블이 동일할 수도 있다. 이 경우는 외래 키가 자기 자신을 참조하는 것이다.
무결성 제약 조건
무결성 제약 조건은 데이터를 정확하고 유효하게 유지하는 무결성을 보장하기 위해 설정하는 제약 조건이다. 위와 같은 키를 통해 데이터의 무결성을 보장하고, 무결성 제약 조건을 통해 데이터의 정확성을 유지할 수 있다. 무결성 제약 조건에는 개체 무결성, 참조 무결성, 도메인 무결성, 사용자 정의 무결성 등이 있다.
개체 무결성
개체 무결성(Entity integrity)은 고유 키(유일 키)의 개념과 관련된다. 개체 무결성은 모든 테이블이 기본 키(primary key)를 가져야 하며 기본 키로 선택된 열은 고유하여야 하며 빈 값은 허용치 않음을 규정한다.
참조 무결성
참조 무결성(referential integrity)은 2개의 관련 있던 릴레이션 간의 일관성(데이터 무결성)을 말한다. 참조 무결성은 종종 기본 키 또는 키가 아닌 후보 키와 외래 키의 조합으로 강제 적용된다. 참조 무결성이 강제 적용되면 외래 키가 선언된 관계 변수의 외래 키를 구성하는 속성의 값은 그 관계 변수의 부모가 되는 관계 변수의 기본 키 값 또는 기본 키가 아닌 후보 키 값으로 존재해야 한다. 예를 들어, 다른 관계 변수의 외래 키에 의해 참조되는 쌍(dupe 행)을 제거하는 것은 참조 무결성을 파괴해 버리게 되기 때문에 관계 데이터베이스 관리 시스템(RDBMS) 참조 무결성을 유지하도록 일반적으로 삭제를 방지한다. 예외적으로 참조하는 외래 키를 포함하는 쌍을 연결하고 제거하는 것이 수반되어 삭제를 수행할 수 있으며,이 경우 참조 무결성이 유지된다. 외부 키에 의해 참조되는 듀프를 제거할 수 있는 지 여부는 데이터 정의 언어(DDL)에 의한 참조 무결성 제약 조건(constraint)에 의해 정의된다.
도메인 무결성
도메인 무결성(Domain integrity)은 정의된 범위에서 관계형 데이터베이스의 모든 열이 선언되도록 규정한다.
MySQL
MySQL에 대해 간단히 소개하자면, MySQL은 세계에서 가장 많이 쓰이는 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)이다. 구조질의어 형식의 데이터베이스 관리 시스템으로 오라클이 관리 및 지원하고 있다.
MySQL 엔진
MySQL은 사용자가 요청한 파서를 통해 SQL 쿼리를 분석 및 파싱하고, 옵티마이저를 통해 최적의 실행 계획을 수립하고, 스토리지 엔진을 호출하여 데이터를 저장하고 관리하는 역할을 한다. MySQL 8.0 버전에서는 다음과 같은 스토리지 엔진을 제공한다.
- InnoDB
- MyISAM
- Memory
- CSV
- Archive
- Blackhole
- ND
InnoDB
InnoDB는 MySQL의 기본 스토리지 엔진으로, 트랜잭션 처리와 ACID(Atomicity, Consistency, Isolation, Durability) 특성을 지원한다.
InnoDB는 트랜잭션 롤백, 커밋, 복구같은 장애 복구 기능을 지원한다. 무결성을 가져하는 중요한 데이터를 필요로할 때 유용하게 사용된다.
InnoDB 테이블은 기본적으로 클러스터형 테이블로 저장된다. 클러스터형 테이블은 레코드를 기본키 순으로 정렬해서 저장하고, 기본키에 대한 인덱스를 자동 생성해주기 때문에 기본키를 통한 범위 검색에 유리하다
또한 InnoDB는 레코드의 여러 버전을 유지할 수 있게 해주는 MVCC라는 기술을 통해 트랜잭션이 가능하게 해준다.
추가로 버퍼풀이라는 메모리 영역을 사용하여 데이터를 캐싱하고, 쓰기 지연 용도로 사용하여 디스크 I/O를 줄일 수 있다는 장점이 있다.