구조도
응용프로그램(ex. node.js) |
DBMS(ex. MySQL) |
데이터베이스 |
엔터티
- 사람, 장소, 물건, 개념 등 여러 개의 속성을 지닌 명사
- 회원(엔터티) - 이름, 아이디, 주소, 전화번호(속성)
릴레이션
- 데이터베이스에서 정보를 구분하여 저장하는 기본 단위
- 릴레이션 = 테이블(관계형 데이터베이스) = 컬렉션(NoSQL)
데이터베이스의 종류
- 관계형 데이터 베이스(ex. MySQL) - 레코드, 테이블, 데이터베이스
- NoSQL 데이터베이스(ex. MongoDB) - 도큐먼트, 컬렉션, 데이터베이스
- 레코드가 쌓여서 테이블이 되고, 테이블이 쌓여서 데이터베이스가 된다.
도메인
- 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합
- 성별(속성) - {남, 여}(도메인)
필드와 레코드
- 속성 = 필드
- 테이블에 쌓이는 행 단위 데이터 = 레코드 = 튜플
필드 타입 (MySQL 기준)
숫자타입
- TINYINT
- SMALLINT
- MEDIUMINT
- INT
- BIGINT
날짜타입
- 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
- 테이블 생성시 선언한 길이로 고정
- 길이는 0 ~ 255
- 레코드 저장시 무조건 선언한 길이 값으로 고정해서 저장한다.
- VARCHAR
- 가변 길이 문자열
- 길이는 0 ~ 65535
- 입력된 데이터에 따라 용량을 가변시켜 저장한다.
- 즉, 지정된 형태에 따라 저장된 CHAR의 경우 검색에 유리하며, 검색을 별로 하지 않고 유동적 길이를 가진 데이터는 VARCHAR로 저장하는 것이 좋다.
<큰 데이터 저장할 때 쓰는 두 가지 타입>
- TEXT
- 큰 문자열 저장에 쓰며 주로 게시판 본문을 저장할 때 사용
- BLOB
- 이미지, 동영상 등 큰 데이터 저장에 쓰이나, 보통 아마존 이미지 호스팅 서비스인 S3를 이용하는 등 서버에 파일을 올리고 파일에 관한 경로를 VARCHAR로 저장
<문자열을 열거한 두 가지 타입>
- ENUM
- SET
관계
1:1 관계
- 테이블을 두 개의 테이블로 나눠 테이블 구조를 더 이해하기 쉽게 만들어 준다.
1:N 관계
- 한 유저당 여러 개 상품을 장바구니에 넣을 수도 있고 하나도 넣지 않을 수도 있다.
- 한 개체가 다른 많은 개체를 포함하는 관계이다.
N:M 관계
- 학생과 강의의 관계를 생각해 보았을 때 학생도 강의를 많이 들을 수 있고 강의도 여러 명의 학생을 포함할 수 있다.
- N:M은 테이블 두 개를 직접적으로 연결해서 구축하진 않고 1:N, 1:M이라는 관계를 갖는 테이블 두 개로 나눠서 설정한다.
키
- 테이블 간 관계를 더 명확히하고 테이블 자체의 인덱스를 위해 설정된 장치
- 기본키, 외래키, 후보키, 슈퍼키, 대체키가 있다.
- 유일성: 중복되는 값이 없음
- 최소성: 필드를 조합하지 않고 최소 필드만 써서 키를 형성할 수 있음
기본키
- 유일성과 최소성을 만족하는 키
- 기본키는 자연키 혹은 인조키 중에 골라 설정
- 자연키
- 중복된 값들을 제외하며 중복되지 않는 것을 자연스레 뽑다가 나오는 키
- 언젠가는 변하는 속성을 가짐
- 인조키
- 인위적으로 생성한 키
- 유저 테이블을 만든다고 가정했을 때 인위적으로 유저 아이디를 부여하면 이로 인해 고유 식별자가 생겨남
- 오라클은 sequence를 MySQL은 auto increment 등을 설정
- 자연키와는 대조적으로 변하지 않는 속성을 가지므로 보통 기본키는 인조키로 설정함
- 자연키
외래키
- 다른 테이블의 기본키를 그대로 참조하는 값으로 개체와의 관계를 식별하는데 사용
- 외래키는 중복이 가능
후보키
- 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족
대체키
- 후보키가 두 개 이상일 경우 어느 하나를 기본키로 정하고 남은 후보키들
슈퍼키
- 각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키
ERD와 정규화 과정
- ERD(Entity Relationship Diagram)
- 데이터베이스를 구축할 때 가장 기초적인 뼈대 역할
- 릴레이션 간의 관계들을 정의한 것.
정규화 과정
- 정규화 과정
- 릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나서 이를 해결하거나,
- 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정
- 데이터 베이스 이상 현상
- 회원이 한 개의 등급을 가져야 하는데 세개의 등급을 갖거나 삭제할 때 필요한 데이터가 같이 삭제되고,
- 데이터를 삽입해야 하는데 하나의 필드 값이 NULL이 되면 안 되어서 삽입하기 어려운 현상
- 정규화 과정은 정규형 원칙을 기반으로 정규형을 만들어가는 과정이며, 정규화된 정도는 정규형(NF, Normal Form)으로 표현한다.
- 기본 정규형인 제1정규형, 제2정규형, 제3정규형, 보이스/코드 정규형이 있고 고급 정규형인 제4정규형, 제5정규형이 있다.
정규형 원칙
- 같은 의미를 표현하는 릴레이션이지만 좀 더 좋은 구조로 만들어야 하고, 자료의 중복성은 감소해야 하고, 독립적인 관계는 별개의 릴레이션으로 표현해야 하며, 각각의 릴레이션은 독립적인 표현이 가능해야 하는 것을 말한다.
제1정규형
- 릴레이션의 모든 도메인이 더 이상 분해될 수 없는 원자 값만으로 구성되어야 한다.
제2정규형
- 릴레이션이 제1정규형이며 부분 함수의 종속성을 제거한 형태를 말한다.
- 부분 함수의 종속성 제거 - 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속적인 것
제3정규형
- 제2정규형이고 기본키가 아닌 모든 속성이 이행적 함수 종속(transitive FD)을 만족하지 않는 상태를 말한다.
- 이행적 함수 종속 - A -> B와 B->C가 존재하면 논리적으로 A->C가 성립하는데, 이때 집합 C가 집합 A에 이행적으로 함수 종속이 되었다고 한다.
보이스/코드 정규형
- 제3정규형이고, 결정자가 후보키가 아닌 함수 종속 관계를 제거하여 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태를 말한다.
- 결정자 - 함수 종속 관계에서 특정 종속자를 결정짓는 요소, 'X->Y'일 때 X는 결정자, Y는 종속자이다.
트랜잭션과 무결성
트랜잭션
- 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위
- 데이터베이스에 접근하는 방법은 쿼리이므로, 즉 여러 개의 쿼리들을 하나로 묶는 단위를 말한다.
- 특징 - 원자성, 일관성, 독립성, 지속성(ACID)
무결성
- 데이터의 정확성, 일관성, 유효성을 유지하는 것
- 무결성이 유지되면? 데이터베이스에 저장된 데이터 값과 그 값에 해당하는 현실 세계의 실제 값이 일치하는지에 대한 신뢰가 생긴다.
무결성의 종류
개체 무결성 | 기본키로 선택된 필드는 빈 값을 허용하지 않는다. |
참조 무결성 | 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 한다. |
고유 무결성 | 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성 값은 모두 고유한 값을 가진다. |
NULL 무결성 | 특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다. |
데이터베이스의 종류
관계형 데이터베이스
- 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스
- SQL이라는 언어를 써서 조작한다.
- MySQL, PostgreSQL, 오라클, SQL Server, MSSQL 등
NoSQL 데이터베이스
- NoSQL(Not Only SQL)이라는 슬로건에서 생겨난 데이터베이스
- SQL을 사용하지 않는 데이터베이스를 말한다.
- MongoDB, redis 등
인덱스
인덱스 필요성
테이블 안에 찾고자 하는 데이터를 빠르게 찾을 수 있다.
B-트리
인덱스는 보통 B-트리라는 자료 구조로 이루어져 있다.
이는 루트 노드, 리프 노드, 루트노드와 리프 노드 사이에 있는 브랜치 노드로 나뉜다.
인덱스가 효율적인 이유와 대수확장성
인덱스 만드는 방법
인덱스 최적화 기법
조인의 종류