[SQL][DB] DB 이론
DBMS (DataBase Management System)
- DBMS는 데이터베이스를 운영, 관리하는 소프트웨어이다.
- 이 DBMS 소프트웨어에도 여러 회사들에서 출시한 여러 제품들이 있다. 대규모로는 Oracle, MS-SQL 등이 있고, 중소 규모로는 MySQL, MariaDB 등이 있다. 유료로 사용할 수 있는 것과 무료로 사용할 수 있는 제품으로 나뉘기도 한다.
- 데이터를 엑셀과 같은 프로그램을 이용하여 파일로 저장하면 되지 왜 굳이 DBMS라는 것이 따로 필요한지 의문이 들 것이다. 그러나 데이터를 파일로 저장하는 방식에는 여러 단점들이 존재한다. 파일의 경우 한 번에 한 사람만 접속이 가능하여 여러 사람들이 동시에 접근해야 하는 상황에서는 파일 방식을 사용할 수 없다. 이러한 방식은 특히 여러 사람들이 동시에 접속하여 데이터를 입력, 수정, 삭제하는 작업이 일어나는 웹에서는 적용하기 어려울 것이다. 또한 파일 방식은 데이터를 순서대로 저장하는 방식이기에 저장하기엔 편리할 수 있으나, 조회, 수정, 삭제 등의 작업에선 매우 불편하다.
DBMS의 유형
- 계층형 DBMS (Hierarchical DBMS) : 처음으로 등장한 DBMS의 개념으로, 데이터들을 계층적인 트리 구조로 저장하는 방식이다. 트리를 구성하는 노드들이 다른 모든 노드들과 연결된 완전 그래프[3] 형식이 아니기에, 특정 데이터에서 다른 데이터로 접근하는 과정이 길어 접근 속도가 느리다. 또한 한 번 데이터를 구성하면 변경하기가 어렵다. 이러한 단점들로 인해 현재는 사용하지 않는 형태.
- 망형 DBMS (Network DBMS) : 기존 계층형 DBMS의 데이터 간 접근성이 안좋은 단점을 개선하기 위해 나온 개념. 기존 트리 구조를 구성하는 모든 노드들 사이를 연결한 완전 그래프 방식이자 순환형 그래프 구조. 그러나 그래프 관계가 너무 복잡해서 이를 실제로 구현하긴 어렵기에 이론적으로만 존재한다고 한다.
- 관계형 DBMS (Relational DBMS, RDBMS)) : 데이터를 2차원 형태의 행, 열로 구성된 테이블로 저장하는 방식으로, 현재 대부분이 사용하는 방식이다. 데이터를 테이블 형태로 저장하고, 서로 연관있는 테이블들끼리 하나의 데이터베이스로 묶는 방식이다.
- 객체 지향형 DBMS (Object-Oriented DBMS) : 여기서의 객체는 일반적으로 프로그래밍에서 접하는 그 객체가 맞다. 프로그래밍에 존재하는 객체지향 방식을 DBMS에 적용한 방식. 시간이 지나며 기존에 비해 대용량의 데이터와 더 복잡한 데이터 처리가 필요해짐이 따라 관계형 데이터베이스로는 이를 처리하기 어려워졌기에 나온 개념으로, 객체가 가지고 있는 데이터와 메서드라는 것을 이용하여 개발자가 이를 자유롭게 정의하여 데이터베이스를 구축할 수 있게 하는 방식이다. 기존의 RDBMS에서 제공하는 자료형인 문자, 숫자 등의 정형 정보(Structured information)과 더불어 RDBMS에는 담을 수 없는 사용자 정의 데이터, 멀티미디어 등의 비정형 정보(UnStructured information)도 객체를 이용하여 담을 수 있다. 이러한 장점에도, 기존 RDBMS 방식의 익숙함과 단순함, 객체 지향형 DBMS 에는 SQL 쿼리를 작성할 수 없다는 점, 성능적 단점, 다루기 어렵다는 여러 단점에 의해 현재는 특수 분야가 아니면 잘 안쓰인다고 한다.
- 객체 관계형 DBMS (Object-Related DBMS, ORDBMS) : 겍체지향형 방식과 관계형 방식을 결합한 방식.
DB 관련 개념들
Data persistence (데이터 지속성)
데이터 지속성은 앱이나 프로그램이 종료된 후에도 데이터가 지속되는 속성을 의미한다. 데이터 지속성을 확보한다면 데이터를 사용하는 프로그램을 재실행해도 의도치 않은 데이터의 삭제, 변형, 오염없이 이전과 똑같은 데이터를 가져올 수 있다.
이러한 데이터 지속성을 확보하려면 데이터는 비휘발성 저장소에 저장되어야 한다. 비휘발성은 프로그램이 종료되거나 전원 공급이 끊겨도 데이터를 지속적으로 보관할 수 있는 특성을 말한다. 프로그램이 종료되거나 전원이 끊기면 저장된 데이터를 잃어버리는 휘발성인 RAM이라는 주기억장치보다는 보조기억장치가 데이터 지속성을 잘 유지시켜줄 수 있을 것이다.
- 데이터 지속성이 중요한 이유.
- UX, 즉 사용자 경험을 향상시켜준다. 예를 들어, 사용자가 이전에 입력한 정보들을 기억하지 않았다가 나중에 어떤 작업으로 인해 사용자에게 다시 똑같은 정보를 입력하라고 요구하면? 사용자 입장에서는 짜증이 날 것이다. 데이터 지속성이 있다면 같은 정보를 또 묻지 않고도 바로 가져올 수 있다. ⇒ 데이터 지속성의 client-side에서의 장점.
- 성능적인 측면에서도 중요하다. 프로그램에서 사용할 데이터를 매번 프로그램을 실행할 때마다 또는 어떤 다른 작업을 할 때마다 다운로드 받아야한다면 이 과정 때문에 어떠한 작업을 처리하기 위한 시간이 더 오래걸릴 것이다. 데이터 지속성을 확보한다면 필요할 때에만 데이터를 다운로드받도록 하여 불필요한 데이터 전송을 줄일 수 있다. ⇒ 데이터 지속성의 client-side에서의 장점.
- 만약 구글 드라이브와 같은 클라우드에서 데이터를 지속적으로 저장할 수 있다면, 클라이언트 입장에서는 데이터를 굳이 자신의 로컬 디바이스에 저장할 필요없이 필요할 때만 다운로드 받아 사용하면 되기에 사용자 디바이스의 저장 공간도 확보할 수 있다는 장점이 있다. ⇒ 데이터 지속성의 server-side에서의 장점.
- 서로 다른 프로그램, 디바이스, 운영체제라도 똑같은 데이터에 접근할 수 있다. 이럴려면 데이터 지속성이 필수이다.
데이터베이스는 이러한 데이터 지속성을 유지시켜준다.
Data Warehouse
Warehouse는 창고를 뜻한다. 그렇다면 data warehouse는 데이터 창고를 의미하는 것이다. 해당 개념의 본 뜻은 데이터라는 정보에 입각하여 의사 결정을 내릴 수 있도록 해주는 분석 가능한 정보들을 저장한 중앙 저장소(repository)를 의미한다. 즉, 데이터를 아무렇게나 저장하는 저장소가 아닌, 의사 결정을 위한 분석이 가능하도록 데이터를 저장할 수 있게 설계된 데이터 저장소라 보면 된다. 데이터를 단순히 저장, 관리하는 목적으로만 사용하는 게 아니라, 이 데이터를 가지고 분석하여 비즈니스에서의 의사 결정 및 가치 창출도 하기 위해 나온 개념.
data warehouse도 database의 일종이라 언뜻 보면 둘의 차이점을 못 느낄 수 있는데, database와의 차이점은 사용 목적의 차이 외에도 다음과 같이 존재한다.
- 데이터베이스에 저장되는 데이터는 주로 현재 사용할 데이터들만 저장되지, 옛날 데이터까지 보관하지 않는다. 이는 성능 향상을 위해서이다. 반면, data warehouse는 데이터 분석을 용이하게 하기 위해 옛날 데이터들도 보관한다.
- 데이터 접근 방법이 다르다. database에서는 데이터 접근 시 한 번에 하나의 레코드(Record)만 접근하는 반면, data warehouse는 한 번에 여러 데이터들이 묶인 데이터셋 단위로 접근한다. database에는 데이터 업데이트 횟수가 빈번하고, 한 번에 한 레코드 또는 한 필드만 접속할 수 있는 반면, data warehouse는 데이터 업데이트 횟수가 그리 빈번하지 않다.
- database는 성능 및 일관성의 이유로 구조가 비교적 단순한 반면, data warehouse는 데이터 분석을 위해선 여러 정보 출처들로부터 정보를 얻어야하고, 분석의 용이함을 위해 같은 정보도 여러 버전으로 저장해야하기에 그 구조가 복잡하고 불규칙적이다.
Data Mining
대규모 데이터로부터 숨겨진 패턴, 관계, 통계적 규칙을 찾는 기법이다. Data Mining이라 하여 데이터 자체를 추출하는 게 아니다. 이 개념 역시 데이터로부터 유의미한 정보를 추출하여 비즈니스 가치 창출에 도움을 준다. DB나 DW(Data Warehouse)에 적용하여 데이터 분석을 할 수 있다.
RDBMS에서의 데이터 저장 단위
- 데이터(Data) : 테이블의 한 칸에 들어가는 단편적 정보.
- 필드(Field) : 테이블의 열에 해당. 데이터베이스에서 데이터를 저장하는 최소 단위이다. column, 속성이라고도 한다.
- 레코드(Record) : 여러 필드들로 구성된 실질적 데이터. 테이블의 한 행이 하나의 레코드이다. 실질적 데이터이므로, 테이블 내 행의 개수가 데이터의 개수라 할 수 있다. 튜플(tuple)이라고도 부른다.
- 테이블(Table) : 여러 레코드들이 모여 구성된 데이터 단위로, 행과 열로 구성된 표와 같은 2차원 개체이다. 파일로 저장되어 데이터 지속성을 가진다. 레코드, 필드는 주기억장치에 저장되어 데이터 지속성이 없다.
- 데이터베이스(Database) : 여러 테이블들로 구성된 데이터 단위이다. 데이터베이스에는 테이블 뿐만 아니라 데이터를 다루기 위한 여러 도구들도 포함되어 있다.
DBMS 연결 방식
- Network DBMS : 서버로 DBMS를 실행하고, 인터넷 상에서 여러 사용자들이 원격으로 접속하여 DB에 접근할 수 있는 방식이다. DB가 설치된 컴퓨터가 DB 서버가 된다. 서버로 실행할 프로그램과 클라이언트에서 실행할 프로그램으로 나뉜다.
- Local DBMS : 로컬 컴퓨터에 설치하여 개인용으로만 사용하는 방식이다. Network DBMS 방식에 비해선 소규모이다. MS-office의 Access와 모바일에서 주로 사용되는 SQLite가 대표적인 예이다.
SQL
다음의 페이지에서도 RDBMS와 SQL에 대해 다룬 적이 있으니 참고.
Structured Query Language (구조화된 질의 언어)의 약자로, RDBMS에서 데이터 검색, 저장, 처리 등의 작업을 위한 프로그래밍 언어이다.
여러 회사에서 발매한 여러 DBMS 프로그램들이 있는데, 각 프로그램마다 SQL 문법이 다르면 혼란이 생길 수 있으므로 “표준 SQL”을 준수한다. 그럼에도 각 회사들은 각자만의 SQL을 따로 만들어 추가하여 표준 SQL과 함께 사용한다. 표준 SQL만 배워둬도 어느 회사의 DBMS 제품을 사용하더라도 잘 사용할 수 있을 것이다.
SQL의 특징으로는 다음이 존재한다.
- 마치 질문, 대화하듯이 코드를 작성하는데, 이러한 언어를 Query Language라 한다. 물론 해당 언어에도 정해진 문법이 있어 이를 지켜가면서 작성해야 한다. SQL에서는 Query Language이기에 “코드”란 표현 대신 “쿼리”란 표현을 사용한다.
- 어떤 작업을 해야하는지만 알려줄 뿐, 그 작업을 구체적으로 어떻게 실행할지는 개발자가 명시하지 않아도 된다. 파이썬, 자바스크립트와 같이 어떠한 작업을 위해 변수, 함수를 선언하고 로직을 짜야하는 언어들과 달리 그러한 작업을 하지 않아도 된다는 장점을 가진다. 비유를 들자면 컴퓨터에게 “라면을 끓여줘”라고 말하면 그 명령 그대로 라면을 끓여주는 것이다. 컴퓨터에게 라면을 어떻게 요리해야 하는지, 면을 먼저 넣을지 스프를 먼저 넣을지 그 절차를 알려주지 않아도 된다. 이렇게 다른 프로그래밍 언어들에서는 보이는 변수 선언 등의 절차를 거치지 않기에 “비절차적 언어”이다. 즉, 절차지향적이지 않다. 또한 “선언형 언어”로도 분류된다.
참고) 선언형(Declarative) 언어는 개발자가 프로그램에게 무슨 작업을 해야할지만 알려주고 그 작업을 어떻게 수행해야할지는 신경쓰지 않아도 되는 언어를 의미한다. 이와 반대되는 명령형(Imperative) 언어는 개발자가 어떻게 작업을 해야 하는지까지 그 절차를 명시해야 한다. - 데이터만을 다루기 위한 언어로, 이 언어만으로는 자체적인 프로그램을 만들 수는 없다.
SQL 언어의 분류
SQL 언어에는 다음과 같이 분류할 수 있다.
- DDL (Data Definition Language) : 데이터 정의 언어로, 데이터베이스 및 테이블 또는 그외 개체들에 대한 생성, 삭제 등의 작업을 위한 언어이다. 어떻게 보면 데이터를 저장하기 위한 데이터베이스 구조를 설계하는 언어라 볼 수 있겠다. 주로 DB 관리자가 사용하는 언어이다. 데이터 자체를 직접 다루는 언어가 아니다. DDL 명령어에는 다음이 존재한다.
쿼리 구조 | 쿼리 예시 | 설명 |
---|---|---|
CREATE DATABASE dbname | CREATE DATABASE my_db | 데이터베이스를 생성 |
USE dbname | USE my_db | 현재 데이터베이스를 선택 |
DROP DATABASE dbname | DROP DATABASE my_db | 데이터베이스 및 그 안에 포함된 테이블들 모두 삭제 |
CREATE TABLE tbname (coldefs) | CREATE TABLE my_tb (id INT, count INT) | 테이블 생성 |
DROP TABLE tbname | DROP TABLE my_tb | 테이블 삭제 |
TRUNCATE TABLE tbname | TRUNCATE TABLE my_tb | 테이블에서 모든 행 삭제 |
위 테이블에는 중복되어 나타나는 명령어들이 있는데, 이를 축약, 정리하면 다음과 같다.
- CREATE : 데이터베이스 및 테이블 생성
- DROP : 데이터베이스 및 테이블 삭제
- TRUNCATE : 테이블 내 모든 행 삭제. 한 번 삭제하면 돌이킬 수 없다고 한다.
- USE : 데이터베이스 선택
-
ALTER : 데이터베이스 및 테이블 수정 시 사용.
- DML (Data Manipulation Language : 데이터 조작 언어. 실제 데이터를 조작할 때 사용되는 언어. CRUD(Create, Read, Update, Delete)라는 데이터 조작을 위한 4대 연산의 대표적 예이다. 개발자가 주로 사용하는 언어이다.
- INSERT : 새 데이터를 삽입, 저장한다.
- UPDATE : 기존 데이터를 수정한다.
- DELETE : 기존 데이터를 삭제한다.
사실 여기에 SELECT도 포함하는 관점이 존재하지만, SELECT만 따로 빼내 DQL로 분류하는 관점도 존재한다. 여기서는 DQL에서 따로 설명하겠다.
DML을 이용한 명령어 구조는 다음과 같다.
쿼리 구조 | 쿼리 예시 | 설명 |
---|---|---|
INSERT INTO tbname VALUES(…) | INSERT INTO my_tb VALUES(1, 12) | 행 추가 |
UPDATE tbname SET col = value WHERE condition | UPDATE my_tb SET count=3 WHERE id=5 | 한 열에 있는 몇몇 행 변경 |
DELETE FROM tbname WHERE condition | DELETE FROM my_tb WHERE count <= 10 OR id = 16 | 특정 행 삭제 |
- DCL (Data Control Language) : 데이터 제어 언어. 사용자의 데이터에 대한 접근을 제어하는 언어로, DB 백업, 권한, 보안 등의 DB 관리에 대한 모든 것을 다룬다. DB 관리자가 사용한다. 대표적인 명령어로 다음이 있다.
- GRANT : 특정 DB 사용자에게 특정 작업 수행 권한을 부여하는 명령어.
- REVOKE : 이전에 특정 사용자에게 부여한 특정 권한 박탈.
- 이 외에도 여러 명령어가 있다고 한다.
- DQL (Data Query Language) : 데이터 질의 언어. 데이터 검색을 위한 언어이다. SELECT문이 여기에 포함된다.
References
[1] 에이콘아카데미(강남) 강의
[2] 우재남, “혼자 공부하는 SQL”, (한빛미디어, 2021)
[3] 내 글 - “그래프 개요”. “그래프” 및 “완전 그래프” 개념에 대해 더 자세히 알고 싶다면 다음 글을 참조.
[4] 객체 지향 데이터베이스
[5] 위키피디아 - 겍체 관계 데이터베이스
[6] DBMS 종류
[7] MongoDB - An Introduction to Data Persistence
What Is Data Persistence? | Full Guide | MongoDB
[8] AWS - Data warehouse
데이터 웨어하우스란? - 데이터 웨어하우스 설명 - AWS
[9] Data warehouse VS Database
Data Warehouse vs. Database | Blog | Fivetran
[10] Difference between RDBMS and DW(Data Warehouse)
Can you explain the difference between RDBMS and DW (data warehouse)?
[11] AWS - 데이터 마이닝
데이터 마이닝이란 무엇입니까? 데이터 마이닝 설명됨 - AWS
[12] 위키피디아 - SQL
[13] AWS - SQL
SQL이란 무엇인가요? - 구조적 쿼리 언어(SQL) 설명 - AWS
This content is licensed under
CC BY-NC 4.0
댓글남기기