DBMS
DataBase Management System : 데이터베이스 관리 시스템
거대한 통합 데이터 저장소 (data collection) 프로그램이다. (DBMS는 소프트웨어다.)
RDBMS (Relational DBMS) : 관계형 데이터베이스 관리 시스템
관계형 데이터베이스는 엔티티(개체)와 엔티티 사이의 관계(릴레이션)을 통해 실제 세상을 모델링한다.
엔티티는 모델링하는 환경을 구성하는 요소이다.
학생이 수업을 듣는 환경을 모델링한다면, 엔티티는 '학생'과 '수업'으로 구성된다.
그리고 학생과 수업은 '수강한다' 라는 관계로 이루어져있다.
나는 엔티티는 명사, 관계는 동사로 구성하기 좋다고 이해했다.
"학생이 수업을 수강한다"
학생 - 수강하다 - 수업
File System vs DBMS
컴퓨터가 제공하는 파일 시스템도 똑같이 데이터를 저장하는 공간이다.
그렇다면 파일 시스템 대신 DBMS를 사용할 때 얻는 이점은 무엇일까?
데이터 독립성 & 데이터 관리
파일 시스템은 데이터를 체계적으로 관리하는 것이 쉽지 않다.
각각의 파일명과 폴더에 규칙을 정해서 비슷한 파일들끼리 묶어서 어느 정도 관리를 할 수는 있겠지만, 어느 정도 데이터가 쌓이면 관리에 어려움이 생긴다.
또한 체계적으로 관리를 한다고 해도, 그것은 '나만의 체계적인 관리 방법' 이다.
따라서 이 관리 방법에 따라 저장된 파일을 어떤 프로그램으로 조작한다고 하면 그 파일 시스템 구조를 알고있는 나만이 나만의 알고리즘으로 조작할 수 있다.
DBMS를 사용하면 데이터 표현과 저장에 대한 세부 사항이 표준화되어있고, 추상화 되어 있기 때문에 모든 사용자가 추상화된 공통 방법을 따라 같은 방식으로 데이터를 표현하고 저장할 수 있다.
DBMS는 SQL 이라는 표준형 언어를 통해 데이터를 조작할 수 있고, 테이블이라는 표준 형태에 맞춰 데이터를 다룬다.
효율적인 데이터 접근
데이터에 접근하는 프로그램을 작성한다고 할 때, 데이터가 많을수록 탐색 시간이 오래 걸리고, 보조기억장치에 저장되는 데이터를 프로그램에서 사용하기 위해 주기억장치로 불러올 때 그 크기의 차이와 속도의 차이 등으로 병목이 발생할 수 있다. 따라서 프로그램을 작성할 때는 이 문제를 고려하여 정교하게 짜야하는데, DBMS는 이를 고려하여 정교하게 짜여져있다.
데이터 무결성과 보안성
여러 사용자가 DB에서 접근해서 데이터를 조작하다보면 각 사용자가 의도한 것과 다르게, 또는 실제와 다르게 데이터가 조작될 수 있다.
DBMS는 이와 같은 데이터의 무결성(integrity)과 안전성(security) 을 지킬 수 있도록 도와주고, 특정 데이터에 동시 접근하는 상황에서 충돌을 막아준다.
동시 접근 & 손상 복구
DBMS는 여러 사용자가 동시에 데이터에 접근할 수 있는 기능을 제공한다.
병행 제어(Concurrency Control)는 병렬적으로 들어오는 요청을 처리하는 방법이다.
(동시성과 병행성은 엄밀하게 구분되는 말이다. 병행성은 요청이 병렬적으로 들어오는 것이고, 그 중에는 동시에 오는 것도 있겠지만 동시에 오지 않는 것도 있을 수 있다.)
병렬적으로 들어오는 요청을 처리할 때는 식사하는 철학자 문제의 예시처럼 데드락이 발생하지 않도록 유의하며 요청을 처리해야 한다.
특히 요즘은 대량의 데이터를 처리하면서 시스템이 거대화되고 있기 때문에, 여러 컴퓨터로 시스템이 나누어지고 있고, DB 역시 복제되고 있으며, 그에 따라 멀티 스레딩, 멀티 프로세스 프로그래밍 능력이 중요해지고 있다.
특히 거대한 데이터베이스에 여러 유저가 동시에 접근하면 데이터의 일관성이 깨지는 문제(inconsistency)가 발생할 수도 있다.
DBMS는 이를 방지할 수 있도록 도와주고, 데이터에 문제가 발생했을 때도 파일 복구도 직접 관리한다.
즉, DBMS는 단순히 데이터를 모아놓고 CRUD를 체계적으로 할 수 있도록 지원해주는 프로그램이 아니라, 보안, 접근 권한, 데이터 복구와 같은 여러가지 부가 기능을 제공하는 통합 시스템이다.
Data Model
데이터 모델은 데이터를 표현하는 개념에 대한 모음이다.
스키마(Schema)는 데이터 모음에 대한 정의를 말한다. 쉽게 이야기하면 테이블 구조로 생각할 수 있다.
따라서 만약 내가 어떤 개발중인 서비스의 데이터베이스에 접근해서 내용을 확인하고 싶다면, DB 관리자에게 '그 DB 스키마를 달라'고 요청하면 된다.
스키마를 통해 데이터가 어떤 구조로 되어있는지, 내가 개발을 할 때 어떻게 데이터를 불러들일 수 있는지 파악할 수 있다.
Relational Model of Data : 현대에 들어 가장 자주 사용되는 방식이다.
이 데이터 모델에서 중요한 개념은 relation (행과 열로 구성된 테이블) 이다.
모든 릴레이션은 스키마(구조)를 갖고 있으며, 스키마는 테이블의 컬럼(필드)가 어떻게 되어있는지 정의한다.
릴레이션은 레코드(행)들의 집합으로 구성된다.
이때 여기에서 말하는 릴레이션은 하나의 개체(엔티티)를 나타낼 수도 있고, 개체와 개체 사이의 관계(relationship)를 나타낼 수도 있다. 릴레이션을 관계(relationship)와 혼동하지 말자!
각 릴레이션은 무결성 제약조건 (intergrity constraint) 를 갖는다.
무결성 제약조건은 한 릴레이션에 있는 데이터(레코드)들이 반드시 만족해야 하는 조건들이다.
예를 들어 각 행을 구분할 id 값은 유일해야 한다는 조건이 대표적인 무결성 제약조건이다.
데이터 독립성과 추상화 단계 (level of abstraction)
데이터 독립성은 데이터를 사용하는 응용 프로그램과 데이터가 구분되어 있는 것을 말한다.
즉, 데이터의 내용, 저장구조의 변경이 응용 프로그램에 영향을 주지 않는 것을 말한다.
데이터 독립성은 위 그림과 같은 추상화 단계를 통해 이루어질 수 있다.
먼저 디스크에 저장되어있는 데이터를 먼저 물리적인 관점에서 추상화를 할 수 있고, (physical schema)
그 다음으로 개념적인 관점에서 추상화를 할 수 있다. (conceptual schema)
개념 스키마(논리적 스키마)는 DB에 저장되는 모든 릴레이션(테이블)의 구조를 기술한다.
따라서 개념 스키마는 테이블에 들어갈 필드와, 각 필드의 데이터 타입을 기술한다.
개념 스키마는 위와 같이 설계할 수 있다.
Students, Courses, Enrollled 라는 릴레이션이 있다고 할 때, 각 릴레이션을 구성하는 속성의 이름과 타입을 기술한다.
이때 sid, cid 는 기본키(Primary Key)로서 동작한다.
기본키는 릴레이션 내에서 하나의 레코드를 식별할 수 있도록 하는 최소한의 attribute로 구성된 집합이다.
Enrolled 는 Students, Courses 사이의 관계를 기술한 릴레이션으로, Students, Courses 의 기본키를 외래키로 갖는 테이블이다.
외래키는 다른 테이블의 기본키로서, 현재 레코드가 다른 테이블의 레코드와 관계를 맺을 때 사용하는 key이다.
물리적 스키마는 개념 스키마로 정의한 데이터를 실제 디스크에 어떻게 저장할지 기술한다.
우리가 논리적으로 데이터베이스에 데이터를 조작하는 표현을 할 때, DBMS는 논리적인 표현에 맞춰 데이터를 디스크에 저장하고, 조회하여 끌어올 것이다.
그런데 디스크는 CPU나 메모리와 같이 전자적인 움직임이 아닌 물리적인 움직임이다보니 상대적으로 시간이 오래 걸린다. 따라서 디스크에서 주로 병목이 발생하는데, 사용자가 빠르게 원하는 데이터를 얻을 수 있도록 하기 위해서 인덱싱 기법을 통해 빠르게 데이터를 읽을 수 있도록 한다.
이 인덱싱 기법이 바로 물리적 스키마의 대표적인 예시이다.
개념 스키마 밖에는 외부 스키마가 존재한다.
하나의 테이블에 있는 데이터를 DB사용자에 따라 다르게 보여주고 싶은 경우 사용한다.
(민감한 정보는 특정 DB유저에게 보여주지 않는다던가)
개념 스키마와 물리 스키마는 릴레이션 정의의 집합으로서 각각 하나씩만 존재하지만, 외부 스키마는 여러 개가 존재할 수 있다.
외부 스키마는 하나 이상의 뷰와 릴레이션으로 구성된다.
뷰는 개념 스키마로부터 만들어지는 하나의 릴레이션(테이블)이지만, 뷰 내에 있는 레코드는 실제 DBMS에 저장되지는 않는다.
말 그대로 어떤 릴레이션에 대한 특정 관점의 '뷰' 이기 때문이다.
그래서 어떤 테이블의 쿼리를 실행할 때 생성되는 임시 테이블도 '뷰' 라고 한다.
뷰에 대해서는 뒤에서 자세히 정리할 예정이다.
데이터베이스 구조
DBMS의 구조는 크게 위와 같이 되어있다.
먼저 데이터가 실제로 저장되는 디스크를 관리해주어야 하고,
디스크에 저장된 데이터는 메모리에 virtual page로 해서 올라가면 메모리 버퍼가 차면서 메모리에 있는 데이터를 DBMS가 읽어들일 수 있게 된다.
그 위에는 파일(페이지와 레코드의 모임, 인덱스와 힙 파일을 가리킴)과 파일에 대한 접근 방법에 대한 기술이 있다.
그 다음에 SQL을 통해 관계에 대해 조회하고 규정하는 구문을 제공한다.
마지막으로는 그런 구문을 사용할 때 더 빠르게, 최적화해서 실행하도록 하는 기술이 존재한다.
DB를 공부할 때는 위에서부터 아래로, 먼저 DB를 설계하고 쿼리를 짜는 것부터 정리할 예정이다.
'CS > 기초데이터베이스' 카테고리의 다른 글
[데이터베이스] 2. 트랜잭션 (4) | 2024.10.04 |
---|