백엔드 직무에서 데이터베이스가 굉장히 중요하다는 말을 많이 들었고, 부트캠프하면서도 느꼈었던 부분이다. 그렇기 때문에 좀더 집중해서 들어야겠다는 마음이 많이 들었다.
이 강의에서는 관계형 데이터베이스와 SQL문을 실무에서 많이 쓰인다고 강조했다.
그러면 데이터베이스 강의로 넘어가보자.
< 데이터베이스 >
데이터 베이스개론
-Database(DB): 전자적으로 저장되고 사용되는 관련있는 데이터(같은 출처나 같은 목적, 같은 서비스 아래서 생성되는 데이터)들의 조직화(내가 찾고자하는 데이터를 빠르게 찾아주고 불필요한 데이터가 중복되는 것을 제거, 데이터의 불일치를 예방해줌)된 집합.
DBMS(Database management systems)
: 사용자에게 DB를 정의하고 만들고 관리하는 기능을 제공하는 소프트웨어 시스템.(MySQL이 여기에 해당됨)=> DB를 정의하다 보면 부가적인 데이터가 발생함. 이것을 'metadata=catalog'라 부르고 이 또한 DBMS를 통해 저장/관리된다.
Database system: database + DBMS + 연관된 어플리케이션들
=> 줄여서 DB라고도 부름.
DB 시스템 흐름
사용자/운영자 => 어플리케이션 프로그램 =DB에 접근하기 위한 쿼리(요청)=> DB Manager가 쿼리 파악 => Metadata 확인 => 실제 데이터 확인 => 다시 어플리케이션 프로그램에 돌려줌.
data models:
DB 구조를 기술하는 데 사용될 수 있는 개념들이 모인 집합
=> DB 구조(데이터 유형,데이터 관계, 제약사항 등)를 추상화해서 표현할 수 있는 수단을 제공 => 모델링
data model은 여러 종류가 있다. DB에서 읽고 쓰기 위한 기본적인 동작들도 포함됨.
< data models 분류 >
< 데이터베이스 구조 >
=> Three-schema architecture:
database system을 구축하는 architecture 중의 하나.
유저 어플리케이션으로부터 물리적인 database를 분리시키는 목적. 각각의 level마다 Schema가 정의되어 있다.
< Database 언어 >
DDL,SDL(relational DB에서는 parameter가 대신해줌),VDL,DML => 다 종합해서 SQL이 역할을 대신해준다.
< 관계형 데이터베이스 >
: 우선 Domain을 정의함 => Domain은 어떤 값으로 이루어진 집합.
동일한 Domain이 같은 relation에서 중복되서 사용되어도 역할(목적)이 다를 수 있다.
역할을 표시하기 위해서 relational Data model에서느 attribute 개념이 등장.
relational Data model에서 tuple을 table로 표시.
attribute: relation에서 부여된 역할
tuple: attribute 각각의 하나하나로 이루어진 리스트 => 이 전체를 relation(table이라고 함)
(정리) : relational data model
domain => set of atomic(더이상 나누어질 수 없는 값) values
domain name => domain 이름
attribute => domain이 relation에서 맡은 역할 이름.
tuple => 각 attribute의 값으로 이루어진 리스트, 일부 값은 Null일 수 있다.
relation => set of tuples
relation name => relation의 이름
relation Schema: relation의 구조를 나타냄.
relation의 이름과 attributes 리스트로 표기됨.
attributes와 관련된 제약사항들도 표시함.
degree of relation: relation Schema에서 attribute의 수
< relational database의 정의 >
relational data model에 기반하여 구조화된 database.
relational database는 여러개의 relation으로 구성된다.
relational database schema: relation Schemas set + integrity constraints set
< relation의 특징들 >
relation은 중복된 tuple을 가질 수 없다.
relation의 tuple을 식별하기 위해 attribute의 부분집합을 key로 설정함. -> id를 통해서 각 tuple을 유니크하게 구분하여 식별할 수 있음.
relation에서 tuple의 순서는 중요하지 않다.
하나의 relation에서 attribute의 이름은 중복되면 안 된다.
하나의 tuple에서 attribute의 순서는 중요하지 않다.
attribute는 atomic(더 이상 나누어질 수 없는)해야 한다.
Null의 의미 => 중의적인 표현이기 때문에 최대한 지양함
값이 존재하지 않는다.
값이 존재하나 아직 그 값이 무엇인지 알지 못한다.
해당 사항과 관련이 없다.
< Keys >
superkey: relation에서 tuple을 유니크하게 식별할 수 있는 attributes set(attribute들의 집합.어떤 것인지 참조하면 알 수 있다.)
candidate key: 어느 한 attribute라도 제거하면 유니크하게 tuple들을 식별할 수 없는 superkey. => key or minimal superkey라고 부름./ 독립적으로 하나하나가 tuple들을 식별할 수 없을 때.
primary key: relation에서 tuple들을 유니크하게 식별하기 위해 선택된 candidate key. -> 보통 attribute의 숫자가 적은 것을 primary key로 선택함.
unique key: primary key로 선택되지 못한 candidate 키들. alternate key
foreign key: 다른 relation의 PK를 참조하는 attribute들의 집합.
< constraints >
뜻 : relational database의 relation들이 언제나 항상 지켜줘야하는 제약사항.
-종류-
implicit constraints : relational data model 자체가 가지는 constraints / relation은 중복되는 tuple을 가질 수 없다. / relation 내에서는 같은 이름의 attribute를 가질 수 없다.
schema-based constraints : 주로 DDL을 통해 Schema에 직접 명시할 수 있는 constraints. / explicit constraints.
1)domain constraints : attribute의 value는 해당 attribute의 domain에 속한 value여야 함.
2)key constraints: 서로 다른 tuple은 같은 value의 key를 가질 수 없다.
3)Null value constraints: attribute가 Not null로 명시됐다면 Null을 값으로 가질 수 없다.
4)entity integrity constraints: primary keysms value에 Null을 가질 수 없다. 여러 PK가 Null을 가지면 tuple을 유니크하게 식별이 불가능하기 때문.
5)referential integrity constraints: FK와 PK와 도메인이 같아야 하고, PK에 없는 값들을 FK가 값으로 가질 수 없다.
constraints가 있는 이유는 데이터베이스가 일치된 형태로 존재하고 데이터의 일관성을 보장하기 위해.
백엔드 업무 시 service단에서 이 constraints를 위반하면 에러를 주는데 이를 잘 핸들링해야 한다.
< SQL로 데이터 처리하기 >
< SQL 주요 용어 >
relational data model => SQL
< database 정리하기 >
:SHOW DATABASES 입력하면 MySQL 안에 어떤 DB 있는지 알려줌.
:CREATE DATABASE 원하는 이름 - 데이터베이스가 생긴다.
:SELECT database() - 지금 사용하겠다고 선택한 DB를 확인해 볼 수 있음. 처음에는 NULL이 뜸.
:USE 사용하고자하는DB이름 - DB 설정.
:DROP DATABASE DB이름 - DB 삭제문법
< table 정의하기 >
: Primary key키에 밑줄(언더바)을 해줌 => 그 테이블의 각각의 tuple을 식별하기 위해서 사용되는 key.
<테이블 만드는 예시>
create table DEPARTMENT (
이름 데이터타입 각 설정들) => 각 줄은 각각의 attribute를 나타냄.
<attribute data type: 숫자>
-정수(1~8byte) :TINYINT~MEDIUMINT
-부동소수점 방식: 실수를 저장할 때 사용. 고정 소수점 방식에 비해 정확하지 않음.
-고정소수점 방식: 실수를 정확하게 저장할 때 사용(DECIMAL or NUMERIC):MySQL에서는 두개가 동일함.
ex) DECIMAL(5,2) -> (Precision: 전체숫자에서 몇자리인지(전체숫자가 몇개인지), Scale: 소수점이하 몇자리까지 표현할지)
)
< attribute data type: 문자열 >
-고정크기 문자열:CHAR(n) => 최대 몇개의 '문자'를 가지는 문자열을 저장할지를 지정. 저장될 문자열의 길이가 최대길이보다 작으면 나머지는 space로 채워서 저장함.
MySQL에서 시간적인 성능이 CHAR가 더 좋다. 가변적인 것은 VACHAR 권장.문자열 크기가 고정된것은 CHAR 권장.
-가변크기 문자열:VARCHAR(n) =>최대 몇개의 '문자'를 가지는 문자열을 저장할지를 지정. 저장될 문자열의 길이만큼만 저장.
-사이즈가 큰 문자열: MEDIUMTEXT,LONGTEXT를 고려.
< attribute data type: 날짜와 시간 >
-날짜:년/월/일 => DATE
-시간: 시/분/초 => TIME
-날짜와 시간: 날짜+시간 => DATETIME, TIMESTAMP-> Time-zone이 반영됨(UTC로 저장됨)
< 그 외 Data type >
-byte-string(보안과 관련해 암호화키를 byte-string으로 저장.) => BINARY /VARRINARY, BLOB TYPE
-boolean type -> true/false를 저장. => MySQL에는 없어서 TINYINT(0과 1로 저장)로 대체.
-위치관련 => 위치관련 정보를 저장 => GEOMETRY...etc
-JSON => JSON 형태의 데이터를 저장.
{"name":"messi","age":38} => JSON
*UNIQUE KEY의 제약사항
-UNIQUE로 지정된 attribute(s)는 중복된 값을 가질 수 없다. NULL은 중복허용 할 수도 있음(MySQL은 허용함)
-UNIQUE KEY 선언하는 방법은 PRIMARY KEY랑 동일함.
*NOT NULL 제약사항
-해당 attribute NULL을 값으로 가질 수 없음.
=> 작성법: Attribute Name, TYPE, Not Null 적어준다.
(보통 NOT NULL과 UNIQUE를 같이 많이 씀)
attribute DEFAULT: attribute의 default값을 정의할 때 사용.
새로운 tuple을 저장할 때 해당 attribute에 대한 값이 없다면 default로 저장.
-> DEFAULT '저장값' 으로 작성.
CHECK constraint => attribute의 값을 제한하고 싶을 때 사용.
reference-option
1.CASCADE => 참조값 삭제/변경 그대로 반영.
2.SET NULL => 참조값 삭제/변경 NULL로 변경.
3.RESTRICT => 참조값 삭제/변경 NULL 금지
4.NO ACTION => RESTRICT와 유사 (MySQL에서는 3,4번 똑같음)
: 한 트랜잭션 안에 여러개의 SQL문이 존재 => 실행되는 동안에는 참조값이 삭제/변경 허용. 하지만 트랜잭션 끝나고 나서는 constraint 위반하면 No action
5.SET DEFAULT => => 참조값 삭제변경되면 default값으로 변경
(MySQL에서 지원하는 문법은 1,2,3번)
constraint 이름 명시하기
: 이름을 붙이면 어떤 constraint를 위반했는지 쉽게 파악이 가능.
constraint를 삭제하고 싶을 때 해당이름으로 삭제 가능. =>constraint 위반 시에 위반 내용을 바로 명시적으로 확인이 가능.
*ALTER TABLE table이름 변경내용
:table이 생성되고 난 뒤에 table schema의 변경이 필요할 때 사용됨.
종류가 많다.
(중요) ALTER TABLE은 서비스 중인 table의 schema를 변경하는 것이라면 변경작업 때문에 서비스의 백엔드에 영향이 없을지 검토 후에 변경하는 것이 중요.
=> 서비스를 안정적으로 유지하면서 개발을 잘해야 함.
DROP TABLE table의이름 => table 삭제할 때에 사용.
중요점 => 만들 때는 서비스의 스펙이나 데이터 일관성, 편의성, 확장성 등등을 종합적으로 고려하여 DB 스키마 적절히 정의하는 것이 중요.
시니어 개발자와 주니어 개발자를 가르는 큰 점이 DB를 얼마나 잘 설계하는가 이다.
< SQL로 데이터 생성/수정/삭제하기 >
1. 데이터 생성하기