DB 및 SQL 기초 - 데이터베이스 설계
DBMS와 SQL로 데이터베이스 만드는 법을 간단하게 알아보자
DBMS
DBMS(Data Base Management System)
는 데이터베이스를 관리하기 편리하도록 만들어진 프로그램이다. RDB(Relational Database)
형 DBMS로는 MySQL, Oracle, MSSQL, PostgreSQL 등이 있으며, 본 게시글에서는 MySQL 기반의 MariaDB라는 DBMS를 사용한다.
MariaDB 및 SQL 사용법
Accessing MariaDB Server
mysql –u<username> -p<password>
위 명령어로 MariaDB 서버 유저로 로그인할 수 있다.
Managing databases
데이터베이스 조회
MariaDB [(none)]> SHOW DATABASES;
위 SQL 구문으로 현재 DBMS에 있는 데이터베이스 목록을 출력할 수 있다. []
안에는 현재 선택된 데이터베이스가 표시된다. SQL 구문은 기본적으로 대문자 입력이 원칙이지만, 소문자로 입력해도 정상적으로 인식된다.
데이터베이스 생성
MariaDB [(none)]> CREATE DATABASE kweb_db;
MariaDB [(none)]> USE kweb_db;
MariaDB [kweb_db]>
Managing users
유저 생성
CREATE USER '<username>'@'<host>' IDENTIFIED BY '<password>'
위와 같이 특정 호스트에 속하는 유저를 생성할 수 있으며, 생성된 계정은 해당 호스트에서만 접속 가능하다. 모든 호스트에서 접속 가능한 유저를 생성할 때는 host 값을 %
로 입력하면 된다.
username
이 같더라도 속한 host
가 다를 경우 서로 다른 유저로 취급된다.
권한 부여
GRANT ALL PRIVILEGES ON <db-name>.* TO '<username>'@'<host>'
사용자에게 특정 데이터베이스의 모든 테이블에 대해 모든 권한을 부여하는 SQL문이다. 모든 권한이 아닌 특정 권한만 부여할 수도 있다.
Data Types
각 테이블의 모든 column은 자료형(data type)을 가지며, 데이터 유형에 따라 적절한 자료형을 사용해야 한다.
Category | Data types |
---|---|
문자형 | CHAR , VARCHAR \((n<2^{16})\), TINYTEXT \((n<2^{8})\), TEXT \((n<2^{16})\), MEDIUMTEXT \((n<2^{24})\), LONGTEXT \((n<2^{32})\) |
숫자형 | TINYINT \((n<2^{8})\), SMALLINT \((n<2^{16})\), MEDIUMINT \((n<2^{24})\), INT \((n<2^{32})\), BIGINT \((\infty)\), FLOAT , DECIMAL , DOUBLE |
날짜형 | DATE , TIME , DATETIME , TIMESTAMP , YEAR |
이진 데이터 | BINARY , BYTE , TINYBLOB , BLOB , MEDIUMBLOB , LONGBLOB |
위 표는 MariaDB에서 제공되는 자료형 중 일부를 나타낸 것이다.
TINYINT
는 주로 boolean 값을 나타내기 위해 사용되며, VARCHAR
형은 80자가 기본이지만 VARCHAR(n)
과 같이 문자열의 길이를 항상 명시해주는 것이 권장된다.
이진 데이터 자료형은 거의 사용되지 않는다. 이진 데이터를 DB에 넣는 것보다는 path를 저장하고, 필요할 때 파일을 읽어오는 것이 훨씬 효율적이기 때문이다.
Managing Tables
테이블 생성
CREATE TABLE `courses` (
`name` VARCHAR(20) NOT NULL,
`department` VARCHAR(16) NOT NULL,
`code` VARCHAR(8) NOT NULL,
`is_major` TINYINT(1) NOT NULL,
`is_required` TINYINT(1) NOT NULL,
`credit` INT NOT NULL,
`period` INT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
대학의 개설 강의를 나타내는 테이블을 생성하는 SQL문이다.
courses
라는 이름의 테이블을 생성하고, 각 column의 이름과 자료형을 지정한다.
NOT NULL
은 해당 column에 NULL 값을 허용하지 않음을 의미한다.
ENGINE
은 테이블을 저장하는 방식을 지정하며, DEFAULT CHARSET
은 테이블의 기본 문자셋을 지정한다.
테이블 정보 확인
DESC <table-name>
위와 같이 DESC
키워드로 테이블의 설계 정보를 확인할 수 있다.
테이블 삭제
TRUNCATE <table-name>
DROP TABLE <table-name>
TRUNCATE
키워드로 테이블의 구조를 유지한 채 데이터만 삭제하거나, DROP TABLE
키워드로 테이블 자체를 완전히 삭제할 수 있다.
.sql
파일 로드
SOURCE <file-path>
.sql
파일을 로드하여 실행할 수 있다.
RDB 설계 방법론
Avoiding Redundancy
DB를 설계할 때, 구조가 동일한 테이블을 여러 개 생성하여 중복을 초래하는 것은 피해야 한다.
또한, 애플리케이션은 DB의 데이터에 대한 CRUD(Create, Read, Update, Delete) 연산만 수행하여야 하고, 그 외 테이블 또는 column의 수정 등 DB의 구조를 변경하는 작업을 수행해서는 안된다.
column의 경우, 최소한의 유의미한 데이터들로 나누어 저장하는 것이 좋다. 예를 들어, 대학교의 개설 과목 유형을 ‘전공필수’, ‘전공선택’과 같은 값을 갖는 column 하나로 관리하기보다는 ‘전공’과 ‘교양’ 여부, ‘필수’와 ‘선택’ 여부를 각각의 column으로 나누어 저장하는 것이 좋다.
Relational Designing
실제 DB 관리에는 테이블 간 관계가 존재하게 되는 경우가 많다. 이를 표현하기 위해 FOREIGN KEY
를 사용한다.
Primary Key and Foreign Key
Primary Key(기본 키)는 테이블의 각 row
에 부여된 고유 id이다. 관계형 데이터베이스에서는 참조되는 테이블이 아니더라도 Priamry Key를 설정하는 것이 권장된다.
기본 키 column 생성
CREATE TABLE `departments` (
`id` INT NOT NULL AUTO_INCREMENT,
`kor_name` VARCHAR(16) NOT NULL,
`eng_name` VARCHAR(50) NOT NULL,
`college` VARCHAR(16) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
위 SQL문에서 id
라는 column을 주목하여 보자. AUTO_INCREMENT
키워드를 사용하면 row 생성 시 자동으로 기존 값에 1을 더한 id값이 부여된다.
다른 테이블의 기본 키를 참조하는 키를 Foreign Key(외래 키) 라고 한다.
On Delete
Action
ON DELETE
로는 외래 키가 참조하는 기본 키가 삭제되었을 때의 action을 지정할 수 있다.
ON UPDATE
는 기본 키가 수정되었을 때의 action을 지정한다.
cascade
(ON UPDATE
에서 권장): 참조하는 row를 단계적으로 수정/삭제한다.set null
: 참조하는 키의 값을 null로 설정한다.no action
: 아무 행동도 취하지 않는다.set default
: 참조하는 키의 값을 기본값으로 설정한다.restrict
(ON DELETE
에서 권장): 수정/삭제 대상 row를 참조하는 row가 있으면 수정/삭제가 불가하다.
기본 키 및 외래 키 설정
PRIMARY KEY (`id`),
FOREIGN KEY (`department`)
REFERENCES `departments`(`id`) ON DELETE CASCADE
위 구문은 테이블 생성 시 기본 키와 외래 키를 설정한다.
외래 키 설정 시 참조하는 테이블의 column 명이 같을 경우,
REFERENCES `departments` ON DELETE CASCADE
위와 같이 column 명을 생략 가능하다.
id
column을 기본 키로 지정하고, department
column을 departments
테이블의 id
column을 참조하는 외래 키로 지정한다.
참고문헌
-
Kweb 준회원 스터디 강의 자료
-
Database System Concepts, 7th Edition (Silberschatz, Korth, Sudarshan)