Database(DB)

  1. 데이터베이스를 왜 배워야 하는가?
  • 회사에서 가장 중요하게 생각하는게 뭘까?
  • 유튜브 소스코드를 얻었다 쳐보자
  1. SQL(Structured Query Language)
  • ANSI SQL
  1. DBMS(Database Management System)
  • MySQL 설치하기(PostgreSQL, MSSQL, Oracle, MariaDB, SQLite 등등)
  • 다운로드 링크
  • 5버전 8버전 다 괜찮음

테이블 만들기

  • 데이터를 저장하는 2차원 공간
  • 엑셀이라고 생각해보자(row, column)

정규화(Normalization)

  • 테이블을 정규형으로 만드는 걸 정규화라고 한다.
  • 엑셀이라고 생각하면 안된다
  • 삽입, 수정, 삭제 시 문제가 없나 생각해보기

1NF

한 컬럼에 값이 두 개...?

이름 전화번호
제로초 010-1234-5678
010-2345-6789

가로로 배치..?
이름 전화번호1 전화번호2
제로초 010-1234-5678 010-2345-6789

이름 전화번호
제로초 010-1234-5678
제로초 010-2345-6789
  • 나중에 JOIN으로 합침

ERD

관계 생각하기

  1. 1:N(일대다)
  2. 1:1(일대일)
  3. M:N(다대다)

실전링크

Key

  • PK(기본키, primary key)
  • FK(외래키, foreign key)
  • 복합키(Composite Key, 두 개 이상의 키가 기본키가 되는 것)

동명이인이 생겨버리면...?

아이디 이름 전화번호
1 제로초 010-1234-5678
1 제로초 010-2345-6789
2 제로초 010-3456-7890

아이디는 중복되면 안 됨

아이디(PK) 이름
1 제로초
2 제로초
아이디(PK) 사원아이디(FK) 전화번호
1 1 010-1234-5678
2 1 010-2345-6789
3 2 010-3456-7890

2NF

  • 복합키 모두에 종속되는지 체크
이름 언어 전화번호
제로초 JS 010-1234-5678
제로초 TS 010-1234-5678
제로초 JAVA 010-1234-5678

3NF

  • Key가 아닌 컬럼들의 종속관계(A -> B, B -> C이고 A -> C인 관계가 있다면 A -> B, B -> C 두 개로 분리)
아이디 이름 소속 서비스
1 제로초 네이버웹툰
2 원초 카카오톡
3 투초 배민1
  • 왜 소속이 아니라 서비스가 키?

이름 소속 서비스
제로초 네이버웹툰
원초 카카오톡
투초 배민1

역정규화(Denormalization)

  • JOIN, JOIN, JOIN
  • 삽입, 수정, 삭제가 일어나지 않는 경우
  • 서비스 따라 판단

CREATE TABLE

DDL(Definition), DQL(Query), DML(Manipulation), DCL(Control), TCL(Transaction)

fk 없는 거 먼저 만들기

CREATE TABLE `zerocho`.`role` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(10) NOT NULL,
  `min_salary` INT UNSIGNED NOT NULL DEFAULT 2500,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `name_UNIQUE` (`name` ASC) VISIBLE,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4;

ON UPDATE, ON DELETE 옵션들 기억하기

CREATE TABLE `employee` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `email` varchar(100) NOT NULL,
  `salary` int unsigned NOT NULL,
  `team` varchar(20) NOT NULL,
  `quit_date` date DEFAULT NULL,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
  `role_id` int unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email_UNIQUE` (`email`),
  KEY `employee_role_fk_idx` (`role_id`),
  CONSTRAINT `employee_role_fk` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='사원테이블'

ALTER, DROP, TRUNCATE

UPDATE

UPDATE employee SET salary = ? WHERE name = ?

INSERT INTO

INSERT INTO employee (name, salary, team) VALUES ("원초", 5000, "개발"), ("투초", 4000, "디자인")

DELETE

  • hard delete
DELETE FROM employee WHERE id = ?
  • soft delete
UPDATE employee SET quit_date = NOW() WHERE id = ?
SELECt * FROM employee WHERE quit_date IS NULL

SELECT

SELECT * FROM employee

where

SELECT * FROM employee WHERE name = ?

projection

SELECT id, name FROM employee WHERE name = ?
  • AS
SELECT id as no, name FROM employee WHERE name = ?

order

SELECT id as no, name FROM employee WHERE name = ? ORDER BY salary

limit

SELECT id as no, name FROM employee WHERE name = ? ORDER BY salary LIMIT 10

group

SELECT AVG(salary) FROM employee WHERE name = ? GROUP BY team

count, avg, min, max, sum

JOIN

INNER JOIN

LEFT/RIGHT JOIN

FULL OUTER JOIN

INDEX

(a, b, c) index

CREATE INDEX

TRANSACTION

ATM

START TRANSACTION;
COMMIT;
ROLLBACK;

ACID

Stored Procedure

CREATE PROCEDURE procedure_name
AS
sql_statement
GO;

EXEC procedure_name;

ETC

NoSQL

MongoDB, Redis

replication

LOCK

sharding

CAP theorem