데이터베이스(DB, DataBase): 일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음
DBMS(DataBase Management System): 해당 데이터베이스를 제어, 관리하는 통합 시스템
데이터베이스 안에 있는데이터들은 특정 DBMS마다 정의된 쿼리 언어를 통해 삽입, 삭제, 수정, 조회를 수행할 수 있다.
DBMS - MySQL, 응용 프로그램 - Node.js, php
응용 프로그램에서 해당 데이터베이스 안에 있는 데이터를 끄집어내 해당 데이터 관련 로직을 구축할 수 있는 것
엔터티(Entity)는 사람, 장소, 물건, 사건, 개념등여러 개의 속성을 지닌 명사를 의미한다.
A가 혼자서는 존재하지 못하고 B에 존재 여부에 따라 종속적이다
-> A는 약한 엔터티, B는 강한 엔터티
릴레이션(relation)은 데이터베이스에서 정보를구분하여 저장하는 기본단위이다.
엔터티에 관한 데이터를 데이터베이스는 릴레이션 하나에 담아 관리한다.
릴레이션을 관계형 데이터베이스에서는 '테이블'이라고 하며
NoSQL 데이터베이스에서는 '컬렉션'이라고 한다.
데이터베이스의 종류는 크게 관계형 데이터베이스(예-MySQL)와 NoSQL 데이터베이스(예-MongoDB)로 나뉜다.
MySQL의 구조: 레코드 - 테이블 - 데이터베이스
MongoDB의 구조: 도큐먼트 - 컬렉션 - 데이터베이스
속성(attribute)은 릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보이다.
서비스의 요구사항을 기반으로 관리해야 할 필요가 있는 속성들만 엔터티의 속성이 된다.
도메인(domain)이란 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합을 말한다. (예 - 성별이라는 속성은 {남, 여}만 가질 수 있다.)
엔터티, 릴레이션, 속성, 도메인을 기반으로 데이터베이스에서 필드와 레코드로 구성된 테이블을 만들 수 있다.
엔터티: 회원
테이블: member
속성: 이름, 아이디, ...
필드: name, ID, address...
테이블에 쌓이는 행 단위의 데이터 -> 레코드(튜플)
필드는 타입을 갖는다.
대표적으로 숫자, 날짜, 문자 타입이 존재한다.
숫자 타입
- TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
날짜 타입
- DATE, DATETIME, TIMESTAMP
- DATE: 날짜 부분은 있지만 시간 부분은 없는 값
(1000-01-01 ~ 9999-12-31, 3바이트)
- DATETIME: 날짜 및 시간 부분을 모두 포함하는 값
(1000-01-01 00:00:00 ~ 9999-12-31 23:59:59, 8바이트)
- TIMESTAMP: 날짜 및 시간 부분을 모두 포함하는 값
(1970-01-01 00:00:01 ~ 2038-01-19 03:14:07, 4바이트)
문자 타입
- CHAR, VARCHAR, TEXT, BLOB, ENUM, SET
- CHAR와 VARCHAR: 수를 입력해서 몇 자까지 입력할지 정한다. 예를 들어 CHAR(30)이라면 최대 30글자까지 입력할 수 있다.
CHAR - 고정 길이 문자열, 0~255
VARCHAR - 가변 길이 문자열, 0~65,535
(예 - 10글자의 이메일을 저장할 경우 10글자에 해당하는 바이트 + 길이기록용 1바이트로 저장)
유동적이지 않은 길이를 가진 데이터다 -> CHAR 사용
유동적인 길이를 가진 데이터다 -> VARCHAR 사용
- TEXT와 BLOB: 큰 데이터를 저장할 때 쓰는 타입
TEXT - 큰 문자열 저장, 게시판의 본문을 저자할 때 쓰임
BLOB - 이미지, 동영상 등 큰 데이터 저장, 그러나 보통 아마존의 이미지 호스팅 서비스인 S3를 이용하는 등 서버에 파일을 올리고 파일에 관한 경로를 VARCHAR로 저장한다.
- ENUM과 SET: 문자열을 열거한 타입
ENUM - ENUM('x-small', 'small', 'medium', 'large', 'x-large') 형태로 쓰인다. 이 중 하나만 선택하는 단일 선택만 가능
리스트에 없는 값을 입력하면 빈 문자열이 삽입된다.
최대 65,535개의 요소들을 넣을 수 있다.
(이점 - 값이 0, 1 등으로 매피되어 메모리를 적게 사용)
SET - 여러 개의 데이터 선택 가능, 비트 단위 연산을 할 수 있다.
최대 64개의 요소를 집어넣을 수 있다.
ENUM이나 SET을 쓸 경우 공간적으로 이점을 볼 수 있지만 애플리케이션의 수정에 따라 데이터베이스의 ENUM이나 SET에서 정의한 목록을 수정해야한다는 단점이 있다.
데이터베이스에는 여러 개의 테이블이 있고 이들의 관계는 관계 화살표로 나타낼 수 있다.




키: 테이블 자체의 인덱스를 위해 설정된 장치
기본키, 외래키, 후보키, 슈퍼키, 대체키
유일성: 중복되는 값이 없다
최소성: 필드를 조합하지 않고 최소 필드만 써서 키를 형성할 수 있다
기본키(Primary Key, PK): 유일성과 최소성을 만족한다.
-> 복합키는 기본키가 될 수 없다.
기본키는 자연키 또는 인조키 중에 골라 설정한다.
자연키
: 중복된 값들을 제외하며 중복되지 않은 것을 '자연스레' 뽑다가 나오는 키
자연키는 언젠가는 변하는 속성을 가진다.
인조키
: 오라클의 sequence, MySQL의 auto increment 등 인위적으로 생성한 키
자연키와는 대조적으로 변하지 않는다.
따라서 보통 기본키는 인조키로 설정한다.
외래키(Foreign Key, FK): 다른 테이블의 기본키를 그대로 참조하는 값
개체와의 관계를 식별하는 데 사용한다.
외래키는 중복이어도 괜찮다.
후보키(candidate key): 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족한다.
대체키(alternate key): 후보키가 두 개 이상일 경우 어느 하나를 기본키로 지정하고 남은 후보키를 말한다.
슈퍼키(super key): 각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키이다.