우선 SQL을 기초적인 부분 부터 다시 되짚어보고자 글을 작성한다. 기존에 부트캠프에서 Full Stack 기반으로 학습했었고, 개인 프로젝트로 실패를 경험해봤지만 정작 DB에 대해선 자세하게 공부하질 않았었다. DB는 정말 기본으로 알아야한다 생각하며 다시 중요한 개념부터 알아가보고자 한다.
데이터는 정말 다양하게 해석된다. 각 블로그 마다 정의한 내용이 차이가 있는데 공통된 부분은 다음과 같다.
데이터(data)는 컴퓨터가 처리할 수 있는 형태로 번역된 사실(숫자, 단어, 측정값, 관찰 등)의 모음이며, 가공되지 않은 순수한 원시 상태이다. 정보(Information)이랑 같은 뜻으로 혼동할 수 있는데 정보는 보다 넓은 개념으로 쓰인다. ndex를 색인으로 사용하
데이터의 예시)
: 온도, 습도, 날씨 같은 순수한 값
정보는 이 데이터들을 가공, 분석을 하여 유익한 목적으로 사용할 수 있도록 정리한 개념이다.
정보의 예시)
: 내일은 기온이 높으니 썬그림을 미리 준비해겠다는 의사 결정과 문제 해결
대충 플로우로 따지면 이렇다.
현상 => [관찰 - 측정] => 데이터 => [처리 - 가공] => 정보
데이터베이스(Database)는 수 많은 데이터를 구조화 하고, 효율적인 처리를 할 수있게 정리 정돈 된 것이 데이터베이스이며, 가공된 데이터들의 집합체이다. 우리는 데이터 베이스를 관리하기위해 어떠한 시스템을 활용하는데 이는 DBMS 라고 한다.
그럼 또 데이터 가공이 대체 뭐냐고 할 수 있는데, 수집된 데이터를 정리, 표준화 하여 통합 하는 일련의 과정을 말한다.
이름 그대로 데이터 관리 시스템이다. 우리가 데이터를 저장하거나 가져오는 것도 이 DBMS를 통해 이루어진다. 이런 DBMS의 종류는 다양한데 흔히들 알고있는 관계형DBMS(RDBMS), NoSQL DBMS, 인 메모리 DBMS(IMDBMS), 기둥형 DBMS(CDBMS) 등이 있다.
데이터베이스는 보통 한 종류만 쓰는게 아니라 상황에 맞게 여러개 쓰이는데, 우리가 자주 쓰는 DB가 바로 RDBMS이며, 이것부터 알아보자.
관계형 데이터 베이스는 데이터를 행(Row)과 열(Column)으로 구성된 표 형식으로 데이터를 관리한다. 엑셀이랑 상당히 유사하니 가져와봤다. 표로 만들어 가져와봤다.
RDBMS종류
zMySQL, SQL Server(MSSQL), MariaDB 등이 있다.
Table
: 행과 열로 이루어진 데이터들의 집합을 테이블이라고 한다. 엑셀 표하나를 완성해보면 그 하나의 표가 테이블이다. 여기서 RDMBS만의 특징으론 제약을 추가하여 Relation
이라고 부른다.
Column
: RDBMS에서 열은 어트리뷰트, 필드라고 불리며 세로로 묶은 데이터 셋이다. 해당 테이블의 속성을 의미하고, 열을 구성하는 값은 도메인으로 구성되어있다.
컬럼, 필드, 어트리뷰트(또는 속성) 이라고 불림.
Record
: RDBMS에서 행은 레코드, 튜플이라고 불리며, 가로로 묶은 데이터 셋이다. 해당 테이블의 속성을 뜻하고, 행을 구성하는 값은 행, 레코드, 튜플 이라고 불림.
Domain
: 어떤 필드에 각각의 속성들을 가진 값들의 집합을 의미한다. 그게 무슨말이냐면. string
의 속성이 부여된 필드에서는 문자열 외에는 다른 값이 들어갈 수 없다.이름, 전화번호 주소, 생일 등..
Schema
: 혹은 데이터베이스 스키마라고 하는 데, 데이터 베이스의 구조를 전반적으로 기술하는 것을 말한다. 레코드의 크기, 키의 정의, 레코드 간의 관계 등을 정의한 것을 말한다.많은 블로그, 많은 커뮤니티에서 Index
를 책의 목차에 비유한다. 가장 적절한 비유라서 이해하기 쉽게 널리 사용하는 표현같다. 책에서 특정 정보를 찾을 때, 목차에 적힌 페이지 숫자를 보고 찾아가듯 DB에서 내가 원하는 데이터를 찾기위해 INDEX를 통해 저장되어있는 물리적 주소로 찾아간다.
DB분야에서 INDEX는 테이블에 대한 동작속도를 높여주는 자료구조를 말한다.
해당 이미지 처럼,
특정 컬럼에 인덱스를 생성 할 경우, 해당 컬럼들을 정렬하여 별도의 메모리 공간에 물리적 주소와 함께 저장된다. 이를 통해 WHERE
,ORDER BY
같은 쿼리문을 사용하면, 먼저 인덱스에 저장되어있는 물리적인 주소로 가서 데이터를 가져오는 식으로 동작하여 검색속도의 향상을 가져올 수 있다.
클러스터 인덱스 | 논클러스터 인덱스 | |
---|---|---|
차이 | 물리적으로 행을 재배열 | 물리적으로 재배열 하지 않는다 |
크기 | 인덱스보다 페이지 용량이 Non-Clustered-Index페이지 용량보다 작다. | Clustered 인덱스 페이지 용량보다 크다. |
선택 | 30% 이내에서 사용해야함 | 3%이내로 사용 권장 |
최대개수 | 1개 | 249개 |
주의사항
정렬된 상태를 유지시켜줘야한다.
INSERT, UPDATE, DELETE를 통해 바뀌면 INDEX 테이블 내의 값들을 재정렬.
INDEX 테이블이 바뀌면 원본 테이블도 바꿔야한다.
전체 데이터중의 10~15%정도의 데이터만 처리할 때 사용.
인덱스의 관리
INSERT
: 새로운 데이터에 대한 인덱스 추가
DELETE
: 삭제하는 데이터의 인덱스를 사용하지 않음으로 처리.
UPDATE
: 기존 인덱스를 사용하지 않음 처리, 갱신된 데이터의 새로운 인덱스추가.
B Tree인덱스는 B-, B+, B 구조가 있는데, 이진 탐색 트리처럼 말그대로 Root 노드에서 자식노드로 뿌리가 뻗은 것처럼 보여서 B Tree라고 한다. 이중에서 가장 많이 사용되는 자료구조가 B+, B 트리인걸로 알고있다.
DMBS는 여러 자료구조를 통해 Index를 색인으로 사용하여 빠르고 효율적으로 데이터를 조회한다.
보통 일반적으로 Key라고하면 PK가 국룰이기 때문에 key는 index의 동의어이다 했다간 몰매맞기 쉽다.
인덱스도 여러 종류가 있는데 이건 다음 번에 알아보자..
관계형 DBMS에서 관계를 맺을 수 있는 테이블은 모두 릴레이션이라고 부른다.
슈퍼키(Super Key):
후보키(Candidate Key)
ㅇ. 릴레이션을 구성하는 속성들 중 튜플을 유일하게 식별할 수 있는 속성들의 부분집합
ㅇ. 모든 릴레이션은 하나 이상의 후보키를 가져야한다.
ㅇ. 모든 튜플에 대해서 유일성과 최소성을 만족시켜야함.
기본키(Primary Key):
ㅇ. 후보키 중 선택한 메인키(main Key)
ㅇ. 한 릴레이션에서 특정 튜플을 유일하게 구별할 수 있는 속성.
ㅇ. 기본적으로 UNIQUE하며 Null값을 가질 수 없음(개체 무결성 조건)
ㅇ. 동일한 값이 중복되어 저장될 수 없음.
ㅇ. 인덱스로 따지면 클러스터 인덱스.
외래키(Foreign Key):
ㅇ. 관계를 맺고 있는 릴레이션 A1, B2에서 릴레이션 A1이 참조하는 릴레이션 A2의 기본키와 같은 릴레이션 A1의 속성을 외래키,
ㅇ. 즉 A1 테이블이 A2의 기본키가 적용된 특정 컬럼을 참조하는데 이것과 같은 속성을 말함.
ㅇ. 릴레이션 간의 참조관계를 표현하는데 중요한 도구.
대체키(Surrogate Key):
ㅇ. 후보키가 둘 이상일 때 기본키를 제외한 나머지 후보키들
ㅇ. 보조키라고도 함.
복합키(Composite Key):
ㅇ. 연결키라고도 함.
ㅇ. 기본키(PK)를 여러 컬럼으로 묶어서 사용.
ㅇ. 한 테이블당 하나의 PK만 사용가능
ㅇ. 하나의 컬럼으로 데이터를 지정할 수 없는 경우 사용.
ㅇ. 효율적인 조회를 위해 묶어서 사용하기도함.
DDL
: Data Definition Language, 데이터 정의어라는 뜻인데, 말 그대로 데이터를 정의 하는 언어이다. 데이터의 정의하는 명령어로는 생성(Create), 수정(Alter), 삭제(DROP), 초기화(TRUNCATE) 등으로 저장된 데이터를 실질적으로 처리한다.
CREATE DATABASE dbname;
CREATE TABLE kimtable {
id not null primary key auto increment,
msg VARCHAR...
}
ALTER TABLE kimtable ADD COLUMN dd_column varchar(256) NOT NULL;
DROP DATABASE dbname
DROP TABLE dkimtable
TRUNCATE TABLE kimtable
DML
: Data Manipulation Language, 데이터 조작어 라고 하는데, DB안에 레코드를 조회, 수정 삭제 등의 역할을 한다.
// 해당 테이블의 모든 컬럼을 가져옴
SELECT * FROM table_name;
//해당 테이블의 특정 컬럼을 가져옴
SELECT a, b, c, d, e FROM table_name;
INSERT INTO tb_name (field_name1,field_name2,field_name3,)
VALUES (data_value1, data_value2, data_value3)
UPDATE tb_name SET Column1 = Value1, Column2 = Value2, ... WHERE
//테이블 전체 삭제
DELETE FROM tb_name
DCL: Data Control Language, 데이터 제어어라고하는데, DB에 접근하여 객체의 권한을 주는 등 데이터의 보안, 무결성, 회복, 병행 수행제어등을 정의하는데 사용한다.
GRANT : 특정 데이터베이스 사용자에게 특정 작업에 대한 수행권한 부여
REVOKE : 특정 데이터베이스 사용자에게 특정 작업에 대한 권한 박탈, 회수
COMMIT : 트랜잭션 작업을 취소 및 원래대로 복구하는 역할
ROLLBACK : 트랜잭션의 작업을 취소 및 원래대로 복구하는 역할