4.1 데이터베이스의 기본
e.g., DBMS: MySQL / 응용프로그램: node.js
엔티티: 여러 개의 속성을 가진 명사. e.g., user: name, email, password, ... -> user: 엔티티, name, email, password, ...: 속성
엔티티 A가 혼자서는 존재하지 못하고 B의 존재 여부에 따라 종속적인 상태일 때 A를 약한 엔티티, B를 강한 엔티티라고 함.
릴레이션: 데이터베이스에서 정보를 구분하여 저장하는 기본 단위. RDBM에서는 테이블, NoSQL에서는 컬렉션이라고 함.
※ RDBMS - MySQL: 레코드 - 테이블 - 데이터베이스
※ NoSQL - MongoDB: 도큐먼트 - 컬렉션 - 데이터베이스
속성: 릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보.
도메인: 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합. 예를 들어, 성별이라는 속성이 있다면 이 속성의 도메인은 {남, 여}
필드와 레코드:
관계: 1:1 관계, 1:N 관계, N:M 관계
키: 기본키, 외래키, 후보키, 슈퍼키, 대체키
기본키: PK(Primary Key). 유일성, 최소성.
외래키: FK(Foreign Key).
4.2 ERD와 정규화 과정
예제: 영업부서의 ERD
1. 영업 사원은 0 ~ n명의 고객을 관리
2. 고객은 0 ~ n개의 주문 가능
3. 주문에는 1 ~ n개의 상품이 들어감
정규화 과정: 릴레이션 간의 잘못된 종속 관계로 인해 데이터베이스 이상 현상이 일어나서 이를 해결하거나, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정. 정규형 원칙을 기반으로 정규형을 만들어가는 과정이며, 정규화된 정도는 정규형(NF)으로 표현. 기본 정규형인 제 1, 2, 3 정규형, 보이스/코드 정규형이 있고 고급 정규형인 제 4, 5 정규형이 있음.
- 제 1 정규형: 릴레이션의 모든 도메인이 더 이상 분해될 수 없는 원자 값 만으로 구성
유저번호 | 유저ID | 수강명 | 성취도 |
1 | 김 가 | JS, 프론트 | 90%, 10% |
2 | 이 가 | Java, 백 | 7%, 8% |
↓↓↓
유저번호 | 유저ID | 수강명 | 성취도 |
1 | 김 가 | JS | 90% |
1 | 김 가 | 프론트 | 10% |
2 | 이 가 | Java | 7% |
2 | 이 가 | 백 | 8% |
- 제 2 정규형: 제 1 정규형 + 부분 함수의 종속성 제거
유저번호 | 유저ID | 수강명 | 성취도 |
1 | 김 가 | JS | 90% |
1 | 김 가 | 프론트 | 10% |
2 | 이 가 | Java | 7% |
2 | 이 가 | 백 | 8% |
↓↓↓
유저번호 | 유저ID |
1 | 김 가 |
2 | 이 가 |
유저ID | 수강명 | 성취도 |
김 가 | JS | 90% |
김 가 | 프론트 | 10% |
이 가 | Java | 7% |
이 가 | 백 | 8% |
- 제 3 정규형: 제 2 정규형 + 기본키가 아닌 모든 속성이 이행적 함수 종속(transitive FD)을 만족하지 않는 상태.
※ 이행적 함수 종속(transitive FD)
- A -> B와 B -> C가 존재할 때, 논리적으로 A -> C가 성립. 이때, C가 A에 이행적으로 함수 종속이 되었다고 함.
유저 ID | 등급 | 할인율 |
김 가 | 플래티넘 | 30% |
이 가 | 다이아 | 50% |
백 가 | 마스터 | 70% |
↓↓↓
유저 ID | 등급 |
김 가 | 플래티넘 |
이 가 | 다이아 |
백 가 | 마스터 |
등급 | 할인율 |
플래티넘 | 30% |
다이아 | 50% |
마스터 | 70% |
- 보이스 / 코드 정규형: 제 3정규형 + 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키인 상태
4.3 트랜잭션과 무결성
트랜잭션: 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위. 즉, 여러 개의 쿼리들을 하나로 묶는 단위. ACID 특징이 있다.(원자성, 일관성, 독립성, 지속성)
- 원자성: 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장.
- 커밋: 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것을 말함. "커밋이 수행되었다"는 "하나의 트랜잭션이 성공적으로 수행되었다"를 의미.
- 롤백: 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일.
- 일관성: 허용된 방식으로만 데이터를 변경해야 하는 것을 의미.
- 격리성: 트랜잭션 수행 시 서로 끼어들지 못하는 것. 격리성은 여러 개의 격리 수준으로 나뉘어 격리성을 보장.
팬텀리드: 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
반복 가능하지 않은 조회: 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우
더티리드: 반복 가능하지 않은 조회와 유사하며 한 트랜잭션이 실행중일 때 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 행의 데이터를 읽을 수 있을 때 발생.
격리 수준
- SERIALIZABLE: 트랜잭션을 순차적으로 진행시키는 것. 여러 트랜잭션이 동시에 같은 행에 접근할 수 없음. 교착 상태가 일어날 확률도 많고 가장 성능이 떨어지는 격리 수준.
- REPEATABLE_READ: 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않는 격리 수준
- READ_COMMITED: 가장 많이 사용되는 격리 수준. 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없음. 즉, 커밋 완료된 데이터에 대해서만 조회를 허용. 하지만, 한 트랜잭션이 접근한 행을 다른 트랜잭션이 수행할 수 있음.
- READ_UNCOMMITED: 가장 낮은 격리 수준. 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있지만 가장 빠름. 이는 데이터 무결성을 위해 되도록이면 사용하지 않는 것이 이상적이나, 거대한 양의 데이터를 어림잡아 집계하는 데는 사용하면 좋음.
- 지속성: 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미. 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 뜻하며, 데이터베이스는 이를 위해 체크섬, 저널링, 롤백 등의 기능을 제공
- 체크섬: 중복 검사의 한 형태. 오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순한 방법
- 저널링: 파일 시스템 또는 데이터베이스 시스템에 변경 사항을 반영(커밋)하기 전에 로깅하는 것. 트랜잭션 등 변경 사항에 대한 로그를 남기는 것.
무결성
- 개체 무결성: 기본키로 선택된 필드는 빈 값을 허용하지 않음
- 참조 무결성: 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지
- 고유 무결성: 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우, 그 속성 값은 모두 고유한 값을 가짐.
- NULL 무결성: NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다는 제약 조건.
4.4 데이터베이스의 종류
RDBMS(관계형 데이터베이스): MySQL, PostgreSQL
NoSQL 데이터베이스: MongoDB, redis
4.5 인덱스: 데이터를 빠르게 찾을 수 있는 하나의 장치. 보통 B-트리로 이루어져 있음.
인덱스 최적화 기법
1. 인덱스는 비용이다
- 인덱스는 인덱스 리스트, 컬렉션 순으로 두 번 탐색하도록 강요하며 읽기 비용이 든다. 또한, 컬렉션이 수정되었을 때 인덱스도 수정되어야 한다. 그렇기 때문에 쿼리에 있는 필드에 인덱스를 무작정 설정하는 것이 답이 아니다.
2. 항상 테스팅하라
- 인덱스 최적화 기법은 서비스에서 사용하는 객체의 깊이, 테이블의 양 등 서비스 특징에 따라 달라진다. 그렇기 때문에 항상 테스팅 하는 것이 중요하다.
3. 복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순이다.
※ 카디널리티: 유니크한 값의 정도.
4.6 조인의 종류
조인: 하나의 테이블이 아닌 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것.
4.7 조인의 원리: 중첩 루프 조인, 정렬 병합 조인, 해시 조인
중첩 루프 조인: NLJ. Nested Loop Join. 중첩 for문과 같은 원리로 조건에 맞는 조인을 하는 방법. 랜덤 접근에 대한 비용이 많이 증가하므로 대용량의 테이블에서는 사용하지 않음.
정렬 병합 조인: 각각의 테이블을 조인할 필드 기준으로 입력하고 정렬이 끝난 이후에 조인 작업을 수행. 조인할 때 쓸 적절한 인덱스가 없고 대용량의 테이블을 조인하고 조인 조건으로 <, > 등 범위 비교 연산자가 있을 때 사용.
해시 조인: 해시 테이블을 기반으로 조인하는 방법.
'면접을 위한 CS 전공지식 노트' 카테고리의 다른 글
면접을 위한 CS 전공지식 노트: 5장 자료구조 (0) | 2022.06.24 |
---|---|
면접을 위한 CS 전공지식 노트: 3장 운영체제 (0) | 2022.06.22 |
면접을 위한 CS 전공지식 노트: 2장 네트워크 (0) | 2022.06.22 |
면접을 위한 CS 전공지식 노트: 1장 디자인 패턴과 프로그래밍 패러다임 (0) | 2022.06.21 |