일단 씻고 나가자
[쉬운코드] 데이터베이스 본문
(본 포스팅은 해당 영상의 정리 및 개인 공부의 목적 포스팅임을 밝힙니다.)
널널한 개발자 TV. (2022, 03 01).
네트워크 기초 이론 [비디오 파일].
검색 경로 https://www.youtube.com/playlist?list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe
데이터베이스 (Database)
백엔드에 필요한 DB 지식들을 정리했어요~ :) 내용은 컴공과 수업에서 다루는 수준입니다
www.youtube.com
DB 관련 용어
- DB
: 전자적으로 저장되고 사용되는 관련 있는 데이터들의 조직화된 집합
- DBMS (DataBase Management System)
: 데이터베이스의 정의, 제작, 관리 등의 기능을 제공하는 소프트웨어 시스템 (쿼리 분석 등)
(ex. MySql, Oracle 등)
- metadata
: data about data. 데이터를 설명하기 위한 부가적인 정보. DBMS에 의해 저장 및 관리됨
(ex. 구조, 제약 조건, 인덱스, 데이터 유형 등)
- data models
: DB 구조(데이터 유형, 데이터 관계, 제약 사항)를 추상화하는 개념
- conceptual data models
: 추상화 수준이 가장 높은, 일반 사용자들이 이해할 수 있게
(ex. ER diagram) - logical data models
: 데이터가 실제 저장될 때의 구조와 크게 다르지 않게 구조화
(ex. relational data model, object data models, object-relational data model) - physical data models
: 컴퓨터에 데이터가 어떻게 파일 형태로 저장되는지 기술
플랫폼 종속적이며, 데이터베이스 테이블, 행, 데이터 유형, 인덱스(access path) 등을 기술
(ex. ERD cloud)
- database schema
: data model을 바탕으로 database 구조를 기술 (애트리뷰트)
- database state (snap shot)
: 특정 시점에서 database에 존재하는 데이터들의 집합
- 3 schema architecture
: user application과 physical database를 분리(관점)하기 위한 아키텍쳐.
즉, 물리 레벨에서의 데이터베이스의 변경이 user 단계에서 영향을 끼치지 않게 계층을 나눔.
- (외부) external schema (user views) level
: 사용자별로 필요한 데이터만의 관점 - (개념) conceptual schema level
: 제약 조건, 엔티티와 관계 등 전체 데이터베이스 관점 - (내부) internal schema level
: 필드명, 인덱스, 자료구조 등 개발자 관점
기존엔 외부/내부 계층만 존재했으나,
사용자별 각자 필요한 데이터들이 달라지고 다양화되며 중복되는 내부 데이터들이 많아져 분리.
https://bombo96.tistory.com/59
- DB 언어
- external schema : VDL (View Definition Language)
- conceptual schema : DDL (Data Definition Language)
- internal schema : SDL (Storage Definition Language)
- Database 데이터를 활용 : DML (Data Manipulation Language)
요즘 추세에서, 특히 relation 모델의 데이터베이스에서는
DDL이 모든 계층을 커버하며 사용되고, internal schema의 경우 파라미터로 정의한다.
최근의 DBMS는 DML, VDL, DDL을 통합한 하나의 언어로 존재. (ex. relation DB – SQL)
- 그 외 용어
- relation : 정보를 구분하여 저장하는 기본 단위 (table / tuples set)
- attribute : 저장하는 정보의 구분, 속성 (column)
- degree : 하나의 relation 내의 attribute의 개수
- tuple(record) : 하나의 relation 내의 한 개체의 전체 정보 단위 (row)
- cardinality : 하나의 relation 내의 tuple의 개수
- domain : 개별 attribute가 가질 수 있는 값의 범위 (enum + size / atomic values set)
* attribute & domain
domain은 특정 집합에 들어갈 수 있는 범위이자 값들의 모임이다.
이때 같은 domain이라도 다른 역할을 부여한 것을 attribute라 한다.
즉, domain 안에서 relation(table)에 따라 부여된 역할 이름이 attribute이다.
(ex. 핸드폰 번호, 비상 연락망 두 가지는 모두 phone number라는 domain이지만,
그 성질이 다르기에 다른 table(attribute)의 이름으로 저장할 수 있다.)
- key
- super key : tuple을 식별할 수 있는 attribute (or attributes set)
- candidate key(key, minimal super key) : 최소의 개수로 이루어진 super key set
- primary key : relation에서 식별용으로 선택된 candidate key
- unique key(alternate key) : primary key가 아닌 candidate key
- foreign key : 참조하는 다른 relation의 primary key
- constraints
: DB relation 들의 제약 조건
- implicit constraints
: relation model 자체의 제약 사항 (ex. 중복 tuple X, 같은 이름의 attribute X) - explicit (schema-based) constraints (무결성 제약 조건)
: DDL으로 명시할 수 있는 제약 사항 (integrity : 무결성 = 정확성 + 일관성)
( entity integrity / referential integrity / domain integrity)
* 무결성 제약 조건의 종류와 분류
무결성 제약 조건은 이론적 분류와 실제 SQL schema 에서 keyword가 되는 실무적 분류로 나뉘며,
이론적 분류 일부에 속하지만 파생되어 이론적 분류와 실무적 분류의 중간단으로 분류된 제약 조건으로 구분할 수 있다.
- 이론적 : Entity / Referential / Domain
- 중간단 : Unique / Null
- 실무적 : Primary Key / Foreign Key / Unique / Not Null / Check
SQL
SQL
: Structured Query Language
Relational data model의 relation과 다르게, SQL은 tuple의 중복을 허용한다.
(multiset tuples)
* SQL은 정의된 표준 및 기능이 존재하지만, 각각의 RDBMS(ex. MySQL, PostgreSQL,.,) 마다 구현해놓은 스펙이 다르므로 제공하는 서비스의 차이가 있을 수 있음.
명령어
- DDL (Data Definition Language)
: 데이터베이스 자체 생성 및 명령어
- SHOW DATABASES // 전체 데이터베이스 목록 출력
- CREATE DATABASE [이름] // [이름]의 데이터베이스를 생성
- USE [이름] // [이름]의 데이터베이스를 활성화, 혹은 사용
- SELECT database() // 현재 활성화 혹은 사용을 지정한 데이터베이스 출력
- DROP DATABASE [이름] // [이름]의 데이터베이스 삭제
* MySQL에서는 DATABASE와 SCHEMA가 동일한 의미 및 키워드로 사용되지만,
PostgreSQL에서는 SCHEMA가 DATABASE의 namespace 만을 의미.
- DML (Data Manipulation Language)
: 특정 테이블의 생성과 내부 attribute에 대한 제약 조건 선언 방법
CREATE TABLE [table 이름] ( [attribute 이름] [data type] [제약 조건] ); |
[data type]
- 숫자
: 정수 (INT, BIGINT) / 부동 소수 (FLOAT, DOUBLE) / 고정 소수 (DECIMAL, NUMERIC)
부동 소수 방식은 고정 소수 방식에 비해 실숫값이 정확하지 않다.
고정 소수 방식의 경우 [DECIMAL(총 자릿수, 소수 자릿수)] 방식으로 선언.
SQL의 표준에서는 Numeric은 자릿수를 엄격하게 저장, Decimal은 유연하게 저장하지만,
MySQL의 경우 두 가지 모두에서 자릿수를 엄격하게 저장한다.
- 문자
: 고정 크기 (CHAR) / 가변 크기 (VARCHAR) / 큰 크기 (TEXT, LONGTEXT)
CHAR(n)은 n개 이하의 문자는 공백으로 저장하고 가져올 때 공백을 제거하는 방식으로 활용되지만, VARCHAR(n)은 n개 이하의 저장된 문자만큼만 저장한다. VARCHAR는 메모리 이점은 있지만 속도가 CHAR가 상대적으로 빠르기에, 핸드폰 번호처럼 고정된 문자는 CHAR을 사용한다.
- 날짜, 시간
: 날짜 (DATE) / 시간 (TIME) / 혼용 (DATETIME, TIMESTAMP)
날짜는 ‘YYYY-MM-DD’, 시간은 ‘hh:mm:ss’ 혹은 ‘hhh:mm:ss’(경과 시간) 형태로 저장.
DATETIME은 1000년부터 9999년까지의 넓은 범위를, TIMESTAMP는 MySQL 서버 혹은 내부적인 timezone을 통해 표준 시간으로 변환 및 timezone 반영 후 가져온다.
- 그 외
: byte (BINARY, BLOB) / boolean (TINYINT) / 위치 (GEOMETRY) / JSON (JSON)
byte string은 암호화 혹은 파일 등에 활용.
boolean은 MySQL에서 지원하지 않아 TINYINT(1byte)로 대체.
[제약 조건]
- PRIMARY KEY // pk 선언
- FOREIGN KEY // fk 선언 (Referential Integrity constraint)
- UNIQUE // 중복된 값이 오지 못하도록 제약
- NOT NULL // null 값 금지 제약 (UNIQUE와 함께 자주 사용)
- DEFAULT [값] // 값이 들어오지 않았을 때 넣어주는 기본값
- CHECK [boolean 식] // 해당 값의 범위에 대한 제약 ( > < IN )
* [PRIMARY KEY, UNIQUE, CHECK]의 경우
제약 조건에 해당하는 attribute가 하나라면 옆에 선언 가능.
아니라면 table 선언 부 하단에 PRIMARY KEY(id1, id2) 로 선언.
CHECK는 검사 식이 두 개 이상의 attribute를 사용할 때 하단 부 선언.
* [FOREIGN KEY]의 경우
pk와 마찬가지로 하단 부에 선언하며, option을 걸어줄 수 있음.
option이란 참조하는 원래 테이블에서 foreign으로 걸려 있는 pk가 수정, 혹은 삭제되었을 때, 참조하고 있는 테이블에서 해당 attribute 값에 대한 처리의 선언을 의미함.
CREATE TABLE [table 이름] ( ... FOREIGN KEY (id1, id2) references [참조하는 테이블 이름] ( [pk 이름] ) on delete [삭제 시 처리할 option] on update [변경 시 처리할 option] ); |
SQL 표준에서의 FOREIGN KEY option의 종류는 다음과 같음
- CASCADE // 삭제, 변경 값을 그대로 반영
- SET NULL // 삭제, 변경 시 NULL로 반영
- SET DEFAULT // 삭제, 변경 시 선언된 default 값으로 반영
- RESTRICT // 삭제, 변경을 금지 (원래 테이블에서)
- NO ACTION // 트랜잭션 내에서는 삭제, 변경 허용.
단, 트랜잭션이 끝난 후 제약 조건을 위반한다면 삭제, 변경을 금지.
MySQL은 CASCADE, SET NULL, RESTRICT만을 지원.
PostgreSQL은 전체를 지원.
* [attribute 이름] [data type] CONSTRAINT [제약 조건 이름] [제약 조건]으로
제약 조건의 이름을 선언할 수 있음.
이는 에러 발생 시 이름 에러가 출력되어 확인이 쉬워짐.
* [ALTER TABLE] 명령어의 경우
테이블 생성 후 attribute, table 등의 스키마를 변경할 때 활용됨.
스키마의 변경은 다양한 이유로 일어날 수 있는데,
예를 들어 테이블 생성의 선후관계 등의 이유로 특정 table의 attribute에 fk를 선언할 땐
ALTER TABLE [table 이름] ADD FOREIGN KEY [attribute 이름] REFERENCES ...
으로 사용 가능.
ALTER TABLE [table 이름] [option] [option 대상 이름 및 조건]으로 활용되며,
option의 종류는 다음과 같음. (이외에도 다수 존재)
ALTER TABLE [table 이름] +
- ADD [attribute 이름] [data type] // attribute 추가
- ADD PRIMARY KEY ( [attribute 이름] ) // pk attribute 추가
- RENAME TO [새로운 table 이름] // table 이름 변경
- RENAME COLUMN [attribute 이름] TO [새로운 attribute 이름] // attribute 이름 변경
- MODIFY COLUMN [attribute 이름] [data type] // attribute data type 변경
이러한 작업은 서비스 중인 애플리케이션(Back-End)에 영향을 줄 수 있으므로 신중해야 함.
'Backend > Database' 카테고리의 다른 글
재귀 함수 (MySQL) (0) | 2025.03.19 |
---|