일정한 규칙, 규약을 통해 구조화되어 저장되는 데이터의 모음
사람, 장소, 물건, 사건 등 여러 개의 속성을 지닌 명사.
약한 엔터티와 강한 엔터티
A와 B 중 A가 혼자서 존재하지 못하고 B의 존재 여부에 따라 종속적이면 A는 약하고 B는 강하다.
데이터베이스에서 정보를 구분하여 저장하는 기본 단위. 엔터티에 관한 정보를 릴레이션 단위로 구분.
테이블과 컬렉션
관계형 DB와 NoSQL DB로 나뉜다. 이 중 MySQL의 구조는 레코드 - 테이블 - 데이터베이스로 이루어져 있고 NoSQL인 MongoDB 데이터베이스는 도큐먼트 - 컬렉션 - 데이터베이스로 이루어져있다.
릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보.
ex.핸드폰 - 기종 , 크기, 색깔 등이 있다.
릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합을 말한다.
ex.성별 - 남, 여
회원이란 엔터티는 member라는 테이블로 속성인 이름, 아이디 등의 필드를 가진다.
ex.
CREATE TABLE member(
id VARCHAR(255)
password VARCHAR(255)
PRIMARY KEY (id)
필드 타입
필드는 타입을 갖는다. 이름은 문자열이고 전화번호는 숫자이다.
숫자 타입
TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 등이 있다.
날짜 타입
DATE, DATETIME, TIMESTAMP 등이 존재.
문자 타입
CHAR, VARCAHR, TEXT, BLOB, ENUM, SET이 있다.
여러개의 테이블에서 서로의 관계가 정의되어 있다. 이러한 관계를 화살표로 나타낸다.
1:1 관계
회원 - 회원 ID
1:N 관계
회원 - 장바구니
N:M 관계
학생 - 강의
테이블 관계를 좀 더 명확하게 하기 위해 자체 인덱스를 위해 설정된 장치로 기본키, 외래키, 후보키, 슈퍼키, 대체키가 있다.
기본키
유일성과 최소성을 만족하는 키
외래키
다른 테이블의 기본키를 그대로 참조하는 값으로 개체와의 관계를 식별하는 데 사용한다. (중복 가능)
후보키
기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족하는 키.
대체키
후보키가 두 개 이상일 경우 어느 하나를 기본키로 지정하고 남은 후보키들을 말한다.
슈퍼키
각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키.
데이터베이스를 구축할 때 가장 기초적인 뼈대 역할을 하며, 릴레이션 간의 관계들을 정의한 것이다. 만약 서비스를 구축한다면 가장 먼저 신경 써야 할 부분이며 이 부분을 신경 쓰지 않고 서비스를 구축한다면 단단하지 않은 골조로 건물을 짓는 것이다.
잘못된 종속 관계로 데이터베이스 이상 현상이 일어나서 이를 해결하거나, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정이다.
제1정규형
모든 도메인이 더 이상 분해될 수 없는 원자 값만으로 구성되어야 합니다.
제2정규형
릴레이션이 제1정규형이며 부분 함수의 종속성을 제거한 형태를 말한다.
제3정규형
제2정규형이고 기본키가 아닌 모든 속성이 이행적 함수 종속을 만족하지 않는 상태
보이스/코드 정규형
제3정규형이고, 결정자가 후보키가 아닌 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태
데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위. 특징으로는 원자성, 일관성, 독립성, 지속성이 있다.(ACID 특징)
원자성
트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징.
커밋과 롤백
커밋은 여러 쿼리가 성공적으로 처리 되었다고 확정하는 명령어.
롤백은 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일.
트랜잭션 전파
트랜잭션을 수행할 때 커넥션 단위로 수행하기 때문에 커넥션 객체를 넘겨서 수행해야 합니다. 이를 넘겨서 수행하지 않고 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 트랜잭션 전파라고 한다.
일관성
허용된 방식으로만 데이터를 변경해야 하는 것을 의미한다.
격리성
트랜잭션 수행 시 서로 끼어들지 못하는 것을 말한다. 서로 격리되어 순차적으로 실행되는 것처럼 작동해야한다.
격리 수준에 따라 발생하는 현상에는 팬텀 리드, 반복 가능하지 않는 조회, 더티 리드 가 있다.
격리 수준
SERIALIZABLE 순차적으로 진행시키는 것.
REPEATABLE_READ 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수없도록 막아주지만 새로운 행을 추가하는 것은 막지 않는다.
READ_COMMITTED 가장 많이 사용되는 격리 수준. 커밋 완료된 데이터에 대해서만 조회를 허용.
READ_UNCOMMITTED 가장 낮은 격리수준. 커밋되기 이전에 노출되는 문제가 있지만 가장 빠르다.
지속성
성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.
데이터의 정확성, 일관성, 유효성을 유지하는 것을 말한다.
MySQL
가장 많이 호환되며 사용하는 데이터베이스
C,C++로 만들어졌으며 MyISAM 인덱스 압축 기술, B-트리 기반의 인덱스, 스레드 기반의 메모리 할당 시스템, 매우 빠른 조인, 최대 64개의 인덱스를 제공한다.
PostgreSQL
디스크 조각이 차지하는 영역을 회수할 수 있는 장치인 VACUUM이 특징이다. 최대 테이블 크기는 32TB이며 JSON을 이용해서 접근할 수 있다.
MongoDB
JSON을 통해 데이터에 접근할 수 있고, Binary JSON 형태로 데이터가 저장되며 키-값 데이터 모델에서 확장된 도큐먼트 기반의 데이터베이스이다.
데이터를 빠르게 찾을 수 있는 하나의 장치
MySQL
클리스터형 인덱스와 세컨더리 인덱스가 있으며 CREATE INDEX 명령어를 기반으로 만들면 세컨더리 인덱스를 만들 수 있다.
MongoDB
도큐먼트를 만들면 자동으로 ObjectID가 형성되며, 해당 키가 기본키로 설정된다.
인덱스는 비용이다.
항상 테스팅하라
복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순이다.
내부 조인: 왼쪽 오른쪽 테이블의 두 행이 모두 일치하는. 행이 있는 부분만 표기
왼쪽 조인: 왼쪽 테이블의 모든 행이 결과 테이블에 표기
오른쪽 조인: 오른쪽 테이블의 모든 행이 결과 테이블에 표기
합집합 조인: 두 개의 테이블을 기반으로 조인 조건에 만족하지 않는 행까지 모두 표기
중첩 루프 조인
중첩 for 문과 같은 원리로 조건에 맞는 조인을 하는 방법이며, 랜덤 접근에 대한 비용이 많이 증가하므로 대용량 테이블에서는 사용하지 않는다.
정렬 병합 조인
각각의 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 이후에 조인 작업을 수행하는 조인입니다.
해시 조인
해시 테이블을 기반으로 조인하는 방법.
해시조인은 빌드 단계, 프로브 단계로 나뉜다.
빌드 단계는 입력 테이블 중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계이다.
프로브 단계는 레코드를 읽기 시작하며, 각 레코드에서 일치하는 레코드를 찾아서 결괏값으로 반환한다.
이를 통해 각 테이블은 한 번씩만 읽게 되어 중첩해서 두 개의 테이블을 읽는 중첩 루프 조인보다 보통은 성능이 더 좋다.