일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음
DBMS(DataBase Management System)
: 데이터베이스를 제어, 관리하는 통합 시스템 EX) Oracle, MySQL, MariaDB
: Node.js나 php와 같은 응용프로그램에서 데이터베이스 안의 데이터에 접근하려면 MySQL과 같은 DBMS를 거쳐야 함
데이터베이스 안에 있는 데이터들은 특정 DBMS 마다 정의된 쿼리 언어(query language)를 통해 삽입(INSERT
), 삭제(DELETE
), 수정(UPDATE
), 조회(SELECT
) 등을 수행
DB는 실시간 접근과 동시 공유가 가능
여러 개의 속성을 지닌 명사
EX) 회원 엔티티 ↔ 이름, 아이디, 주소, 전화번호 속성
서비스의 요구사항에 맞춰 속성이 정해짐
EX) 회원 엔티티에 주소 속성이 서비스 요구사항에 무관한 속성이면 제거해도 가능
약한 엔티티와 강한 엔티티로 나뉨
↔ A가 B에 종속적(B의 존재 여부에 따라 존재)이라면 A는 약한 엔티티, B는 강한 엔티티
EX) 방은 건물이 있어야 존재하므로 방은 약한 엔티티, 건물은 강한 엔티티
🤔잠깐 스키마(schema))란
변수들의 이름+타입+조건
데이터베이스에 저장되는 데이터 구조와 제약조건을 정의한 것
테이블의 형식 혹른 골격구조를 정의
🤔잠깐 속성과 필드의 차이
What is the difference between a field and an attribute
속성은 엔티티의 특징 그 자체를 의미, 필드는 테이블에서 특정 데이터가 저장되는 위치를 믜미
즉 속성은 관계형 데이터베이스의 관계/테이블에 대해 이야기할 때 필드가 된다.
EX) 회원 엔티티 ↔ member 테이블
이름, 아이디 속성 ↔ name, ID, address 필드
책 엔티티를 정의하고 table을 만들어보자
1. 책의 속성 및 필드 이름 정의
이름(title), 저자의 아이디(author_id), 출판년도(publishing_year), 장르(genre), 생성일시(created_at), 업데이트 일시(updated_at)
2. 타입 정의(MySQL 기준, 데이터베이스마다 차이가 존재)
속성 | 타입(type) |
---|---|
책의 아이디 | INT |
책의 제목 | VARCHAR(255) |
책의 저자 아이디 | INT |
책의 출판년도 | VARCHAR(255) |
책의 장르 | VARCHAR(255) |
생성 일시 | DATETIME |
업데이트 일시 | DATETIME |
위의 내용을 MySQL로 구현
CREATE TABLE book{
id INT NOT NULL AUTO_INCREMENT, // null 허용 안 함, 오름차순
title VARCHAR(255),
author_id INT,
publishing_year VARCHAR(255),
genre VARCHAR(255),
created_at DATETIME,
updated_at DATETIME,
PRIMARY KeY (id) // 기본키 설정
}
필드는 타입을 갖으며 DMBS마다 다름. 여기서는 MySQL을 기준
1. 숫자 타입
타입 | 용량(바이트) | 최솟값(부호 있음) | 최솟값(부호 없음) | 최댓값(부호 없음) | 최댓값(부호 있음) |
---|---|---|---|---|---|
TINYINT | 1 | -128 | 0 | 127 | 255 |
SMALLINT | 2 | -32768 | 0 | 32767 | 65535 |
MEDIUMINT | 3 | -8388608 | 0 | 8388607 | 16777215 |
INT | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
BIGINT | 8 | -263 | 0 | 263-1 | 264-1 |
2. 날짜 타입
타입 | 설명 | 범위 | 용량 |
---|---|---|---|
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바이트 |
3. 문자 타입
타입 | 설명 | 길이 | 특징 |
---|---|---|---|
CHAR | - 테이블을 생성할 때 선언한 길이로 고정 - 레코드를 저장할 때 무조건 선언한 길이 값으로 '고정'해서 저장됨 | 0 ~ 255 사이의 값 | 검색에 유리 |
VARCHAR | - 가변 길이 문자열 - 입력된 데이터에 따라 용량을 가변시켜 저장 EX) VARCHAR(10000)으로 선언해도 10글자의 이메일을 저장할 경우 10글자에 해당하는 바이트 + 길이기록용 1바이트로 저장 | 0~65,535 사이의 값 | 검색을 별로 하지 않고 유동적인 길이를 가진 데이터를 저장할 때 좋음 |
타입 | 설명 |
---|---|
TEXT | - 큰 문자열 저장에 사용 - 게시판의 본문을 저장할 때 사용 |
BLOB | - 이미지, 동영상 등 큰 데이터 저장에 사용 → 보통 아마존의 이미지 호스팅 서비스 S3를 사용 (서버에 파일을 올리고 파일에 관한 경로를 VARCHAR로 저장) |
타입 | 설명 | 특징 |
---|---|---|
ENUM | - ENUM(데이터1, 데이터2,...,) 형태 - 단일 선택만 가능 - ENUM 리스트에 없는 잘못된 값을 삽입하면 빈 문자열이 대신 삽입 | - 데이터값이 0,1 등으로 매핑되어 메모리 적게 사용 가능 - 최대 65,535개의 요소 넣을 수 있음 |
SET | - ENUM과 비슷하지만 여러 개의 데이터 선택 가능 | - 비트 단위의 연산 가능 - 최대 64개의 요소를 넣을 수 있음 |
CREATE TABLE shirts ( name VARCHAR(40), size ENUM('x-small', 'small', 'medium', 'large', 'x-large') // 이런 식으로 열거 ); // mysql 적용 mysql> SELECT column_type FROM information_schema.columns WHERE table_name='shirts' AND column_name='size'; +----------------------------------------------------+ | column_type | +----------------------------------------------------+ | enum('x-small','small','medium','large','x-large') | +----------------------------------------------------+ 1 row in set (0.00 sec)
1:1 관계
개체 A의 각 개체 인스턴스가 개체 B의 개체 인스턴스 하나와 관계를 맺을 수 있고,
개체 B의 각 개체 인스턴스도 개체 A의 개체 인스턴스 하나와 관계를 맺을 수 있음
EX) User당 User Email은 한 개씩 존재
1:N 관계
개체 A의 각 개체 인스턴스가 개체 B의 개체 인스턴스 다수와 관계를 맺을 수 있지만,
개체 B의 각 개체 인스턴스는 개체 A의 개체 인스턴스 하나와 관계를 맺을 수 있음
EX) 한 User 당 여러 개의 상품을 장바구니에 넣을 경우 (물론 하나도 넣지 않는 0개의 경우)
N:M 관계
개체 A의 각 개체 인스턴스가 개체 B의 개체 인스턴스 다수와 관계를 맺을 수 있고,
개체 B의 각 개체 인스턴스도 개체 A의 개체 인스턴스 다수와 관계를 맺을 수 있음
EX) 학생도 강의를 많이 들을 수 있고 강의도 여러 명의 학생을 포함할 수 있음
이때 N:M은 table 2개를 직접 연결해서 구축하지 않고 1:N, 1:M 관계를 갖는 테이블 2개로 나눠서 설정
🤔 잠깐 유일성과 최소성
- 유일성(uniqueness)
: 하나의 릴레이션에서 모든 투플은 서로 다른 키 값을 가져야 함(중복되는 값은 없음)
: 키를 통해 각각의 투플을 구분 할 수 있어야 함 (identifier, ID)
– 최소성(minimality)
: 꼭 필요한 최소한의 속성들로만 키를 구성
: 필드를 조합하지 않고 최소 필드만 써서 키를 형성할 수 있는 것
EX) 고객 아이디는 중복되지 않으므로 고객 아이디 필드는 기본키가 될 수 있다.
{고객 아이디, 고객 이름}이라는 복합키를 기본키로 설정할 수 있지만 최소성을 만족하지 않는다.
EX) 고객 table의 기본키인 고객아이디가 주문 table의 주문고객이라는 외래키로 설정
면접을 위한 CS 전공지식 노트
데이터 베이스 이해하기
Structure of Database Management System
데이터 모델링에서 Entity, Instance, Attribute의 의미
What is RDBMS
모두의 SQL