Database
여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터 집합
여러 정보들을 저장하여 운영할 수 있는 공용 데이터 묶음
특징
- 실시간 접근성 : 실시간 처리에 의한 응답이 가능
- 계속적인 변화 : 새로운 데이터의 삽입, 갱신, 삭제를 통해 항상 최신 데이터를 유지
- 동시 공용 : 여러 사용자가 같은 내용의 데이터를 동시에 이용할 수 있어야 함
- 내용에 의한 참조 : 데이터를 참조할 때 물리적 주소가 아닌 요구하는 데이터의 값으로 참조
Oracle과 MySQL
- Oracle : 대용량 처리에 적합하고 Unix, Linux 등에서 사용하며 DB 관리자 별도
- MySQL : 중소량의 데이터 처리에 적합하고, PC, UNIX 시스템에서 사용하며 보통 개발자가 DB를 관리함
제약사항(Constraint)
Not NULL, UNIQUE, Primary Key, Foreign Key, DEFAULT, CHECK
튜닝
DB 구조나 DB 자체, 운영체제 등을 조정해 DB 시스템의 성능 향상하는 작업
| 1단계 : DB설계 튜닝 | DB설계단계에서 성능 고려해 설계 | 반정규화, 분산 파일 배치 |
| 2단계 : DBMS 튜닝 | 성능 고려해 메모리나 블록 크기 지정 | Buffer 크기, Cache 크기 |
| 3단계 : SQL 튜닝 | SQL 작성 시 성능 고려 | Hash, Join |
SQL
구조화 질의어로 DDL, DML, DCL과 같은 DB용 질의 언어 일종으로 DB 사용할 때 DB에 접근할 수 있는 언어
언어
| DDL (Data Definition L) |
데이터 구조의 생성, 업데이트 , 삭제를 위한 언어 | CREATE, DROP, ALTER |
| DML (Data Manipulation L) |
데이터의 검색, 등록, 업데이트, 삭제를 위한 언어 | SELECT, INSERT, UPDATE, DELETE |
| DCL (Data Control L) |
데이터를 보호하고 관리하는 목적으로 사용하는 언어 | GRANT, REVOKE |
| TCL (Transaction Control L) |
논리적인 작업의 단위를 묶어 DML에 의해 조작된 결과를 트랜잭션별로 제어하는 명령어 |
COMMIT, ROLLBACK, SAVEPOINT |
COMMIT
명령에 의해 수행된 결과를 저장하고 정상적으로 완료되었다고 알리는 것
ROLLBACK
DB조작 작업이 비정상적으로 종료되었을 때 원래 상태로 복구하는 것
SAVEPOINT
모든 연산을 취소하지 않고 정해진 부분으로 되돌리고 싶을 때 사용하는 것
GRANT
DB 사용자에게 사용 권한 부여
REVOKE
DB 사용자에게 사용 권한 회수
UNION과 UNION ALL
- UNION : 중복되는 레코드를 제거함
- UNION ALL : 중복되는 레코드도 함께 보여줌
DBMS
RDBMS와 NOSQL
- 둘의 가장 큰 차이점은 관계형과 비 관계형
- RDBMS
- 엄격한 스키마에 따라 테이블에 저장되어 명확한 데이터 구조 보장하고, 데이터 중복을 최소화할 수 있음
- 관계로 인해 시스템 복잡도를 고려해 구조화해야 함
- NOSQL(Not-Only SQL)
- RDBMS의 데이터가 커짐에 따라 관계가 복잡해져, 이를 극복하기 위해 등장해 보통 비정형 데이터를 저장함
- 스키마나 관계가 존재하지 않고, Key-Value 형태로 데이터 관리
- 주로 변경이 적고, 탐색을 주로 하는 막대한 양의 데이터를 다룰 때 유용하기 때문에 트랜잭션을 지원할 필요가 없음
- 스키마가 없어서 유연하고 복잡한 관계가 없다는 장점
- 기존 SQL DB는 주로 Scale-Up(수직적 향상, 성능의 확장)으로 확장성을 가졌지만, NOSQL은 Scale-Out(수평적 확장, 장비의 대수 증가)으로 확장성을 가짐
- 데이터를 업데이트할 때, 자유롭게 데이터 추가가 가능하여 중복 저장이 될 수 있기 때문에 데이터 관리 필요
- MongoDB
- MySQL과 같이 서버-클라이언트 방식으로 설치하여 사용
- Json 형태의 도큐먼트 형식으로 값 저장
- Redis
- 인메모리 DB로 데이터를 메모리에 저장하고 관리하기 때문에 성능이 좋음
- 데이터를 유한하게 저장하여 캐시 등과 같이 데이터의 저장 기한이 있고 빠른 성능이 필요할 때 사용
- Key-Value 스토어로 값 저장
스키마
DB의 전체적인 구조와 제약조건에 대해 기술한 것
무결성
데이터의 정확성, 일관성, 유효성이 유지되는 것
무결성이 유지되어야 DB에 저장된 데이터와 현실 세계의 실제값이 일치하는지 신뢰할 수 있기 때문에 유지해야 함
종류
| 개체 무결성 | 릴레이션에서 기본키를 구성하는 속성은 NULL값이나 중복값이 될 수 없음 |
| 참조 무결성 | 릴레이션은 참조할 수 없는 외래키 값을 가질 수 없음 |
| 도메인 무결성 | 특정 속성의 값이 그 속성이 정의된 도메인 값이여야 함 |
| NULL 무결성 | 특정 속성값에 NULL이 올 수 없다는 조건이 주어진 경우, 그 속성값은 NULL이 될 수 없음 |
| 키 무결성 | 한 테이블에는 최소한 하나의 키가 존재해야함 |
| 고유 무결성 | 특정 속성에 대해 고유한 값을 가지도록 조건을 정한 경우, 그 값은 고유해야함 |
KEY
| 기본 키(Primary Key) | 테이블을 구분할 수 있는 고유한 컬럼으로 UNIQUE와 NOT NULL의 특징을 가짐 |
| 후보 키(Cardidate Key) | 테이블을 구성하는 컬럼 중 유일하게 식별할 수 있는 컬럼 |
| 대체 키(Alternate Key) | 후보키에서 기본키를 뺀 모든 후보키 |
| 외래 키(Foregin Key) | 관계를 맺고 있는 다른 릴레이션의 기본 키를 그대로 참조하는 속성의 집합 |
ER 모델
Entity-Relation Model로 개체와 속성, 관계로 기술하는 데이터 모델
- 개체 : 개별적으로 구별될 수 있는 것
- 속성 : 각 개체가 가질 수 있는 정보들
- 관계 : 두 개 이상의 개체 사이의 연관성
INDEX
DB 테이블의 검색 속도를 향상하기 위한 자료구조
- 장점 : 테이블 검색과 정렬 속도를 향상할 수 있음
- 단점 : 새로운 값을 추가하거나 삭제할 때 인덱스를 수정해야 하기 때문에 속도가 느려질 수 있음
- 생성 시 고려 사항
- 데이터의 유일성이 높을수록, 범위가 넓을수록 인덱스 효율 상승
- NULL이 적은 칼럼이 인덱스 효율 좋음
- 데이터가 적을수록 인덱스 효율 낮음
자료구조
- B+ Tree
- 이진트리를 확장해 자식 노드가 2개 이상인 B- Tree 구조를 개선시킨 자료구조
- 리프 노드에만 Key와 data를 함께 저장하고, 리프 노드 간에 Pointer로 연결해(LinkedList) 순차 검색 용이
- 장점
- 리프 노드를 제외하고 데이터를 담지 않기 때문에 메모리 더 확보 가능
- Full-Scan시, 리프 노드에 모든 데이터가 있어서 한 번의 선형 탐색만 진행하면 되므로 B- Tree에 비해 빠름
- 시간 복잡도 : O(logn)
B- Tree
모든 노드에 데이터 저장 가능 / Full-Scan시 모든 노드 탐색해야 함
B+ Tree
리프 노드에만 데이터 저장 가능 / Full-Scan시 리프 노드에서 선형 탐색으로 가능
- Hash Table
- Key-Value로 데이터를 저장하는 자료구조 중 하나로 빠른 데이터 검색이 필요할 때 사용
- Key값을 해시함수를 이용해 고유한 index를 생성하고, 그 index에 저장된 값을 꺼내옴
- 부등호와 같은 연속적인 데이터를 위한 순차 검색 불가능(해시값이 하나라도 달라지면 완전 다른 해시값 생성하기 때문에)
- 예를 들어, "app"으로 시작하는 모든 데이터를 검색하기 위한 쿼리문을 사용하기엔 힘듦
- 그래서, 보통 DB인덱스는 B+ Tree형식을 일반적으로 사용
- 시간 복잡도: O(1)
JOIN
두 개 이상의 테이블에서 조건에 맞는 데이터를 추출하기 위해 사용하는 방법
종류
| INNER JOIN | 두 개 이상의 테이블에서 공통된 요소를 찾는 교집합과 같음 |
| OUTER JOIN | 두 개 이상의 테이블에서 속하는 모든 요소를 찾는 합집합과 같음 |
| LEFT JOIN | 두 개 이상의 테이블에서 FROM에 속하는 부분을 찾는 집합 |
| RIGHT JOIN | 두 개 이상의 테이블에서 FROM과 JOIN하는 테이블에 속하는 부분을 찾는 집합 |
| CROSS JOIN | 모든 경우의 수를 모두 표현한 집합으로 곱집합과 같음 |
| SELF JOIN | 자기 자신과 자기 자신을 조인 |
정규화
관계형 DB설계에서 중복을 최소화해 데이터를 구조화하는 방법
DB설계 시 불필요한 데이터 중복으로 공간이 낭비되거나 이상현상이 발생할 수 있기 때문에 정규화 과정 필요
이상 현상
| 삽입 이상 | 튜플을 삽입할 때 불필요한 데이터도 함께 삽입해야하는 현상 |
| 삭제 이상 | 튜플을 삭제할 때 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상 |
| 갱신 이상 | 튜플을 수정할 때 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상 |
정규화 방법
- 제1 정규형 : 모든 속성이 원자 값을 가지도록 분해
- 제2 정규형 : 제1 정규형을 만족시키고 기본키가 다중 칼럼인 경우 기본키 중 특정 칼럼에만 종속된 칼럼이 없어야 함(부분 함수 종속성 제거)
- 부분 함수 종속성 제거
- 학생, 나이, 전공이 있을 때 나이는 학생에만 종속적이기 때문에, 학생-나이, 학생-전공으로 분리
- 제3 정규형 : 제2 정규형을 만족시키고 이행적 함수 종속 관계 제거
- BCNF 정규형 : 제3 정규형을 만족시키고 모든 결정자가 후보 키가 되도록 분해
이행적 함수 종속
X, Y, Z에 대해 X가 Y이고, Y가 Z이면 X는 Z라는 것이 성립하는데, 이때 Z가 X에 이행적 함수 종속되었다고 함
그래서 제3 정규형은 X→Y→Z가 성립할 때, 이를 X→Y, Y→Z로 분리하는 과정
결정자
X에 따라 Y값이 달라지고 X를 알면 Y도 바로 식별할 수 있을 때, Y는 X에 함수적 종속되었다고 함
이때 X를 결정자, Y를 종속 자라고 함
반 정규화
DB의 성능 향상을 위해 데이터 중복을 허용하고, JOIN을 줄이는 DB 성능 향상 방법
데이터를 호출할 때 여러 테이블을 불러서 JOIN 하게 되면 비용이 많이 들기 때문에 반 정규화 실행
트랜잭션
데이터의 상태를 변화시키기 위해 한꺼번에 모두 수행되어야 하는 작업의 단위
특징(ACID)
| 원자성(Atomicity) | 트랜잭션에 포함된 작업은 DB에 모두 반영되거나 모두 반영되지 않아야 함 |
| 일관성(Consistency) | 트랜잭션을 수행하기 전과 후의 DB는 항상 일관된 상태를 유지해야 함 |
| 독립성(Isolation) | 둘 이상의 트랜잭션이 동시에 병행되고 있을 때, 다른 트랜잭션의 연산에 끼어들 수 없음 |
| 지속성(Durability) | 트랜잭션이 성공적으로 완료되었을 경우 결과는 영구적으로 반영되어야 함 |
병행 제어
둘 이상의 트랜잭션을 수행했을 때 발생하는 문제점 극복하기 위해 제어하는 과정
DB의 일관성을 유지하고, DB 공유를 최대화하고, 사용자에 대한 응답 시간을 최소화하는 목적
병행 제어 문제점
- 갱신 내용 손실 : 동시에 하나의 데이터가 갱신될 때 하나의 갱신이 누락되는 경우
- 현황 파악 오류 : 하나의 데이터 갱신이 끝나지 않은 시점에서 다른 트랜잭션이 해당 데이터 조회하는 경우
- 모순성 : 두 트랜잭션이 동시에 실행될 때 DB가 일관성 없는 모순된 상태로 남는 경우
- 연쇄 복귀 : 두 트랜잭션이 하나의 레코드를 갱신할 때 하나의 트랜잭션이 롤백하면 다른 트랜잭션도 롤백되는 경우
병행 처리 기법
- Locking 기법
- 하나의 트랜잭션이 데이터를 액세스 하는 동안 다른 트랜잭션이 액세스 하지 못하게 Lock을 거는 방법
- 액세스를 마친 후 Lock을 해제하고 다른 트랜잭션이 액세스
- 교착상태가 발생할 수 있음
- Time Stamp 순서화
- 시스템에 도착한 순서대로 Time Stamp를 부여하여 순서대로 실행되도록 제어하는 직렬화 기법
- 낙관적 기법
- 읽기 전용 트랜잭션이 대부분일 때 병행 제어를 하지 않아도 되는 이점을 활용
- 트랜잭션을 수행하는 동안 어떠한 검사도 하지 않고 트랜잭션 종료 시 일괄적으로 검사하는 기법
- 다중 버전 기법
- Time Stamp 기법을 이용해 버전을 부여하여 관리하는 기법
- 충돌이 발생할 경우 복귀를 수행하지만, 이로 인해 연쇄 복귀가 발생할 가능성이 있음
데드락(교착상태)
2개 이상의 트랜잭션이 실행되지 못하고 서로 무한정 대기하는 상태
DB에서는 트랜잭션들의 동시성을 제어하기 위해 Locking기법을 사용하는데, Locking기법의 부작용이 Dead Lock
동시성 제어
다중 사용자 환경에서 둘 이상의 트랜잭션이 동시에 수행될 때 일관성을 해치지 않도록 데이터 접근 제어
원인
트랜잭션 1이 Table 1을 업데이트한 후 Table 2를 업데이트하려고 하는데, 이미 트랜잭션 2가 Table 2에 업데이트 작업을 진행 중일 경우 대기 후 처리합니다. 트랜잭션 2가 Table 2를 업데이트한 후 Table 1을 업데이트하려고 하는데, 이미 트랜잭션 1이 Table 1 업데이트 작업을 진행 중일 경우 대기하는데, 이 과정과 같이 서로 완료될 때까지 대기하여 결국 아무것도 완료가 되지 않는 상태가 되는 것
방지
- 트랜잭션 자주 커밋
- 같은 순서로 테이블에 접근
해결 방안
Dead Lock이 감지되면 둘 중 하나의 트랜잭션을 강제 ROLLBACK 한 후 나머지 트랜잭션을 완료시킨 후 ROLLBACK 한 트랜잭션을 다시 실행
클러스터링과 리플리케이션
클러스터링
- 여러 DB를 권한에 따라 수평적인 구조로 구축하는 방식으로 DB서버를 다중화하는 것
- 하나의 노드가 죽어도 다른 노드가 살아있어 시스템을 장애 없이 운영 가능
- 동기 방식으로 여러 노드들 간의 데이터 동기화하는데 시간이 필요해 리플리케이션에 비해 쓰기 성능이 낮음
리플리케이션
- 여러 DB를 권한에 따라 수직적인 구조로 구축하는 방식으로 DB서버와 저장소를 같이 다중화하는 것
- 비동기 방식으로 데이터가 동기화되어 지연 시간이 거의 없음
- 노드들 간의 데이터가 동기화되지 않아 일관성 있는 데이터를 얻지 못할 수 있음
'Study > Tech Interview' 카테고리의 다른 글
| Algorithm - 진수 변환, 거듭 제곱, 에라토스테네스의 체 (0) | 2021.05.23 |
|---|---|
| Algorithm - DFS, BFS, 다익스트라, 이진 탐색 (0) | 2021.05.22 |
| Algorithm - Two Pointer, 순열과 조합, 최소 공배수와 최대 공약수 (0) | 2021.05.21 |
| Algorithm - Sorting Algorithm, 반복문과 재귀 함수 (0) | 2021.05.18 |
| Algorithm - Heap Sort (0) | 2021.05.18 |
댓글